本文主要是介绍tk.mapper selectOne方法使用注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、问题背景
在springboot 2.1.10中引入tk.mapper,自动生成mapper文件。当我在调用mapper.selectOne(T)的时候,我发现当T的属性值均为null的时候,这个方法会遍历整张表,对于这个问题我产生了疑惑?
2、追究
mybaits的源码一直以来我没有仔细研究,仅仅停留在使用的程度,惭愧。这个问题一开始让我摸不到头脑,也不知道为什么会发生这种问题。当我准备绕过自动生成的selectOne(T),手写一个类似的通用方法时,我发现了一些端倪。
3、代码展示,端倪自现
mapper.xml
<sql id="columns">id, name</sql><!-- 公共查询条件 --><sql id="whereSQL"><if test="id != null and id != ''">AND id = #{id}</if><if test="name != null and name != ''">AND name = #{name}</if></sql><select id="selectOne" resultMap="BaseResultMap">SELECT <include refid="columns" />FROM brandWHERE 1 = 1<include refid="whereSQL" /></select>
5、分析和结论
从上面的mapper文件中,可以看到,当对象T内的id或name不为null或不为空字符的时候,并将其属性值动态拼接到sql中,形成你所预期的sql语句。但是当对象T的属性值为null的时候,动态sql并没有发挥它的作用,而是没有任何过滤条件,将表全部遍历,但由于这个方式是返回一条记录,所以会出错。
在使用selectOne(T)查询的时候,推荐以索引的字段作为查询条件,并严格判断其值,若为null或空字符串时,抛出参数错误。
这篇关于tk.mapper selectOne方法使用注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!