栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis-入门版本.02

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis-入门版本.02

MyBatis

作者:宇哥 WeChat/QQ: Warmheart170712 / 939638113
整理不易,重在分享,欢迎转发收藏,助力面试上岸,学编程找宇哥!
demo1

1、MyBatis简介 1.1 MyBatis历史
MyBatis最初是Apache的一个开源项目iBatis。之后迁移到Goole Code,
iBatis3.x正式更名为MyBatis,代码之后迁移到Github。
iBatis是一个基于Java的持久层框架,iBatis提供的持久层框架包括:
SQL、Maps和Data Access Objects(DAO)
1.2 MyBatis特性
1 MyBatis是支持定制化SQL。存储过程以及高级映射的优秀的持久层框架
2 MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
3 MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和java的POJO(普通的java对象 Plain Old Java Objects)映射成数据库中的记录。
4 MyBatis是一个半自动的ORM框架(Object Relation Mapping)
1.3 MyBatis下载

MyBatis的下载地址:https://github.com/mybatis/mybatis-3

1.4 和其他持久层技术对比
1 JDBC:
	SQL夹杂在java代码中,耦合度高,导致硬编码内伤
	维护不易且实际开发中SQL有变化,频繁修改的情况多见
	代码冗长,开发效率低
2 Hibernate 和 JPA
	操作简便,开发效率高
	程序中的长难复杂SQL需要绕过框架
	内部自动产生的SQL,不容易做特殊优化
	基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难
	反射操作太多,导致数据库性能下降
3 MyBatis
	轻量级,性能出色
	SQL和java代码分开,功能边界清晰,java代码专注业务,SQL语句专注数据
	开发效率稍逊于Hibernate,但是完全能够接受
2、搭建MyBatis 2.1 开发环境
IDEA 2920.1
Maven:3.6.3
MariaDB:10.3.
MyBatis:5.3.7
2.2 创建maven工程 (jar包,引入依赖)
1 打包方式jar
	jar
2 引入依赖
    
        
        
            org.mybatis
            mybatis
            3.5.7
        

        
        
            junit
            junit
            4.12
            test
        

        
        
            mysql
            mysql-connector-java
            8.0.28
        
    
2.3 创建数据库配置文件jdbc.properties
习惯命名为:jdbc.properties
配置文件存放的位置是:src/main/resources目录下
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sggmybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
2.4 创建MyBatis的核心配置文件
习惯上命名为mybatis-config.xml,这个文件名仅仅是建议,并非强制要求,
将来整合spring之后,这个配置文件可以省略,所以大家操作时可以直接复制粘贴

核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是:src/main/resources目录下


        


    
    
    
    
        
            
            
                
                
                
                
                
                
                
                
            
        
    
    
    
        
    

2.5 创建mapper接口
MyBatis中的mapper接口相当于以前的Dao
区别在于:mapper仅仅是接口,我们不需要提供实现类
public interface UserMapper {
    //添加用户
    int insertUser();
}
2.6 创建MyBatis的映射文件
1 相关概念:
	ORM(Object Relationship mapping)对象关系映射
	对象:Java的实体类对象
	关系:关系型数据库
	映射:二者之间的对应关系

2 映射文件的命名规则
	表对应的实体类的类名+Mapper.xml
	一个映射文件对应一个实体类,对应一张表的操作
	MyBatis的映射文件用于编写SQL,访问以及操作表中的数据
	MyBatis的映射文件存放的目录是:src/resources/mappers目录下
3 MyBatis中可以向面向接口操作数据,要保证两个一致
	mapper接口的全类名和映射文件的命名空间(namespace)保持一致
	mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性一致

备注:一般情况下习惯操作
	1)mapper接口的名称与mapper.xml映射文件的名称保持一致
	2)mapper接口的包类路径(src/main/java下)与
			mapper.xml映射文件的路径(src/main/resources下)保持一致
	3) mapper接口的层级包是以点分隔的
	4) mapper.xml文件的层级包是以正斜杠分隔的
