动态SQL就是动态的生成SQL。
if标记
假设有这样一种需求:查询用户,当用户名不等于“admin”的时候,我们还需要密码为123456。
数据库中的数据为:
MyBatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--定义别名 注意typeAliases一定要在environments之前--> <typeAliases> <typeAlias type="jike.book.pojo.JiKeUser" alias="JiKeUser"/> <typeAlias type="jike.book.pojo.Author" alias="Author"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/jikebook"/> <property name="username" value="root"/> <property name="password" value="*****"/> </dataSource> </environment> </environments> <mappers> <mapper resource="jike/book/map/jikeUser.xml"/> </mappers> </configuration>
JiKeUser.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="/"> <select id="selectSQL" resultType="JiKeUser" parameterType="JiKeUser"> SELECT * FROM jikebook.jikeuser WHERE 1=1 <if test="userName!='admin'"> AND password=#{password} </if> </select> </mapper>
测试类:
package jike.book.test; import jike.book.pojo.JiKeUser; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.Reader; import java.util.List; /** * DateTime: 2016/9/6 13:36 * 功能: * 思路: */ public class TestSQL { public static void main(String[] args) { // 资源路径 String resource="jike/book/map/MyBatisConfig.xml"; Reader reader=null; SqlSession session; try { reader= Resources.getResourceAsReader(resource); } catch ( IOException e ) { e.printStackTrace(); } SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader); session=sqlMapper.openSession(); JiKeUser jiKeUser=new JiKeUser(); jiKeUser.setPassword("123456"); List<JiKeUser> userList=session.selectList("selectSQL",jiKeUser); for ( JiKeUser user:userList ) { System.out.println("userName:"+user.getUserName()); } session.close(); } }
运行结果为:
choose标记
假设我们当前有这么一个需求:查询用户,如果用户名不为空就加上用户名这个条件,如果id不为空也加上id这个条件,否则的话就是设置密码不为空,这就是一个多路选择。
MyBatisConfig.xml不改变,在JikeUser.xml中加上:
<select id="selectJiKeUserChoose" resultType="JiKeUser" parameterType="JiKeUser"> select * from jikeuser where 1=1 <choose> <when test="userName!=null"> and userName like #{userName} </when> <when test="id!=0"> and id =#{id} </when> <otherwise> and password is not null </otherwise> </choose> </select>
测试类:假设用户名不为空:
package jike.book.test; import jike.book.pojo.JiKeUser; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.Reader; import java.util.List; /** * DateTime: 2016/9/6 13:36 * 功能: * 思路: */ public class TestSQL { public static void main(String[] args) { // 资源路径 String resource="jike/book/map/MyBatisConfig.xml"; Reader reader=null; SqlSession session; try { reader= Resources.getResourceAsReader(resource); } catch ( IOException e ) { e.printStackTrace(); } SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader); session=sqlMapper.openSession(); JiKeUser jiKeUser=new JiKeUser(); jiKeUser.setUserName("YEN"); List<JiKeUser> userList=session.selectList("selectJiKeUserChoose",jiKeUser); for ( JiKeUser user:userList ) { System.out.println("userName:"+user.getUserName()); } session.close(); } }
结果为:
假设不设置用户名这个条件,即注释掉jiKeUser.setUserName("YEN");:
where标记、set标记
上面我们在choose中查询是不能确定子连接条件中的and是写还是不写,因此加了一个1=1.而where会只能的去判断该不该加。
<select id="selectJiKeUserWhere" resultType="JiKeUser" parameterType="JiKeUser"> select * from jikeuser <where> <if test="userName!=null"> and userName like #{userName} </if> <if test="id!=null"> and id =#{id} </if> </where> </select>
set标记智能赋值,会自动去掉多余的”,”。
<update id="updateJiKeUserSet" parameterType="JiKeUser"> update JiKeUser <set> <if test="userName != null">userName=#{userName},</if> <if test="password != null">password=#{password},</if> </set> where id=#{id} </update>
操作之前的数据:
操作:
操作结果:
<update id="updateUserTrim" parameterType="JiKeUser"> UPDATE JiKeUser <trim prefix="SET" suffixOverrides="," suffix="WHERE id = #{id}" > <if test="userName != null and userName != '' "> userName = #{userName}, </if> <if test="password != null and password != '' "> password=#{password}, </if> </trim> </update>
foreach标记
通常用于循环查询或循环赋值
<select id="selectJiKeUserForeach" resultType="JiKeUser" parameterType="list"> select * from jikeuser <where> id in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </where> </select>
测试:
以上所述是小编给大家介绍的Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
1. 前言 在前面的小节中,我们一起学习了 if 标签,在通过 if 判断动态插入或查询的时候容易产生多余的前缀(如 WHERE)或后缀(如 , ),为了解决这类问题 MyBatis 提供了 where、set、trim 三个实用的标签。 其中 where 和 set 标签都是 trim 标签的一种特殊情况,不过使用频率非常高,因此被单独定义成了标签。本小节我们将一起来学习它们。 2. 定义 慕课
本文向大家介绍MyBatis动态Sql之if标签的用法详解,包括了MyBatis动态Sql之if标签的用法详解的使用技巧和注意事项,需要的朋友参考一下 最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动态的Sql,主要包含以下3个场景: 1.根据查询条件实现动态
本文向大家介绍Mybatis动态SQL实例详解,包括了Mybatis动态SQL实例详解的使用技巧和注意事项,需要的朋友参考一下 动态SQL 什么是动态SQL? MyBatis的官方文档中是这样介绍的? 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列
写了一个select的检索,但是一直提示报错:错误主要是多了一个where 报错信息 但是我用了trim,还是报同样的错误: 写的sql
本文向大家介绍详解Mybatis动态sql,包括了详解Mybatis动态sql的使用技巧和注意事项,需要的朋友参考一下 1.什么是mybatis动态sql 看到动态,我们就应该想到,这是一个可以变化的sql语句 MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑 2.mybatis动态sql使用前准备 a.数据库表 b.创建类 3.使用mybatis动
我的java代码: mymapper.xml: