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

 更新时间:2016年09月07日 10:05:08   作者:YEN_CSDN  
动态SQL就是动态的生成SQL。接下来通过本文给大家介绍Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解的相关知识,感兴趣的朋友一起看看吧

动态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标记实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • springboot中的pom文件 project报错问题

    springboot中的pom文件 project报错问题

    这篇文章主要介绍了springboot中的pom文件 project报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringCloud使用Zookeeper作为注册中心

    SpringCloud使用Zookeeper作为注册中心

    这篇文章主要介绍了SpringCloud如何使用Zookeeper作为注册中心,帮助大家更好的理解和学习使用Zookeeper,感兴趣的朋友可以了解下
    2021-04-04
  • 详解java枚举用法及实例

    详解java枚举用法及实例

    这篇文章主要介绍了Java枚举详解及使用实例,本文直接给出实例代码,需要的朋友可以参考下
    2017-04-04
  • Java中终止线程的三种方法

    Java中终止线程的三种方法

    这篇文章主要为大家详细介绍了Java中终止线程的三种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JVM方法调用invokevirtual详解

    JVM方法调用invokevirtual详解

    JVM调用方法有五条指令,分别是invokestatic,invokespecial,invokevirtual,invokeinterface,invokedynamic,这篇文章主要说明invokevirtual方法的调用问题,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-03-03
  • Sentinel的熔断降级、资源规则详解与实例

    Sentinel的熔断降级、资源规则详解与实例

    这篇文章主要介绍了Sentinel的熔断降级、资源规则详解与实例,Sentinel是阿里巴巴开源的一款流量控制和熔断降级的框架,它主要用于保护分布式系统中的服务稳定性,Sentinel通过对服务进行流量控制和熔断降级,可以有效地保护系统的稳定性,需要的朋友可以参考下
    2023-09-09
  • java实现新浪微博Oauth接口发送图片和文字的方法

    java实现新浪微博Oauth接口发送图片和文字的方法

    这篇文章主要介绍了java实现新浪微博Oauth接口发送图片和文字的方法,涉及java调用新浪微博Oauth接口的使用技巧,具有一定参考接借鉴价值,需要的朋友可以参考下
    2015-07-07
  • springboot验证码的生成与验证的两种方法

    springboot验证码的生成与验证的两种方法

    本文主要介绍了springboot验证码的生成与验证的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • java实现将文件上传到ftp服务器的方法

    java实现将文件上传到ftp服务器的方法

    这篇文章主要介绍了java实现将文件上传到ftp服务器的方法,结合实例形式分析了基于java实现的ftp文件传输类定义与使用方法,需要的朋友可以参考下
    2016-08-08
  • 完美解决Get和Post请求中文乱码的问题

    完美解决Get和Post请求中文乱码的问题

    下面小编就为大家带来一篇完美解决Get和Post请求中文乱码的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05

最新评论