首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MyBatis教程(6):动态SQL

前言:

在业务比较复杂的情况下,我们通常需要去拼接SQL语句来完成相关操作,有过这方面开发经验的同学,一定可以体会到大量的手动拼接SQL有多么痛苦,而且出错率很高。没关系,MyBatis有一个非常方便且强大的功能就是动态SQL,使用动态SQL,可以摆脱手动拼SQL的痛苦,接下来我们就一起来学习如何使用MyBatis动态SQL。

代码:

我们通过对user对象的操作来举例说明。

User实体类

config.xml

UserDAO

UserDAO.xml

测试:

数据库表记录

很显然,参数user的属性完全匹配数据库第一条记录,是可以查询出结果的。

但是结果为null,什么原因呢?因为SQL语句where条件使用的是and关键字进行连接,所有条件必须同时满足,我们可以看到此时的SQL语句:

"select * from t_user where id = 1 and username = "张三" and password = null and age = 33;"

显然这条SQL语句是查询不出任何结果的。

现在针对这种情况进行优化,判断user对象,如果password属性值不为null,则SQL语句添加password的判断,如果password属性为null,则不添加。

我们可以使用动态SQL来完成上述操作。

if标签

结构非常清晰,就是一个if流程控制。

再次测试:

可以看到,成功查询出数据库第一条记录。

但是这种方式存在一个漏洞,对代码做如下修改,去掉id属性的赋值。

程序直接报错了,并且是SQL语句的错误。为什么会这样呢?我们来分析动态SQL代码,现在没有给id赋值,即id==0,所以"id=#"这段代码不会添加到SQL语句中,那么最终拼接好的动态SQL是这样的:"select * from t_user where and username = ? and password = ? and age = ?;"

where后面直接跟and,很明显的语法错误。

所以此时的代码还不够智能,应该根据user参数的属性值自动决定是否要添加and关键字,即当"id = #"不出现在SQL语句中时,"and password = #"应该自动删除and关键字,如何做到呢?添加where标签即可。

where标签

测试:

查询成功,SQL语句自动删除了不需要的and关键字,所以一般if标签和where标签会组合起来使用。

choose,when标签

choose,when标签和if标签用法很类似。

trim标签

trim标签中的prefix和suffix属性会被用于生成实际的SQL语句,会和标签内部的语句拼接。如果语句的前面或后面遇到prefixOverrides或suffixOverrides属性中指定的值,MyBatis会自动将它们删除。在指定多个值的时候,别忘了每个值后面都要有一个空格,保证不会和后面的SQL连接在一起。

set标签

set标签用于update操作,会自动根据参数选择生成SQL语句。

UserDAO.xml

UserDAO

测试:

可以看到,user参数只设置了username和age属性,所以动态生成的SQL语句就没有包含对password的修改。

foreach标签

foreach标签可以迭代生成一系列值,这个标签主要用于SQL的in语句。

修改User实体类,添加一个List类型的属性ids。

UserDAO.xml

测试:

可以看到,根据user参数的ids属性中id的个数,动态生成了SQL语句,查询出结果。

专业 热爱 专注

致力于最高效的Java学习

Java大联盟

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G08KA200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券