一、主键回填
在一些特殊的需求中,需要执行完新增的SQL后立即知道新增时主键的值。如果主键的值是自己设置的固定值,可以知道主键是多少。但是很多时候都是使用MySQL的主键自增,这时想要获取主键的值就需要通过特殊的方式获取了。
●在MyBatis中有两种方式可以获取到自增主键的值:
•使用<selectKey>子标签编写SQL进行回填属性。
•使用<select>的useGeneratedKeys属性进行自动回填
●selectKey的使用
• 在接口中添加方法
在接口中添加方法。
//参数peo中包含了name值和address值。
int insert1(People peo);
•在映射文件中添加标签
在映射文件中添加标签与接口中方法进行绑定。
<selectkey>标签是<insert>的子标签,作用:把查询到的结果填充进行回填
keyProperty:接口方法参数中,对象的哪个属性需要进行回填
resultType:SQL查询到的结果
select @@identity:是MySQL内置的全局变量表示获取到自增主键值。
order:selectKey中SQL是在外面SQL执行之前还是之后。可取值:AFTER和BEFORE
●自动主键回填
MyBatis的映射文件的<insert>标签带有自动主键回填功能,只需要设置useGeneratedKeys进行开启自动主键回填功能,同时设置keyProperty的值需要回填到对象的哪个属性。
直接修改映射文件中insert1的内容,修改后运行测试类,查看控制台输出对象值是否带有主键值。
二、动态SQL
●动态SQL引入
MyBatis在简化操作方法提出了动态SQL功能,将使用Java代码拼接SQL语句,改变为在XML映射文件中截止标签拼接SQL语句。相比而言,大大减少了代码量,更灵活、高度可配置、利于后期维护
MyBatis中动态SQL是编写在mapper.xml中的,其语法和JSTL类似,但是却是基于强大的OGNL表达式实现的。
为了查看动态SQL最终执行时的SQL,先把日志配置上。
●if标签
通过if处理用户多变的查询条件
接口代码
List<People> selectIf(People people);
mapper映射文件通过if进行判断参数的属性是否为null。
<if>标签的test属性值为OGNL(对象导航图语言)表达式,通过对象属性名可以快速获取到对象属性值。
•namel=null:OGNL表达式,直接写属性名可以获取到属性值。不需要添加$或#
•name=#(name]中name是SQL的列名。#(name)是MyBatis获取参数对象属性值的写法(之前学习的)。
•where 1=1中1=1是为了保证SQL语法的正确性。如果if成立没有1=1最后的SQL就是where and name=xxx这种写法是不对的。
•通过测试类中是否设置对象属性值来控制SQL,如果name属性有值,address属性没有值。最终执行的SQL就没有and name=xxx。
●choose
choose标签相当于Java中的switch..case...default,在choose标签里面可以有多个when标签和一个otherwise(可以省略)标签。只要里面有一个when成立了后面的when和otherwise就不执行了。
●trim标签
if标签中为了保证语法的正确性,需要在SQL中明确指定where 1=1,其中1=1存在的意义单纯为了保证语法的正确性,没有实际意义的。可以通过trim标签动态进行截取添加,省略where1=1,
•trim标签包含四个属性:
prefix:只要内容不是空字符串(""),就在子内容前面添加特定字符串。
prefixOverrides:如果里面内容是以某个内容开头,去掉这个内容。
suffix:只要内容不是空字符串(""),就在子内容后面添加特定字符串。
suffixOverrides