UserMapper.xml映射文件:




    
    
        insert into t_user values (null,'tom','123456',22,'man','123456@qq.com')
    

2.7 通过junit测试功能
1 SqlSession的创建步骤:
	1 读取MyBatis的核心配置文件
	2 创建SqlSessionFactoryBuilder对象
	3 通过核心配置文件对应的输入流,创建工厂类SqlSessionFactory 
	4 创建sqlSession对象
	5 通过代理模式创建自定义mapper接口的代理实现类对象
	6 调用自定义mapper接口的中的方法,
		就会根据自定义mapper的全类名匹配映射文件,
		通过调用的方法名匹配映射文件中SQL标签中的id属性值,
		并执行标签中的SQL语句
	7 sqlSession提交事务
	8 关闭sqlSession会话


解释:
	SqlSession:代表Java程序和数据库之间的会话
	HttpSession是Java程序和浏览器之间的会话
	SqlSessionFactory:是生产SqlSession对象的工厂
	工厂模式:
		如果创建一个对象,使用的过程都是基本固定的,
		那么我们就可以把创建这个对象的相关代码封装到一个工厂类中,
		以后使用这个工厂类来生产我们想要的对象
2 关于sqlSession提交事务的问题:
	 MyBatis对于增删改的业务需要操作事务,
	 如果未设置事务,则测试运行不报错,但数据库数据未发生变化
	 
	 sqlSession提交事务的两种方式:
		 方式一:手动提交
		 	通过sqlSession.commit()方法提交事务
		 方式二:自动提交
		 	在创建SqlSession对象时,参数设置为true,进行事务提交
		 	SqlSession sqlSession = 
		 				sessionFactory.openSession(true);
    @Test
    public void testMyBatis1() throws IOException {
        //1.加载核心配置文件
        InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
        //2.获取会化工厂的构建对象SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder =
                new SqlSessionFactoryBuilder();
        //3.获取会话工厂对象SqlSessionFactory
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(stream);
        //4.获取SqlSession--代表java程序和数据库之间的会话
        SqlSession sqlSession = sessionFactory.openSession(true);
        //5.获取mapper接口对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //6.调用方法
        int result = userMapper.insertUser();
        //7.提交事务
        sqlSession.commit();
        System.out.println(result);
    }

运行结果
查看数据库:数据添加成功

2.8 加入log4j日志功能
1 添加依赖
		
            log4j
            log4j
            1.2.17
        
2 加入log4j配置文件
  位置:src/main/resources 目录下
	
日志的级别::从左到右打印的越老越详细
FATAL(致命) > ERROR(错误 > WARN(警告)> INFO(信息)> DEBUG(调试)




    
        
        
            
        
    
    
        
    
    
        
    
    
        
        
    

2.9 MyBatis 的执行流程

3、MyBatis的增删改查 3.1 搭建MyBatis框架—添加功能
    //添加用户
    int insertUser();

    
        insert into t_user values (null,'tom','123456',22,'man','123456@qq.com')
    
3.2 搭建MyBatis框架—优化功能
1 创建工具类SqlSessionUtils,封装SqlSession的创建过程
public class SqlSessionUtils {
    public static SqlSession getSqlSession() throws IOException {
        SqlSession sqlSession = null;
        try {
            InputStream stream = 
            		Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder =
                    new SqlSessionFactoryBuilder();
            SqlSessionFactory build = 
            		sqlSessionFactoryBuilder.build(stream);
            //true表示自动提交事务
            sqlSession = build.openSession(true);
        }catch (Exception e){
            e.printStackTrace();
        }
        return sqlSession;
    }
}
3.3 搭建MyBatis框架—修改和删除功能
    //修改用户信息
    void updateUser();

    //删除用户信息
    void deleteUserById();
	
    
        update t_user set username = '尼古拉斯' where id = 4
    

    
    
        delete from t_user where id=7
    
3.4 搭建MyBatis框架—查询功能
查询功能的标签必须设置resultType和resultMap
        	resultType:设置默认的映射关系
        	resultMap:设置自定义的映射关系
    //查询用户信息
    List findAll();

    //查询用户通过id
    User findUserBId();
    
    
        select * from t_user where id=5
    

4、核心配置文件详解
核心配置文件的标签必须按照固定顺序:
	properties
	settings
	typeAliases
	objectFactory
	objectWrapperFactory
	reflectorFactory
	plugins
	environments
	databaseIdProvider
	mappers





    


    
    
    
    
        
        
        
        
    

    
    
        

        
        
    

    
    
        
            
            
            
            
                
                
                
                
                
                
                
                
            
        
    

    
    
        
        
        
        
    

4.1 核心配置文件— environments
environments的作用:配置多个连接数据库的环境
	属性:default="development":用来设置默认使用环境的id,为开发环境
	
environment:配置某个具体的环境
	属性:id="development":表示连接数据库环境的唯一标识,不能重复
	
transactionManager:设置事务管理方式
	属性:type=“JDBC/MANAGED”
	     JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,
			   事务的提交和回滚需要手动处理
         MANAGED:被管理,例如spring

dataSource:配置数据源
	属性:type:设置数据源的类型
		 type=“POOLED/UNPOOLED/JNDI”
         		POOLED:表示使用数据库连接池缓存数据库连接
                UNPOOLED:表示不使用数据库连接池
                JNDI:表示使用上下文中的数据源
              
设置数据库的连接驱动

设置数据库的连接地址

设置数据库的连接用户名

设置数据库的连接密码
		
4.2 核心配置文件— properties
 用于引入外部的后缀名为properties的文件
 数据部原配置中,使用${key}来获取其对应的value值
 
 
4.3 核心配置文件— typeAliases
typeAlias 设置某个类型的别名
       属性:
           type="设置需要设置别名的类型"
           alias=“设置某个类型的别名,若不设置该属性,
                    那么该类型拥有默认的别名,即类名,不区分大小写 ”
方式一:
	设置具体的包类全路径,以及设置别名,默认设置类名或类名小写,
	也可以自定义

		



方式二:
	以包为单位,将包下所有的类型设置默认的类型别名,
	即类的名称,不区分大小写

		

4.4 核心配置文件— mappers
方式一:
	设置映射文件资源全路径全名
		要求:
			在resources目录下不能使用点,需要使用全名称
	使用斜杠分隔:
			resource="com/zzy/mapper/UserMapper.xml"
			
方式二:
	以包未单位引入映射文件
		要求:
		1 mapper接口所在的包和映射文件所在的包路径一致,
		  且目录之间使用/分隔,不使用点
		2 mapper接口要和映射文件的名称一致
	使用点分隔:
			name="com.zzy.mapper"
方式一:
	设置映射文件资源全路径全名

    


方式二:
	以包未单位引入映射文件

    

思考:
	mapper.xml文件在java目录下和在resource目录下的场景如何使用

demo02

5、MyBatis获取参数值的两种方式(重点)
MyBatis获取参数值的两种方式:${}和#{}
    ${}:本质是字符串拼接,加引号
    #{}:本质是占位符赋值

面试题:#和$的区别

5.1 单个字面量类型的参数
情况1、
   mapper接口方法的参数为单个字面量类型
   可以通过${}和#{}以任意的名称获取参数值,
   但是要注意${}的单引号问题
   
方法:根据用户名查询用户信息
	 User findUserByUserName(String username);
方式一:使用#{}

        select * from t_user where username = "${username}";


5.2 多个字面量类型的参数
情况2:
  mapper接口方法的参数为多个个字面量类型
 	此时mybatis会将这些参数存储在一个map集合中,以两种方式进行存储
    1、以arg0.arg1...为键,以参数为值
    2、以param1,param2...为键,以参数为值
       因此只需要通过#{}和${}以键的方式访问即可,
       但是需要注意${}的单引号问题

方法:使用mybatis默认的map集合
	User checkLogin(String username,String password);

程序传递过来的参数1和参数2会维护在map集合中,
        map的key为:arg0,arg1 或者param1,param2
        需要使用map的key(arg0,arg1 或者 param1,param2,
        或者二者混合使用 arg0,param1)获取参数的值。
        故条件使用:
        	username=#{arg0} and password=#{arg1}

如果使用username=#{username} and password=#{password}
	则会出现binding异常,会报‘username’ no found
	报错的原因是:传递进来的参数维护在map中,
			map的key有四个值,分别是arg0,arg1,param1,param1,
			value是:username和password的真实值           
错误写法SQL:


    select * from t_user where username=#{arg0} and password=#{arg1}

5.3 map集合类型的参数
情况3:
  mapper接口方法的参数有多个时,可以手动将参数放在一个map中存储
  此时map中的键值自行手动设置的,不是默认的
  因此只需要通过#{}和${}以键的方式访问,获得key对应的value值,
  但是需要注意${}的单引号问题

方法:
	User checkLoginMap(Map map);

     select * from t_user where username=#{username} and password=#{password}

测试代码:
	 @Test
    public void testLoginByParam() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParemeterMapper mapper = sqlSession.getMapper(ParemeterMapper.class);
        User user = mapper.checkLoginByParam("lucy", "123456");
        System.out.println(user);
    }

