mybatis 动态Sql
Posted 一杯水M
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 动态Sql相关的知识,希望对你有一定的参考价值。
一、什么是动态sql
对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装
二、where
<select id="findUserlist" parameterType="com.xxx.mybatis.po.UserQueryVo" resultType="com.xxx.mybatis.po.UserExtend"> select * from t_user <!-- where可以自动去掉条件中的第一个and --> <where> <if test="userExtend!=null"> <if test="userExtend.sex!=null and userExtend.sex!=\'\'"> and sex = #{userExtend.sex} </if> <if test="userExtend.username!=null and userExtend.username!=\'\'"> and userName LIKE CONCAT(\'%\',#{userExtend.username},\'%\' ) </if> </if> </where> </select>
三、sql片段
其它的statement中就可以引用sql片段,方便程序员进行开发
定义sql片段
<sql id="query_user_where"> <if test="userExtend!=null"> <if test="userExtend.sex!=null and userExtend.sex!=\'\'"> and sex = #{userExtend.sex} </if> <if test="userExtend.username!=null and userExtend.username!=\'\'"> and userName LIKE CONCAT(\'%\',#{userExtend.username},\'%\' ) </if> </if> </sql>
引用sql片段,如果refid指定id不在本mapper.xml文件中,需要前面加命名空间点(格式:namespace+"."+id)
<where> <include refid="query_user_where" /> </where>
sql片段不要写where
四、foreach
向sql传递数组或List,mybatis使用foreach解析
1、在输入参数类型中添加List<Integer> ids传入多个id
public class UserQueryVo { private List<Integer> ids;
2、mapper.xml
<select id="findUserlist" parameterType="com.xxx.mybatis.po.UserQueryVo" resultType="com.xxx.mybatis.po.UserExtend"> select * from t_user <where> <include refid="query_user_where"/> <if test="ids!=null"> <!-- collection:指定输入对象中集合属性 item:遍历集合中项目名 open:sql开始遍历前和别的sql语句的连接串(and / or) close:结束遍历时拼接的串 separator:遍历的项目之间拼接的字符串 --> <!-- 实现 and (id=1 OR id=10 OR id=16) --> <foreach collection="ids" item="id" open="And (" close=")" separator="Or"> id=#{id} </foreach> <!-- 实现 and IN(1,10,16) --><!-- <foreach collection="ids" item="userid" open="And IN(" close=")" separator=","> #{userid} </foreach> --> </if> </where> </select>
3、测试代码
@Test void testFindUserList() { UserMapper userMapper = sqlSessionFactory.openSession().getMapper(UserMapper.class); UserQueryVo queryVo=new UserQueryVo(); UserExtend userExtend=new UserExtend(); userExtend.setSex("0"); userExtend.setUsername("小"); queryVo.setUserExtend(userExtend); List<Integer> ids=new ArrayList<Integer>(); ids.add(1); ids.add(10); ids.add(9); queryVo.setIds(ids ); List<UserExtend> list = userMapper.findUserlist(queryVo); System.out.println(list); }
以上是关于mybatis 动态Sql的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取
mybatis动态sql之利用sql标签抽取可重用的sql片段
MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段