当前位置: 移动技术网 > IT编程>开发语言>Java > Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解

Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解

2019年07月22日  | 移动技术网IT编程  | 我要评论

动态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标记实例详解,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网