6、MyBatis的各种查询功能 6.1 查询一个实体类对象
情况1:
    MyBatis的各种查询功能--查询返回一个实体类对象
    若查询出的数据只有一条,可以通过实体类对象接收,或者集合接收

方法:
	User getUserById(@Param("id") Integer id);

        select * from t_User;

6.3 查询单个数据
情况3:
    MyBatis的各种查询功能--查询单个数据
    MyBatis设置了默认的类型别名
	    java.lang.Integer  -  int/Intefer
	    int ---- _int/_Integer
	    Map --- map
	    
方法:查询总记录数
	Integer getCount();

        select * from t_user where id = #{id}

测试代码:

	@Test
    public void getUserByIdTpMap() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Map map = mapper.getUserByIdToMap(16);
        System.out.println(map);
        System.out.println(map.get("username"));
    }

6.5 查询多条数据为map集合
情况5:
   MyBatis的各种查询功能--查询多条数据为map集合
   方式一:封装成List>
   方式二:封装成Map嵌套Map
     @MapKey注解,将每条数据转换成map集合作为值,
     以某个字段的值作为键,
     放在同一个map集合中
     
方法1:
	查询多条数据 封装到List-map集合中
    List> getAllUserToListMap();

方法2:
	查询多条数据 封装到map集合中
		将表中的id字段作为map的key,将查询的每条数据封装到map中作为value
    	最后存储到map中,相当于map嵌套map
    	
	注解中的id表示map的key,value是每天数据封装到map 
		即Map<"id","map">
    @MapKey("id")
    Map getAllUserToMap();
List集合map:
 
        select * from t_user
 
	方式一:查询多条数据为list-Map集合
 	@Test
    public void getUserToListMap() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List> listMap = mapper.getAllUserToListMap();
        listMap.forEach(map -> System.out.println(map));
    }


    方式二:查询多条数据为Map集合
    @Test
    public void getUserToMap() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Map map = mapper.getAllUserToMap();
        System.out.println(map);
    }

7、特殊SQL的执行—使用${} 7.1 模糊查询
情况1、根据用户名模糊查询用户信息
		  方式一:使用${}进行字符串拼接
		  放肆二:使用concat关键字拼接以及#{)占位符
		  使用#{}占位符操作

