欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-13 18:45:09
动态sql就是动态的生成sql。 if标记 假设有这样一种需求:查询用户,当用户名不等于“admin”的时候,我们还需要密码为123456。 数据库中的数据为:...

动态sql就是动态的生成sql。

if标记

假设有这样一种需求:查询用户,当用户名不等于“admin”的时候,我们还需要密码为123456。

数据库中的数据为:

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

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();
}
}

运行结果为:

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

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();
}
}

结果为:

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

假设不设置用户名这个条件,即注释掉jikeuser.setusername("yen");:

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

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>

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

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>

操作之前的数据:

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

操作:

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

操作结果:

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

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

<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>

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

foreach标记

通常用于循环查询或循环赋值

Mybatis动态SQL之if、choose、where、set、trim、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标记实例详解

以上所述是小编给大家介绍的mybatis动态sql之if、choose、where、set、trim、foreach标记实例详解,希望对大家有所帮助