共计 2837 个字符,预计需要花费 8 分钟才能阅读完成。
前置说明
本文章是基于 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 < #{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