方法:根据用户名模糊查询用户信息
       List getUserByLike(@Param("username")String username);

     模糊查询:三种方式
     方案一:使用${}进行字符串拼接
     原始SQL:select * from t_user where username like "%${username}%"
     解析SQL:Preparing: select * from t_user where username like "%a%"

     方案二:常用方式-使用concat关键字拼接以及#{)占位符
     原始SQL:select * from t_user where username like concat('%',#{username},'%')
     解析SQL:Preparing: select * from t_user where username like concat('%',?,'%')

     方案三:常用方式-使用#{}占位符操作
     原始SQL:select * from t_user where username like "%"#{username}"%"
     解析SQL后Preparing: select * from t_user where username like "%"?"%"
测试代码:

	@Test
    public void testGetUserByLike() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SqlLikeMapper mapper = sqlSession.getMapper(SqlLikeMapper.class);
        List list = mapper.getUserByLike("a");
        list.forEach(user -> System.out.println(user));
    }
7.2 批量删除
批量删除
	方法:
	int deleteMore(@Param("ids") String ids);
	
  	批量删除只能使用${},以字符串形式拼接进行删除,
		delete from t_user where id in (${ids})
		Preparing: delete from t_user where id in (13,14,15)
		
    不能使用#{},会自动添加单引号。只会删除第一条,其余不删除
		delete from t_user where id in (#{ids})
		Preparing: delete from t_user where id in (?)

        delete from t_user where id in (${ids})

7.3 动态设置表名
情况3:动态设置表名
		只能使用${},不能使用#{},因为表名不能加单引号

方法:
List getUserByTableName(@Param("tableName") String tableName);

	使用${}解析后的SQL:
		Preparing: select * from t_user;
	使用#{}解析后的SQL:
		Preparing: select * from ?;
		此时会报错。会给表名添加单引号,报错如下
		Caused by: java.sql.SQLSyntaxErrorException:You have an error in your SQL syntax;check the manual that corresponds to your MariaDB server versionfor the right syntax to use near ''t_user'' at line 1

        select * from #{tableName};

测试代码:

 	@Test
    public void testSetTableName() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SqlLikeMapper mapper = sqlSession.getMapper(SqlLikeMapper.class);
        List list = mapper.getUserByTableName("t_user");
        list.forEach(user -> System.out.println(user));
    }
7.4 添加功能获取自增的主键
情况4:添加功能获取自增的主键

方法:
	int insertUser(User user);	

      新增用户信息同时获取新增数据的主键
		useGeneratedKeys="true":
			设置当前标签中的SQL使用了自增的id
		keyProperty="id":
			将自增的主键的值,赋值给传输到映射文件中参数的某个属性
 
        insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})

测试代码:

    @Test
    public void TestInsertUserGetAutoPrimaryKey() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SqlLikeMapper mapper = sqlSession.getMapper(SqlLikeMapper.class);
        User user = new User(null, "孙悟空","11111" , 33, "man", "12345@qq.com");
        mapper.insertUser(user);
        System.out.println(user.getId());
    }


demo03

8、自定义映射resultMap 8.1 resultMap处理字段和属性的映射关系(三种方式)
1 解决字段名和属性名不一致
    方式一:为字段起别名,保持和属性名一致
    方式二:核心配置文件中配置全局驼峰命名,将_自动映射成驼峰命名
      
    方式三:取消核心配置文件的驼峰命名,使用resultMap,
    		设置自定义之间的关系,使用字段名映射属性名

注意:如果属性名和字段名不一致,不对其进行以上三种方式操作
	 别名设置,或开启核心配置文件全局驼峰,或者自定义关系映射
	 那么查询结果中,此属性的值为null
1.1 方式一:为字段起别名
	数据库字段名:emp_name
	实体类属性名:empName
	要求:为字段起别名,其别名必须和实体类的属性名一致
	
	SQL案例如下:
		select eid,emp_name empName,age,sex,email from t_emp
1.2 方式二:MyBatis核心配置文件中配置全局驼峰命名,将_自动映射成驼峰命名
	
	
	SQL案例如下:直接查询,不需要别名
		select eid,emp_name,age,sex,email from t_emp
1.3 方式三:取消核心配置文件的驼峰命名,使用resultMap,
		设置自定义之间的关系,使用字段名映射属性名
		
方法:
	List findAllEmp2();
属性:
    id:设置主键的映射关系
    result:设置其他普通属性的映射关系
    property:设置映射关系的属性名,必须是type属性所设置的实体类类型中的属性名
    column:设置数据映射关系的字段名,必须是SQL查询出来的表的字段名
    resultMap:设置自动以映射关系
    resultMap中的id:设置唯一标识,不能重复
    type:设置映射关系中的实体类类型
1.3 方式三:resultType自定义关系,解决字段名属性名不一致的SQL

	
        
        
        
        
        
    
    
        select * from t_emp;
    

1.3 方式三:测试代码

	@Test
    public void testResultMap2() throws IOException {
        SqlSession sqlSession = 
        				SqlSessionUtils.getSqlSession();
        EmpMapper mapper = 
        				sqlSession.getMapper(EmpMapper.class);
        List list = mapper.findAllEmp2();
        list.forEach(emp -> System.out.println(emp));
    }

1.3 方式三:测试结果

8.2 resultType 多对一映射处理(三种方式)

实体类Emp1 :员工表和部门表示多对一的关系

8.2.1 级联方式处理映射关系
需求:根据员工eid查询对应员工信息,以及员工的部门信息,
	 员工表和部门表的关系维护在多的一方,也就是员工表中的did字段
1 方式一:级联属性赋值
            多对一查询:
            查询员工以及员工做对应的部门信息,
            即:多个员工对应一个部分,关联关系在多的一方
            
            方式一:级联属性赋值
    		Emp1 getEmpAndDept(@Param("eid") Integer eid);
2 多对一-级联赋值查询SQL语句

    
        
        
        
        
        
        
        
        
    
    
        select * from t_emp1 left join t_dept on t_emp1.did = t_dept.did where t_emp1.eid = #{eid}
    
3 测试代码

	@Test
    public void testEmpDept2() throws IOException {
        SqlSession sqlSession = 
        			SqlSessionUtils.getSqlSession();
        EmpMapper mapper = 
        			sqlSession.getMapper(EmpMapper.class);
        Emp1 emp1 = mapper.getEmpAndDept2(5);
        System.out.println(emp1);
    }

4 测试结果

8.2.3 分步查询
需求:根据员工eid查询对应员工信息,以及员工的部门信息,
	 员工表和部门表的关系维护在多的一方,也就是员工表中的did字段
1 方式三:分步查询: 

	方法:
	Emp1Mapper方法:第一步
		Emp1 getEmpAndDept3(@Param("eid") Integer eid);
	DeptMapper方法:第二步
		Dept getDeptByEmp1Did(@Param("did") Integer did);

	数据库表emp1表维护对多一的关系,即部门的did主键作为emp1的外键存在
	步骤1:现根据eid查询得到员工信息,包括员工对应的did的值
	步骤2:通过did的值,映射到DeptMapper中,
		  执行根据did查询部门此案系的操作
    最后通过association标签进行联合
	
属性:
property="dept" :
	表示Emp1中的属性
select="com.zzy.mapper.DeptMapper.getDeptByEmp1Did":
	设置分步查询的SQL的唯一标识
	即:(namespace.sqlId,或者mapper接口的全类名.方法名)
	表示用DeptMapper中的方法,即通过Emp1中的did获取对应的Dept部门信息
column="did" :
	设置分步查询的条件,即did指的是员工表和部门的关系字段
	即通过查询得到的员工信息Emp1中的did的值,去dept表中查询对应部门信息
	再将部门的信息赋值给属性dept
fetchType=“lazy/eager”: 
	当开启全局延迟加载之后,可通过此属性设置延迟加载的效果
	
	lazy 表示延迟加载   eager表示立即加载
3 多对一关系分步查询SQL

第一步:Emp1Mapper.xml中书写

    
        
        
        
        
        
        
        
    
    
        select * from t_dept where did = #{did}
    
