乐趣区

mybatis-的进阶使用

前置说明

本文章是基于 tk.mybatis 和 mybatis 的整合,不打算说基本的增删改操作,因为这些已经被 tk.mybatis 实现了,我们继承它的接口就可以直接调用。

关于如何整合 springboot + mybatis + tk.mybatis 可直接参考我的例子项目,只有这三项的整合,非常适合于专项研究。
gitee:https://gitee.com/sanri/example/tree/master/test-mybatis

使用数据库为 mysql5.6 版本,sql 脚本可以在这里找到
https://gitee.com/sanri/example/tree/master/test-mybatis/sql/test.sql

mybatis 参数传递

  • 单个参数时,非集合类型占位符是可以任意写的像这样
List<Emp> dateParam(Date birthday);
<select id="dateParam" resultMap="EmpResultMap">
    select * from emp where hiredate &lt; #{birthday}
</select>

注意:大于号和小于号需要写转义形式,不然会报错,要不就整个语句用 CDATA 包起来

  • 多个参数时,在 Mapper 中拼装 sql 可以使用 #{0} 或者 #{param1} 获取第一个参数,#{1} 或#{param2} 获取第二个参数,以此类推

也可以在接口方法中使用 @param 注解给参数取别名像这样:

// 集合类型也需要用 @Param 来标记
void batchUpdateUseInsert(@Param("batchSubList") List<Batch> batchSubList);
  • 使用实体传参数时,不加 @Param 注解可以直接拿实体中的属性来拼接 sql,像这样
List<Emp> selectEmpsUseParam(Emp emp);
<select id="selectEmpsUseParam" resultMap="EmpResultMap">
   select * from emp
    <where>
        <if test="ename != null and ename !=''">
            and ename like '%${ename}%'
        </if>
        <if test="deptNo != null and deptNo !=''">
            and deptNo = #{deptNo}
        </if>
    </where>
</select>
  • 可以使用 map 来传递参数,这样是最方便的,可以做到参数的统一。
List<Emp> selectEmpsUseMap(Map<String,Object> map);
<select id="selectEmpsUseMap" resultMap="EmpResultMap">
    select * from emp
    <where>
        <if test="ename != null and ename !=''">
            and ename like '%${ename}%'
        </if>
        <if test="deptNo != null and deptNo !=''">
            and deptNo = #{deptNo}
        </if>
    </where>
</select>

${} 和 #{} 的区别

#{} 和 ${} 在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符 ? 代替
主要是为了防止  SQL 注入,建议使用 #{} 

一对一关联查询

实体类

/**
 * mybatis 一对一关联查询
 */
@Data
@ToString(callSuper = true)
public class EmpDept  extends Emp{private Dept dept;}

xml 配置

<resultMap id="EmpDeptResultMap" type="empDept" extends="EmpResultMap">
    <association property="dept" javaType="dept" resultMap="DeptResultMap" />
</resultMap>

<select id="selectOne2One"  resultMap="EmpDeptResultMap">
    select ename,comm,mgr,empno,job,hiredate,sal,
    loc,dname,d.deptNo
    from emp e
    inner join dept d on d.deptNo = e.deptNo
    where e.ename = #{ename}
</select>

一对多关联查询

实体类

@Data
@ToString(callSuper = true)
public class DeptEmps extends Dept{private List<Emp> emps;}

xml 配置

<resultMap id="DeptEmpsResultMap" type="com.sanri.test.testmybatis.po.DeptEmps" extends="DeptResultMap">
    <collection property="emps" resultMap="EmpResultMap"/>
</resultMap>

<select id="selectOne2Multi" resultMap="DeptEmpsResultMap">
   select loc,dname,d.deptNo,
   ename,comm,mgr,empno,job,hiredate,sal
   from dept d
   inner join emp e on e.deptNo = d.deptNo
   where d.deptNo = #{deptNo}
</select>

mybatis 常用标签

参考文章 : https://blog.csdn.net/abc997995674/article/details/80885591

常用 springboot 配置项

使用 mybatis-spring-boot-starter 后,除了数据库驱动、用户名、密码需要配置一下之外,几乎不需要任何配置就可以运行 mybatis 应用。但有几个配置项是需要注意的。
这个持续更新

# 不需要自动下划线转驼峰,默认是 false;就怕别人配置了
mybatis.configuration.mapUnderscoreToCamelCase=false
# 配置 mapper 级别的缓存,默认打开 
mybatis.configuration.cacheEnabled=true 

完整代码

github:https://gitee.com/sanri/example/tree/master/test-mybatis

sanri-tools 工具

创作不易,希望可以推广下我的小工具,很实用的解决项目中的一些麻烦的事情,欢迎来 github 点星,fork
gitee 地址:https://gitee.com/sanri/sanri-tools-maven
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034

退出移动版