3.1使用动态sql完成多条件查询
动态sql是mybatis的一个强大的特性,在使用JDBC操作数据时,如果查询条件特别多,将条件串联成sql字符串是一件痛苦的事情,通常的解决方法是写很多的if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字段的最后省略逗号。Mybatis使用 一种强大的动态sql语句来改善这种情况。动态sql基于ognl的表达式,可使我们方便的在sql语句中实现某些逻辑,用于实现动态sql的元素如下。
If:利用if实现简单的条件选择
Choose:相当于java中的switch语句,通常与when和otherwise搭配。
Where:简化sql语句找那个where的条件判断
Set:解决动态更新语句
Trim:可以灵活地去除多余的关键字
Foreach:迭代一个集合,通常用于in条件
3.2.1使用if+set改造更新操作
回顾之前的演示示例-修改用户信息操作,在该示例中,采用的是封装User对象入参,根据用户id进行用户信息修改,当操作数据的时候,每个字段都进行了赋值更新。但是在实际项目中,用户在进行信息的更新操作时,并不一定所有的数据都会进行修改,对应用户没有修改的数据,数据库不需要进行相应的更新操作,即更新用户表数据,若某个参数传入值为null时,不需要set该字段,那么现在就先测试一下之前的修改用户信息示例,观察是否满足正常的业务需求。
通过日志中的sql语句和参数,我们发现未被设值的参数也进行了set操作,那么如何解决?就需要使用动态sql中的set元素来处理。
Set元素主要用于更新操作,它的主要功能个where元素差不多,主要是在包含的语句前输出一个set,若包含的语句是以逗号结束的,会自动把该逗号忽略掉,在配合if元素就可以动态地更新需要修改的字段,而不需要修改的字段,则可以不在被更新
3.3.1 mybaits入参为数组类型的foreach迭代
我们先了解一下foreach的基本用法和属性,foreach主要用在构建in条件中,它可以在sql语句中迭代一个集合,它属性主要有item,index,collection,separator,close,open。下面通过一个根据指定角色列表来获取用户信息列表的示例进行详细介绍。
首先修改userMapper,增加接口方法:根据传入的用户角色列表获取该角色列表下的 用户信息,参数为角色列表,该参数类型为整型数组。
对于sql条件循环(in语句),需要使用foreach标签。通过上述代码,来介绍foreach的基本属性:
Item:表示集合中每一个元素进行迭代时的别名
Index:指定一个名称,用来表示在迭代过程中,每次迭代到的位置。
Open:表示该语句以什么开始(既然是in条件语句,所以必然是以(开始))
Separator:表示在每次进行迭代之间以什么符号作为分隔符
Close:表示该语句以什么结束
Collection:最关键并最容易出错的属性,需格外注意,该属性必须指定,不同情况下属性的值是不一样的。