Mybatis进阶使用

MyBatis进阶

使用接口代理的方式实现Dao层

  • 传统方式实现Dao层的缺点:
    • 代码大量的重复
    • 在重复在代码中不同的部分:
      • sql的id不同
      • 参数不同
      • 返回值不同
  • 使用接口代理方式实现Dao层
  • 实现思想(反射):
    • 规定接口的全限定类名+方法名来定位sql语句的id
    • 通过方法的返回值来确定sql语句的返回值
    • 通过方法的参数来确定sql语句的参数
  • 实现要求:
    • 映射配置文件中的名称空间必须和 Dao 层接口的全类名相同。
    • 映射配置文件中的增删改查标签的 id 属性必须和 Dao 层接口的方法名相同。
    • 映射配置文件中的增删改查标签的 parameterType 属性必须和 Dao 层接口方法的参数相同。
    • 映射配置文件中的增删改查标签的 resultType 属性必须和 Dao 层接口方法的返回值相同。

接口代理方式的实现

  • 在SqlSession中调用getMapper方法对接口进行具体实现
  • 对具体实现类所在的类中的代码进行抽取

动态sql

  • 如果传递的参数在之前不确定,只能在使用的时候才能确定参数的个数,对于这个问题就需要用动态的sql语句来解决

  • 在映射配置文件中使用不同的标签来完成:

  • where 如果有动态条件,用来替换where是关键字

  • if

    • test属性值是为判断的条件

       <select id="findStudents" parameterType="student">
              select * from big
              <where>
                  <if test="id!=null and  id!=''">
                      id=#{id}
                  if>
                  <if test="name!=null and name !='' ">
                      and name=#{name}
                  if>
                  <if test="sex !=null and sex!=''">
                      and sex=#{sex}
                  if>
                  <if test="birthday !=null and birthday !=''">
                      and birthday=#{birthday}
                  if>
              where>
          select>
      
  • foreach

    • collection属性 标识参数容器类型
    • open 属性 开始sql语句
    • close 属性 结束sql语句
    • item 属性 每个参数
    • separator 属性 分割符
<select id="findByList" parameterType="list" resultType="student">
        select * from big
        <where>
        id
           <foreach collection="list" open="in (" close=")" item="id" separator="," >
                #{id}
            foreach>
        where>
    select>

sql片段的抽取

  • 在映射配置文件中有大量的sql语句存在重复的部分,对于这部分重复的部分可以通过sql标签进行抽取达到重复利用的效果

  • sql标签

    • id 属性 每个sql的标识
      
        <sql id="select">
            select  id,name,sex,birthday from big
        sql>
    
  • 使用

    • 通过include 标签
      • refid 属性 需要引入的sql语句的id
<include refid="select">include>

多表查询

  • 多表查询模型分类:
    • 一对一查询:在任意一方外键关联另外一方的主键
    • 一对多查询:在多方建立外键关联一方的主键
    • 多对多查询:借助第三方表分别关联两张多方的表

mybatis中的分页插件

  • 在mysql中分页查询使用的是limit关键字进行查询,但是这个只是mysql数据库的方言并不能通用查询

  • 解决方案使用分页插件

  • PageHelper分页插件的使用

    • 导入jar包

    • 在核心配置文件中集成插件

       <plugins>
              <plugin interceptor="com.github.pagehelper.PageInterceptor">plugin>
          plugins>
      
    • 使用分特插件进行查询

      // 设置分页参数
       PageHelper.startPage(3,3);
      
    • 分页助手相关的api

      PageHelper:分页助手功能类。

      • startPage():设置分页参数

      PageInfo:分页相关参数功能类。

      • getTotal():获取总条数
      • getPages():获取总页数
      • getPageNum():获取当前页
      • getPageSize():获取每页显示条数
      • getPrePage():获取上一页
      • getNextPage():获取下一页
      • isIsFirstPage():获取是否是第一页
      • isIsLastPage():获取是否是最后一页

mybatis核心配置标签顺序

properties properties外置配置文件可以配置一些比较固定不变的信息在后面的标签中通过${键}获取
settings 
typeAliases 起别名
typeHandlers objectFactory objectWrapperFactory reflectorFactory
plugins 插件
environments 数据库环境信息
databaseIdProvider
mappers映射配置文件

你可能感兴趣的:(mybatis)