xml映射方式
除了之前那种
@select(语句)
public void ...();
通过注解定义sql语句,还可以通过xml的方式来定义sql语句
注意
在resource创建的是目录,要用斜线分隔
创建出文件后
先写约束
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
添加mapper标签,里面加上namespace属性,对应接口全类名的字符串
这样就能获取接口全类名
然后就在mapper里面定义语句
id对应接口里面的方法名
查询语句多一个resultType用来表示单条记录所封装的类型
List<Emp>单条记录封装的类型,就是Emp员工对象,不过要全类名
还是复制一下
然后就ok了
底层
mybatis底层
当调用EmpMapper这个接口中list方法时Mybatis框架会自动去查找namespace属性和该接口全类名相同的xml映射文件
且在该xml文件找到id属性值与list(方法名)相同的sql语句
最终运行对应sql语句
使用场景
简单的sql语句可以直接用注解来
复杂的sql语句用xml映射文件比较好
MybatisX
可以下载该插件来更明显的看接口和xml之间的关系
包含方法对应sql语句
下完后,你点击方法或sql会跳到对应的的小鸟会跳到它对应方法/sql语句
蓝鸟对应接口和xml里面的sql
红鸟对应xml文件和接口里面的方法
动态sql语句
看我们之前写的语句
都是写死了三个条件
如果没输出是不是就是null,三个null是不是就查询不到数据
但一般我们如果上面都不加的默认应该显示所有数据,所以我们需要动态sql
就是需要实现:指定哪个用那个查询,指定name就用name查询,不要带上gender和后面的
mybatis提供了一个动态sql标签
if,用来做条件判断来实现动态sql
改造前
改造后
if标签
进行代码的修改后
但其实这个代码是有bug的
当name=null,而gender=1,其他都null
这样的话
对应执行的sql语句是
select * from emp where and gender=1;
无缘无故多了个and,肯定会报错
而且当你所有都传null时
执行
select * from emp where;
也不合理
怎么解决呢?
用where标签
把这个where变成
<where>
<if test="name!=null">
name like contact('%',#{name},'%')
</if>
...
</where>
这样
where标签的作用
1.当你里面的条件一个都不成立的时候,就不会生成where关键字(动态生成where)
2.会自动清除条件前面多余的and或者是or
set标签
set标签会取出掉字段之后多余的逗号
原先更新案例
固定死一定要全部更改
如果我这样写代码
本意是不想更新入职时间那些的
但实际上会把那些变为null
所以需要更改
用if标签来做呗
先删除注解
然后我们这个EmpMapper这个会报错
因为xml文件没有对应的标签
直接按alt+enter生成对应标签(点第一个)
对应的生成
自己往里面填入我们想要的逻辑
当然这样也不是完全对的
当你只更新username的时候
执行的语句就是
显然不对(其实只要没更新updatetime就不对,就它后面没逗号)
update emp set username=? , where id =?
所以提供了一个标签
把set关键字替换成
<set>
<if test="usrename!=null">username=#{username},</if>
...
</set>
set标签作用
set标签会取出掉字段之后多余的逗号
foreach标签
一般用于批量操作当中
批量删除操作
对应的我们的方法要传一个集合
我们肯定是要遍历集合里面的元素而不是集合本身
foreach就能来遍历集合里面的元素
注意open和close
(#{id},#{id}…)差不多能理解吧
注意每个属性的用处
sql&include
这样写代码复用性差
后期如果要修改要一个一个改
java里增强代码复用性:提取成方法呗
但这个是xml
我们需要用sql标签和include
sql和include搭配使用
sql负责定义语句
include负责语句的位置
这个sql标签要定义对应的id
在xml文件里直接写就行
然后原来select id… from emp
可以全部改写
用
<include refid="对应的id"/>
sql片段的抽取和引用就完成了