Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解
程序员文章站
2024-03-13 18:45:09
动态sql就是动态的生成sql。
if标记
假设有这样一种需求:查询用户,当用户名不等于“admin”的时候,我们还需要密码为123456。
数据库中的数据为:...
动态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标记实例详解,希望对大家有所帮助