3 测试代码
	@Test
    public void testEmpDept3() throws IOException {
        SqlSession sqlSession = 
        			SqlSessionUtils.getSqlSession();
        EmpMapper mapper = 
        			sqlSession.getMapper(EmpMapper.class);
        Emp1 emp1 = mapper.getEmpAndDept3(5);
        //System.out.println(emp1);
        //查看延时加载的效果
        System.out.println(emp1.getEmpName());
        System.out.println(emp1.getDept());
    }

4 测试结果

8.2.4 分布查询的延迟加载

1 MyBatis核心配置文件中配置延迟加载

2 延迟加载、紧急加载

	FetchType.LAZY:
		懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
	FetchType.EAGER:
		急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
8.3 resultType 一对多映射处理

实体类Dept :部门表和员工表示一对多的关系

8.3.1 collection
需求:根据部门did查询对应部门信息,以及部门下的员工信息,
	 员工表和部门表的关系维护在多的一方,也就是员工表中的did字段
1 一对多查询collection标签

    查询部门信息以及部门信息中的员工信息,使用集合属性设置员工信息
    
	方法:
	Dept getDeptAndEmp(@Param("did") Integer did);

	属性:
     collection:用来处理一对多的关系
     property="emp1s":表示Dept实体类中的emp1s属性
     ofType:表示该属性所对应的集合中存储的数据的类型
2  一对多collection标签的SQL

   
        
        
        
            
            
            
            
            
        
    
    
        select * from t_dept where did = #{did}
    
    
第二步:Emp1Mapper.xml中书写
	
        select * from t_emp1
        
            
                emp_name = #{empName}
            
            
                and age = #{age}
            
            
                and sex = #{sex}
            
            
                and email = #{email}
            
        
    

3 测试动态生成where标签

	@Test
    public void testMoreConndition2() throws IOException {
        SqlSession sqlSession = 
        		SqlSessionUtils.getSqlSession();
        DynamicSqlMapper mapper = 
        		sqlSession.getMapper(DynamicSqlMapper.class);
        Emp1 emp1 =  new Emp1();
        emp1.setEmpName("");
        emp1.setAge(null);
        emp1.setSex("男");
        emp1.setEmail("111@qq.com");
        List list =
                mapper.getEmpByMoreCondition2(emp1);
        System.out.println(list);
    }

4 测试结果

9.3 trim 标签
1 动态SQL标签-trim

     方法:
     List getEmpByMoreCondition3(Emp1 emp1);
     属性:
         prefix:在trim标签中的内容前面添加指定的内容
         suffix:在trim标签中的内容后面添加指定的内容
         prefixOverrides:在trim标签中的内容前面去掉指定的内容
         suffixOverrides:在trim标签中的内容前面去掉指定的内容
     如果标签中的内容无效,那么 trim标签也没有任何效果,
     解析后的SQL语句是:select * from t_emp1
2 trim标签SQL语句

 
        select * from t_emp1
        
                
                    emp_name = #{empName} and
                
                
                    age = #{age} or
                
                
                    sex = #{sex} and
                
                
                    email = #{email}
                
        
    
3 测试trim标签的功能

	@Test
    public void testMoreConndition2() throws IOException {
        SqlSession sqlSession = 
        		SqlSessionUtils.getSqlSession();
        DynamicSqlMapper mapper = 
        		sqlSession.getMapper(DynamicSqlMapper.class);
        Emp1 emp1 =  new Emp1();
        emp1.setEmpName("");
        emp1.setAge(null);
        emp1.setSex("男");
        emp1.setEmail("111@qq.com");
        List list =
                mapper.getEmpByMoreCondition2(emp1);
        System.out.println(list);
    }

4 测试trim结果

9.4 choose when otherwise 标签
1 动态SQL标签--- choose when otherwise

	方法:
	List getEmpByChoose(Emp1 emp1);
	
	属性:
	when:当满足条件时,执行内容,相当于java中的if或else if语句
	otherwise:当不满足条件时,执行内容,相当于java中的else语句

	注意:
	如果第一个非主键字段值满足条件,后面的when中的内容将不再判断
	如果when中的条件都不满足,则会执行otherwise的内容
2 动态标签choose when otherwise SQL语句