From 7b0ee8fc493206b0f6c6ab1ed3377b447b6e1c1a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=89=9B=E6=B6=9B=E6=9D=B0?= <47921896@qq.com>
Date: Mon, 20 Jul 2020 22:10:13 +0800
Subject: [PATCH 1/7] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96Mybatis?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"Java\345\237\272\347\241\200.md" | 0
MyBatis.md | 8 ++++++++
2 files changed, 8 insertions(+)
create mode 100644 "Java\345\237\272\347\241\200.md"
create mode 100644 MyBatis.md
diff --git "a/Java\345\237\272\347\241\200.md" "b/Java\345\237\272\347\241\200.md"
new file mode 100644
index 0000000..e69de29
diff --git a/MyBatis.md b/MyBatis.md
new file mode 100644
index 0000000..9ebff7d
--- /dev/null
+++ b/MyBatis.md
@@ -0,0 +1,8 @@
+## 1、简介
+
+### 1.1 什么时Mybatis
+
+- MyBatis 是一款优秀的**持久层框架**
+- 它支持自定义 SQL、存储过程以及高级映射。
+- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
+- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
\ No newline at end of file
From 6e9407544223cdc9d00fa9b974f2ef393012fa18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=89=9B=E6=B6=9B=E6=9D=B0?= <47921896@qq.com>
Date: Wed, 22 Jul 2020 00:24:25 +0800
Subject: [PATCH 2/7] =?UTF-8?q?Mybatis=E7=9B=B8=E5=85=B3=E5=86=85=E5=AE=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
MyBatis.md | 1017 ++++++++++++++++++++++++++++++-
img/image-20200721001618071.png | Bin 0 -> 116329 bytes
img/image-20200721001820172.png | Bin 0 -> 119119 bytes
img/image-20200721094729350.png | Bin 0 -> 22525 bytes
img/image-20200721094904775.png | Bin 0 -> 26210 bytes
img/image-20200721103712102.png | Bin 0 -> 7085 bytes
img/image-20200721105223623.png | Bin 0 -> 21087 bytes
img/image-20200721141811040.png | Bin 0 -> 31053 bytes
img/image-20200721142618160.png | Bin 0 -> 50463 bytes
img/image-20200721144738626.png | Bin 0 -> 98120 bytes
img/image-20200721145414230.png | Bin 0 -> 134267 bytes
img/image-20200721151611858.png | Bin 0 -> 6770 bytes
img/image-20200721160054479.png | Bin 0 -> 225183 bytes
img/image-20200721161028210.png | Bin 0 -> 1069405 bytes
img/image-20200721172844988.png | Bin 0 -> 27439 bytes
img/image-20200721174410484.png | Bin 0 -> 39649 bytes
img/image-20200721182151906.png | Bin 0 -> 19924 bytes
img/image-20200721182708617.png | Bin 0 -> 93371 bytes
img/image-20200721204124910.png | Bin 0 -> 11218 bytes
img/image-20200721204453532.png | Bin 0 -> 9304 bytes
20 files changed, 1016 insertions(+), 1 deletion(-)
create mode 100644 img/image-20200721001618071.png
create mode 100644 img/image-20200721001820172.png
create mode 100644 img/image-20200721094729350.png
create mode 100644 img/image-20200721094904775.png
create mode 100644 img/image-20200721103712102.png
create mode 100644 img/image-20200721105223623.png
create mode 100644 img/image-20200721141811040.png
create mode 100644 img/image-20200721142618160.png
create mode 100644 img/image-20200721144738626.png
create mode 100644 img/image-20200721145414230.png
create mode 100644 img/image-20200721151611858.png
create mode 100644 img/image-20200721160054479.png
create mode 100644 img/image-20200721161028210.png
create mode 100644 img/image-20200721172844988.png
create mode 100644 img/image-20200721174410484.png
create mode 100644 img/image-20200721182151906.png
create mode 100644 img/image-20200721182708617.png
create mode 100644 img/image-20200721204124910.png
create mode 100644 img/image-20200721204453532.png
diff --git a/MyBatis.md b/MyBatis.md
index 9ebff7d..570f3fc 100644
--- a/MyBatis.md
+++ b/MyBatis.md
@@ -5,4 +5,1019 @@
- MyBatis 是一款优秀的**持久层框架**
- 它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
-- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
\ No newline at end of file
+- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
+
+如何获取Mybatis?
+
+- maven仓库,需要将下面代码置于pom.xml文件中:
+
+ ```xml
+
+ org.mybatis
+ mybatis
+ x.x.x
+
+ ```
+
+### 1.2 持久化
+
+数据持久化
+
+- 持久化就是将程序的数据在持久状态和瞬时状态转化过程
+- 内存:断电即失
+- 数据库(jdbc),io文件持久化
+- 生活中的持久化:冷藏、罐头
+
+**为什么持久化?**
+
+- 有些对象,不能丢失
+- 内存珍贵,不能什么都存放在内存中
+
+### 1.3 持久层
+
+Dao层、Service层、Controller层...
+
+- 完成持久化工作的代码块
+
+### 1.4 为什么需要Mybatis?
+
+- 帮助程序员将数据存入到数据库中
+- 方便
+- 传统JDBC代码复杂 -> 简化 -> 框架
+- 不用Mybatis也可以,用了更容易上手。
+- 优点:
+ - 简单易学:没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习
+ - 灵活: sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
+ - 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离。sql和代码的分离,提高了可维护性。
+ - 提供映射标签,支持对象与数据库的orm字段关系映射
+ - 提供对象关系映射标签,支持对象关系组建维护
+ - 提供xml标签,支持编写动态sql
+
+**最重要一点:使用的人多**
+
+## 2、第一个Mybatis程序
+
+思路:搭建环境 --> 导入Mybatis --> 编写代码 --> 测试
+
+### 2.1 搭建环境
+
+搭建数据库
+
+```mysql
+create table `user`(
+`id` INT(20) NOT NULL PRIMARY KEY,
+`name` VARCHAR(30) DEFAULT NULL,
+`pwd` VARCHAR(30) DEFAULT NULL
+)ENGINE=INNODB DEFAULT CHARSET=utf8;
+
+insert into `user`(`id`,`name`,`pwd`) values (1,'牛二','123456'),(2,'张三','abcdef'),(3,'李四','987654');
+```
+
+新建项目
+
+- 创建maven项目
+
+- 删除src文件夹
+
+- 导入maven等依赖
+
+ ```xml
+
+
+
+ mysql
+ mysql-connector-java
+ 5.1.40
+
+
+
+ org.mybatis
+ mybatis
+ 3.5.5
+
+
+
+ junit
+ junit
+ 4.12
+
+
+ ```
+
+### 2.2 创建一个模块
+
+**配置核心文件**,在resources中创建mybatis-config.xml
+
+
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+**编写MyBatis工具类**
+
+
+
+```java
+public class MybatisUtils {
+ private static SqlsqlSessionFactory sqlsqlSessionFactory;
+ static{
+ try {
+ //使用mybatis第一步获取sqlsqlSessionFactory对象
+ String resource = "mybatis-config.xml";
+ InputStream inputStream = Resources.getResourceAsStream(resource);
+ sqlsqlSessionFactory = new SqlsqlSessionFactoryBuilder().build(inputStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ //获取SqlsqlSession连接
+ public static SqlsqlSession getsqlSession(){
+ return sqlsqlSessionFactory.opensqlSession();
+ }
+
+}
+```
+
+### 2.3 编写代码
+
+**整体架构**
+
+
+
+**实体类**,对应数据库字段,get/set方法,toString方法
+
+```java
+public class User {
+
+ private int id; //id
+ private String name; //姓名
+ private String pwd; //密码
+
+ //构造,有参,无参
+ //set/get
+ //toString()
+
+}
+```
+
+**编写Mapper接口类**
+
+```java
+public interface UserMapper {
+ List getUserList();
+}
+```
+
+**编写Mapper.xml配置文件(写SQL语句)**
+
+```xml
+
+
+
+
+
+```
+
+- namespace 表示 绑定Dao/Mapper接口
+- id 绑定Mapper中的方法
+- resultType 结果集 一个
+- resultMap 结果集 多个
+- parmeterType 参数类型(下面CRUD中的根据ID查找)
+
+**编写测试方法**
+
+```java
+public class UserDaoTest {
+ @Test
+ public void selectUser() {
+ SqlsqlSession sqlSession = MybatisUtils.getsqlSession();
+ //方法一:
+ //List users = sqlSession.selectList("com.niu.dao.UserMapper.selectUser");
+ //方法二:
+ UserMapper mapper = sqlSession.getMapper(UserMapper.class);
+ List users = mapper.getUserList();
+
+ for (User user: users){
+ System.out.println(user);
+ }
+ sqlSession.close();
+ }
+}
+```
+
+**运行结果**
+
+
+
+## 3、MyBatis的CRUD
+
+### 3.1 根据id查询
+
+**编写Mapper接口**
+
+```java
+public interface UserMapper {
+ //获取全部用户
+ List getUserList();
+ //根据id查询
+ User getUserById(int id);
+}
+```
+
+**编写Mapper.xml**
+
+```xml
+
+```
+
+parameterType 为参数类型
+
+**测试用例**
+
+```java
+@Test
+public void selectUserById() {
+ SqlsqlSession sqlSession = MybatisUtils.getsqlSession();
+ UserMapper mapper = sqlSession.getMapper(UserMapper.class);
+ User user = mapper.getUserById(1);
+ System.out.println(user);
+ sqlSession.close();
+}
+```
+
+
+
+### 3.2 增加
+
+****
+
+**编写Mapper接口**
+
+```java
+//增加
+int addUser(User user);
+```
+
+**编写Mapper.xml**
+
+```xml
+
+ insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
+
+```
+
+**测试用例**
+
+```java
+//增删改需要提交事务
+@Test
+public void addUser() {
+ SqlsqlSession sqlsqlSession = MybatisUtils.getsqlSession();
+ UserMapper mapper = sqlsqlSession.getMapper(UserMapper.class);
+ mapper.addUser(new User(4,"ggg","111"));
+ sqlsqlSession.commit();
+ sqlsqlSession.close();
+}
+```
+
+
+
+### 3.3 修改
+
+**编写Mapper接口**
+
+```java
+//修改
+int updateUser(User user);
+```
+
+**编写Mapper.xml**
+
+```xml
+
+ update user set name = #{name},pwd = #{pwd} where id= #{id};
+
+```
+
+**测试用例**
+
+```java
+//增删改需要提交事务
+@Test
+public void updateUser() {
+ SqlSession sqlSession = MybatisUtils.getSession();
+ UserMapper mapper = sqlSession.getMapper(UserMapper.class);
+ mapper.updateUser(new User(4,"gg","1112"));
+ sqlSession.commit();
+ sqlSession.close();
+}
+```
+
+### 3.4 删除
+
+**编写Mapper接口**
+
+```java
+//删除
+int deleteById(int id);
+```
+
+**编写Mapper.xml**
+
+```xml
+
+ delete from user where id = #{id}
+
+```
+
+**测试用例**
+
+```java
+//增删改需要提交事务
+@Test
+public void deleteById() {
+ SqlSession sqlSession = MybatisUtils.getSession();
+ UserMapper mapper = sqlSession.getMapper(UserMapper.class);
+ mapper.deleteById(4);
+ sqlSession.commit();
+ sqlSession.close();
+}
+```
+
+### 3.5 模糊查询
+
+第一种:在Java代码中添加sql通配符
+
+```java
+string wildcardname = “%smi%”;
+list names = mapper.selectlike(wildcardname);
+
+
+```
+
+第二种:在sql语句中拼接通配符,会引起sql注入
+
+```xml
+string wildcardname = “smi”;
+list names = mapper.selectlike(wildcardname);
+
+
+```
+
+## 4、配置解析
+
+4.1
+
+MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
+
+- configuration(配置)
+ - [properties(属性)](https://mybatis.org/mybatis-3/zh/configuration.html#properties)
+ - [settings(设置)](https://mybatis.org/mybatis-3/zh/configuration.html#settings)
+ - [typeAliases(类型别名)](https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases)
+ - [typeHandlers(类型处理器)](https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers)
+ - [objectFactory(对象工厂)](https://mybatis.org/mybatis-3/zh/configuration.html#objectFactory)
+ - [plugins(插件)](https://mybatis.org/mybatis-3/zh/configuration.html#plugins)
+ - environments(环境配置)
+ - environment(环境变量)
+ - transactionManager(事务管理器)
+ - dataSource(数据源)
+ - [databaseIdProvider(数据库厂商标识)](https://mybatis.org/mybatis-3/zh/configuration.html#databaseIdProvider)
+ - [mappers(映射器)](https://mybatis.org/mybatis-3/zh/configuration.html#mappers)
+
+### 4.2 environment(环境变量)
+
+MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
+
+**不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。**
+
+mybatis默认事务管理器 JDBC 连接池:POOLED
+
+### 4.3 properties(属性)
+
+可以通过properties属性来实现引用配置文件
+
+这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
+
+**编写配置文件db.properties**
+
+
+
+**引入配置文件**
+
+
+
+### 4.4 settings(设置)
+
+**类型别名**
+
+```xml
+
+
+
+不写别名:
+
+写了:
+resultType="user"
+```
+
+**也可以指定一个包名**,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
+
+```xml
+
+
+
+```
+
+pojo下的每个实体类,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值。
+
+```java
+@Alias("author")
+public class Author {
+ ...
+}
+```
+
+**开启缓存与懒加载**
+
+| cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true \|false | true |
+| ------------------ | ------------------------------------------------------------ | ------------- | ----- |
+| lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 `fetchType` 属性来覆盖该项的开关状态。 | true \| false | false |
+
+### 4.5 生命周期和作用域
+
+
+
+生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的**并发问题**。
+
+**SqlSessionFactoryBuilder**
+
+- 作用在于创建 SqlSessionFactory,创建成功后,就失去了作用
+- **SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域**(也就是局部方法变量)
+
+**SqlSessionFactory **
+
+- 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象
+- 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
+- 最佳作用域是应用作用域
+- 最简单的就是使用单例模式或者静态单例模式
+
+**SqlSession**
+
+- 可以比作连接池里面的一个连接
+- 作用域是请求或方法作用域
+- 用完之后关闭,否者资源被占用
+
+
+
+## 5、解决属性名和字段名不一致的问题(resultMap)
+
+**实体类修改**
+
+```java
+public class User {
+ private int id;
+ private String name;
+ private String password;
+ ....
+}
+```
+
+测试结果:
+
+
+
+解决办法:
+
+- 起别名:select id,name,pwd ad password from user where id = #{id}
+
+- resultMap 结果集映射
+
+ ```xml
+
+
+
+
+
+
+
+
+ ```
+
+## 6、日志
+
+### 6.1 日志工厂
+
+在db.properties中配置
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### 6.2 Log4j
+
+**导入log4j依赖**
+
+```xml
+
+log4j
+log4j
+1.2.17
+
+```
+
+**创建log4j.properties**
+
+
+
+**然后百度人家写好的配置文件 复制即可**
+
+**最后在db.properties的settings日志配置修改**
+
+```xml
+
+
+
+```
+
+**Log4j使用**
+
+
+
+## 7、分页
+
+**为什么分页?**减少数据处理量
+
+### 7.1 Limit分页
+
+```java
+语法:SELECT * FROM user LIMIT startIndex,pageSize;
+实例:SELECT * FROM user LIMIT 2; #[0,n]
+```
+
+使用Mybatis实现分页,核心SQL
+
+1、接口
+
+```java
+//分页
+List getUserByLimit(Map map);
+```
+
+2、Mapper.xml
+
+```xml
+
+```
+
+3、测试
+
+```java
+@Test
+public void getUserByLimit(){
+ SqlSession sqlSession = MyBatisUtils.getSession();
+ UserMapper mapper = sqlSession.getMapper(UserMapper.class);
+ HashMap map = new HashMap<>();
+ map.put("startIndex",0);
+ map.put("pageSize",2);
+ mapper.getUserByLimit(map);
+}
+```
+
+
+
+### 7.2 RowBounds分页
+
+1、接口
+
+```java
+//RowBounds分页
+List getUserByRowBounds();
+```
+
+2、mapper.xml
+
+```xml
+
+```
+
+3、测试
+
+```java
+@Test
+public void getUserByRowBounds(){
+ SqlSession sqlsession = MyBatisUtils.getSession();
+ //RowBounds实现
+ RowBounds rowBounds = new RowBounds(1, 3);
+ //通过Java代码层实现分页
+ List userList = sqlsession.selectList("com.niu.dao.UserMapper.getUserByRowBounds",null,rowBounds);
+ for (User u :
+ userList) {
+ System.out.println(u);
+
+ }
+}
+```
+
+
+
+### 7.3 分页插件-PageHelper
+
+https://pagehelper.github.io/docs/howtouse/
+
+## 8、使用注解开发
+
+### 8.1 面向接口编程
+
+根本原因: 解耦
+
+### 8.2 使用注解开发
+
+1.注解在接口上实现
+
+```java
+@Select("select * from user")
+List getUsers();
+```
+
+2.核心mybatis配置文件中绑定接口
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+3.测试使用
+
+```java
+@Test
+public void test(){
+ SqlSession sqlSession = MyBatisUtils.getSession();
+ //底层主要应用反射
+ UserMapper mapper = sqlSession.getMapper(UserMapper.class);
+ List users = mapper.getUsers();
+ for (User user: users
+ ) {
+ System.out.println(user);
+ }
+ sqlSession.close();
+}
+```
+
+
+
+本质:反射机制实现
+
+底层:动态代理
+
+### 8.3 mybatis执行流程
+
+
+
+
+
+### 8.4 注解CRUD
+
+工具类实现自动提交(查看不用事务提交,但增删改需要)
+
+```Java
+public class MyBatisUtils {
+ private static SqlSessionFactory sqlSessionFactory;
+ static{
+ try {
+ //使用mybatis第一步获取sqlSessionFactory对象
+ String resource = "mybatis-config.xml";
+ InputStream inputStream = Resources.getResourceAsStream(resource);
+ sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ //获取SqlSession连接 并实现自动提交事务
+ public static SqlSession getSession(){
+ return sqlSessionFactory.openSession();
+ }
+}
+```
+
+编写Mapper接口
+
+```java
+public interface UserMapper {
+ //查询
+ @Select("select * from user")
+ List getUsers();
+
+ //方法存在多个参数时使用@Param 且以此注解为主
+ @Select("select * from user where id = #{id}")
+ User getUserById(@Param("id") int id);
+ @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{password})")
+ int addUser(User user);
+ @Update("update user set name=#{name},pwd=#{password} where id = #{id}")
+ int UpdateUser(User user);
+ @Delete("delete from user where id = #{id}")
+ int deleteUser(@Param("id") int id);
+}
+```
+
+测试类
+
+```java
+public class UserMapperTest {
+ @Test
+ public void test(){
+ SqlSession sqlSession = MyBatisUtils.getSession();
+ //底层主要应用反射
+ UserMapper mapper = sqlSession.getMapper(UserMapper.class);
+ //查询
+ List users = mapper.getUsers();
+ for (User user: users
+ ) {
+ System.out.println(user);
+ }
+ //按照id查询
+ User user = mapper.getUserById(1);
+ System.out.println(user);
+ //新增
+ mapper.addUser(new User(5,"niuniu","qwe"));
+ //修改
+ mapper.UpdateUser(new User(5,"ntj","ewq"));
+ //删除
+ mapper.deleteUser(7);
+ sqlSession.close();
+ }
+}
+```
+
+注意要在mybatis中绑定接口
+
+
+
+XML绑定xml文件
+
+
+
+## 9、Lombok
+
+插件 简便编程 不用写get/set方法
+
+## 10、多对一处理
+
+多对一的理解:
+
+- 多个学生对应一个老师
+- 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!
+
+1.数据库设计
+
+```mysql
+CREATE TABLE `teacher` (
+`id` INT(10) NOT NULL,
+`name` VARCHAR(30) DEFAULT NULL,
+PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8
+
+INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');
+
+CREATE TABLE `student` (
+`id` INT(10) NOT NULL,
+`name` VARCHAR(30) DEFAULT NULL,
+`tid` INT(10) DEFAULT NULL,
+PRIMARY KEY (`id`),
+KEY `fktid` (`tid`),
+CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8
+
+
+INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
+INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
+INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
+INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
+INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');
+```
+
+2.创建实体类Techer、Student
+
+3.创建两个Mapper接口
+
+4.创建Mapper.xml
+
+两种方法 通常推荐结果嵌套处理
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+5.在配置文件中注册绑定Mapper接口
+
+6.测试
+
+## 11、一对多处理
+
+一对多的理解:
+
+- 一个老师拥有多个学生
+- 如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!
+
+与多对一大致相同
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+1、关联-association【多对一】
+
+2、集合-collection 【一对多】
+
+3、所以association是用于一对一和多对一,而collection是用于一对多的关系
+
+4、JavaType和ofType都是用来指定对象类型的
+
+- JavaType是用来指定pojo中属性的类型
+- ofType指定的是映射到list集合属性中pojo的类型。
\ No newline at end of file
diff --git a/img/image-20200721001618071.png b/img/image-20200721001618071.png
new file mode 100644
index 0000000000000000000000000000000000000000..920f0a518670215c97d1b1852d96d48a46b31111
GIT binary patch
literal 116329
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