MyBatis学习02

一 、基础回顾

1)导入jar包
2)准备配置文件
3)domain+表
4)实体的映射文件需要导入核心配置文件
5)抽取util,方便管理sqlSession
6)写dao层crud,dao层impl类实现方法,通过session调用命名空间中的sql方法来实现
7)在实体映射中sql语句,注意和接口中的方法对应
8)测试

二、mybatis映射器

  • 使用mybatis要想完成一个domain持久化操作,为它写一个dao实现,在里通过SqlSession调用我们映射sql来完成操作.
  • 其实只要我们给出dao层方法就可以动态产生实现类.–其实mybati就已经提供了这个机制.-这个就是映射器.
  • 只需要写一个接口xxMapper,然后在映射关系xml中的命名空间引用这个接口就可以完成方法

三、测试高级查询,使用映射器,动态SQL-where if sql include

  • 准备员工表t_employee
    MyBatis学习02_第1张图片
    新建mapper包,EmployeeMapper接口,定义一个高级查询的方法
  • EmployeeMapper接口代码
public interface EmployeeMapper {
    //根据查询条件查询满足条件的员工
    List query(EmployeeQuery employeeQuery);
}
  • 创建查询类,用于封装查询条件
public class EmployeeQuery {
    //模糊查询的like条件语句中的参数
    private String keywords;
    //最小年龄
    private Integer minAge;
    //最大年龄条件
    private Integer maxAge;
    。。getset...
    }
  • EmployeeMapper.xml文件,在核心mybatis文件中引入



   
    
        
            
                and ( name LIKE concat('%',#{keywords},'%') OR password LIKE concat('%',#{keywords},'%'))
            
            
                and age>#{minAge}
            
            
                
            
        
    
   

分析:

  1. 需要执行的sql语句
select * from t_employee
     where (name like '%条件1%' or password like '%条件2%') and age > minAge and age < maxAge
  1. 一些细节

  • 测试
    使用方法直接使用session得到这个接口的代理实现类
SqlSession sqlSession = MybatisUtil.INSTANCE.openSqlSession();
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        List list = mapper.query(query);
        System.out.println(list);

四、 关联映射(结果映射)

4.1 为什么需要结果映射
1)数据库表字段名和java对象属性名不一致
2)不管什么关系的关联对象的查询都需要使用resultMap
4.2 关联映射分类
一对一,多对一,一对多,多对多
一对一和多对一都是处理一方(association ),一对多和多对多都是处理多方(collection)集合
4.3 处理方式
1)嵌套结果(join)-只需要发送1条sql
2)嵌套查询-1+N条sql,先查询自己,再通过自己里面外键查询关联方
能用嵌套结果就用它,因为效率高
4.4 如果需要嵌套加上分页,只能使用嵌套查询,因为嵌套结果会将数据合并

五 、多对一的嵌套查询

  • 准备dept,employee表
  • 实体类
public class Dept {

    private Long id;

    private String name;
    省略getset
    }
//关系:多对一
//多个员工对应一个部门
public class Employee {

    private Long id;

    private String name;

    private String password;

    private Integer age;
    //多对一关系   省略getset
    private Dept dept;
    }

MyBatis学习02_第2张图片
为了方便测试,不写接口mapper,直接用session调用命名空间





    
    
        
        
        
        
        

            
            

        
    
   
   

  • 测试
public class MapperTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.INSTANCE.openSqlSession();
        //SELECT e.*,d.id did,d.`name` dname FROM t_employee e LEFT JOIN t_dept d ON e.dept_id = d.id
        //只发送了一条sql,手动封装
        List list = sqlSession.selectList("com.lr.mybatis.mapper._03_many2one_result.mapper.EmployeeMapper.query");
        System.out.println(list);
        sqlSession.close();
    }
}

六、多对一的嵌套查询





    
    
        
        
        
        
        
        
        
        

    
    
    
    
    

在核心mybatis配置中注意更改映射文件配置

七、一对多嵌套结果

  • 实体类中添加多方字段
public class Dept {

    private Long id;

    private String name;
    //一对多
    //一个部门对应多个员工
    private List employees = new ArrayList<>();
    省略getset
    }
  • DeptMapper.xml中的sql映射




    
    
        
        
        
        
        
            
            
            
            
        
    

    
    

    


  • 测试
public class MapperTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.INSTANCE.openSqlSession();
        //SELECT e.*,d.id did,d.`name` dname FROM t_employee e LEFT JOIN t_dept d ON e.dept_id = d.id
        //只发送了一条sql,手动封装
        List list = sqlSession.selectList("com.lr.mybatis.mapper._05_one2many_result.domain.DeptMapper.query");
        list.forEach(dept -> System.out.println(dept+"员工信息"+dept.getEmployees()));
        sqlSession.close();
    }
}

八、一对多嵌套查询





    
    
        
        

        
        
    

    
    

    

MyBatis学习02_第3张图片
commons工具类,sqlsession工具

小结:

  • 多对一,一对一都是操作一方
  • 一对多,多对多都是操作多方list
  • 如果关联对象是字段,在resultMap中使用association
  • 如果关联对象是字段是集合,在resultMap中使用collection
  • 注意查询出来的字段如果是别名,在column中写别名
  • 嵌套结果需要手动 封装
  • 嵌套查询不需要封装,但是需要在collection,使用select查询关联对象自动封装

你可能感兴趣的:(MyBatis学习02)