手机
当前位置:查字典教程网 >编程开发 >Java >Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解
Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解
摘要:动态SQL就是动态的生成SQL。if标记假设有这样一种需求:查询用户,当用户名不等于“admin”的时候,我们还需要密码为123456。数据...

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

if标记

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

数据库中的数据为:

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

MyBatisConfig.xml

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

<"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标记实例详解2

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标记实例详解3

假设不设置用户名这个条件,即注释掉jiKeUser.setUserName("YEN");:

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

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标记实例详解5

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标记实例详解6

操作:

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

操作结果:

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

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

<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标记实例详解10

foreach标记

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

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

<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标记实例详解12

以上所述是小编给大家介绍的Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解,希望对大家有所帮助,如果大家有任何疑问请给我们留言,小编会及时回复大家的。在此也非常感谢大家对查字典教程网的支持!

【Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解】相关文章:

基于Java实现缓存Cache的深入分析

java使用命令行打包JAR

java类型生命周期的详细解析

java swing编程入门代码编写(java编程入门)

java删除文件和文件夹具体实现

将字符串数字格式化为样式1,000,000,000的方法

Java 正则表达式 解释说明

Java设计模式之Iterator模式介绍

Java中的static静态代码块的使用详解

Java多线程的用法详解

精品推荐
分类导航