Mybatis之动态sql
来源:互联网 发布:家庭复式记账软件 编辑:程序博客网 时间:2024/05/22 00:50
Mybatis之动态sql
- Mybatis之动态sql
- if标签
- where标签
- trim标签
- foreach 标签
- set标签
- Sql片段
Mybatis的动态SQL通过 if, choose, when, otherwise, trim, where, set, foreach标签,组合成非常灵活的SQL语句,从而提高开发人员的效率。
if标签
<!-- 根据条件查询用户 --><select id="findUserByWhere" parameterType="user" resultType="user"> SELECT id, username, birthday, sex, address FROM `user` WHERE 1=1 <if test="sex != null and sex != ''"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username LIKE '%${username}%' </if></select>
注意字符串类型的数据需要要做不等于空字符串校验。
上面的sql还有where 1=1 这样的语句,很麻烦
可以使用where标签进行改造UserMapper.xml,如下
where标签
<!-- 根据条件查询用户 --><select id="findUserByWhere" parameterType="user" resultType="user"> SELECT id, username, birthday, sex, address FROM `user`<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 --> <where> <if test="sex != null"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username LIKE '%${username}%' </if> </where></select>
trim标签
<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
当WHERE后紧随AND或则OR的时候,就去除AND或者OR。
foreach 标签
UserMapper.xml添加sql,如下:
<!-- 根据ids查询用户 --><select id="findUserByIds" parameterType="queryVo" resultType="user"> SELECT * FROM `user` <where> <!-- foreach标签,进行遍历 --> <!-- collection:遍历的集合,这里是QueryVo的ids属性 --> <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 --> <!-- open:在前面添加的sql片段 --> <!-- close:在结尾处添加的sql片段 --> <!-- separator:指定遍历的元素之间使用的分隔符 --> <foreach collection="list" item="id" open="id IN (" close=")" separator=","> #{id} </foreach> </where></select>
测试方法如下图:
@Testpublic void testFindUserByIds() { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用userMapper执行根据条件查询用户 List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(10); ids.add(24); List<User> list = userMapper.findUserByIds(ids); for (User u : list) { System.out.println(u); } // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close();}
set标签
<update id="updateUser" parameterType="User"> update user set <if test="name != null"> name = #{name}, </if> <if test="password != null"> password = #{password}, </if> <if test="age != null"> age = #{age} </if> <where> <if test="id != null"> id = #{id} </if> and deleteFlag = 0; </where></update>
如果只有name不为null, 那么这SQL就成了 update set name = #{name}, where …….. ? name后面那逗号会导致出错。
可以通过set标签改造:
<update id="updateUser" parameterType="User"> update user <set> <if test="name != null">name = #{name},</if> <if test="password != null">password = #{password},</if> <if test="age != null">age = #{age},</if> </set> <where> <if test="id != null"> id = #{id} </if> and deleteFlag = 0; </where></update>
这个用trim 可表示为:
<trim prefix="SET" suffixOverrides=","> ...</trim>
WHERE是使用的 prefixOverrides(前缀), SET是使用的 suffixOverrides (后缀)!
Sql片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。
把上面例子中的id, username, birthday, sex, address提取出来,作为sql片段,如下:
<!-- 根据条件查询用户 --><select id="findUserByWhere" parameterType="user" resultType="user"> <!-- SELECT id, username, birthday, sex, address FROM `user` --> <!-- 使用include标签加载sql片段;refid是sql片段id --> SELECT <include refid="userFields" /> FROM `user` <!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 --> <where> <if test="sex != null"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username LIKE '%${username}%' </if> </where></select><!-- 声明sql片段 --><sql id="userFields"> id, username, birthday, sex, address</sql>
如果要使用别的Mapper.xml配置的sql片段,可以在refid前面加上对应的Mapper.xml的namespace
阅读全文
1 0
- mybatis之动态SQL
- MyBatis之动态SQL
- Mybatis之动态sql
- mybatis之动态SQL
- MyBatis之动态sql
- Mybatis之动态 SQL
- Mybatis之动态sql
- MyBatis之动态SQL语句
- mybatis之动态sql总结
- Mybatis小结之动态sql
- mybatis学习之动态SQL
- mybatis之动态sql(八)
- Mybatis系列之动态SQL
- mybatis 动态sql之foreach
- mybatis之动态sql语句
- MyBatis学习 之 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- Bellman
- 廖雪峰Git教程读书笔记
- POJ-1979 Red and Black
- 微信支付回掉不走
- 阿里物联网套件-服务端SDK学习实践(基础篇-4查询产品类型信息)
- Mybatis之动态sql
- 342. Power of Four
- 上传本地项目 到GitHub然后显示html页面
- 组合模式
- 【栈】UVA
- 查找一个数组中第k小的数
- XML
- 解决方案:WindowsError: [Error 2]
- OpenDDS开发手册---第一章2