MyBatis动态SQL

1 if标签

以根据条件查询用户为例,当我们在UserMapper.xml配置文件中写上sql语句

    <select id="queryUserByCondition" parameterType="user" resultType="user">
        select * from user where sex=#{sex} and username like '%${username}%'   
    </select>

测试代码上写上如下代码;

	void testqueryUserByCondition() {
		SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		User user = new User();
		user.setSex("1");
		user.setUsername("张");
		List<User> userList= mapper.queryUserByCondition(user);
		for(User user2:userList)
		System.out.println(user2);
		sqlSession.close();
	}

这样能够从数据库中查询到对应的记录,但是当我们将user.setSex("1")注释以后,就无法从数据库中查询到对应的数据,这时可以用MyBatis动态SQL中的if标签解决

将上述的UserMapper.xml改成如下所示

    <!-- if标签用于条件判断 -->
    <select id="queryUserByCondition" parameterType="user" resultType="user">
        select * from user where 1=1
        <if test="sex!=null and sex!=''">
             and sex=#{sex}
        </if>
        <if test="username!=null and username!=''">
            and username like '%${username}%'   
        </if>       
    </select>

再运行测试代码,发现没有问题了。 

2 where标签

看上面的代码还有where 1=1 这样的语句,可以利用where标签进行改造,它的作用就是可以自动添加where,同时处理sql语句中第一个前and关键字(在下面的打括号的and可要可不要,where标签会处理)

    <select id="queryUserByCondition2" parameterType="user" resultType="user">
        select * from user 
        <where>
            <if test="sex!=null and sex!=''">
                  (and) sex=#{sex}
            </if>
            <if test="username!=null and username!=''">
                and username like '%${username}%'   
            </if>
        </where>       
    </select>

3 sql片段

sql片段可将重复的sql提取出来,最终达到sql重用的目的。

	 <sql id="userQuery">
	     select * from user
	 </sql>

引用的时候使用include标签(<include refid="userQuery"/>) 

<select id="queryUserByCondition3" parameterType="user" resultType="user">
         <include refid="userQuery"/>
        <where>
            <if test="sex!=null and sex!=''">
                 and sex=#{sex}
            </if>
            <if test="username!=null and username!=''">
                and username like '%${username}%'   
            </if>
        </where>       
    </select>

4 forEach

当我们向sql传递数组或List,mybatis使用foreach解析

以右边的SQL语句为例: SELECT * FROM user WHERE id IN (24,31,39)

4.1 Mapper.xml

    <select id="getUserByIds" parameterType="user" resultType="user">
         <include refid="userQuery"/>
         <where>
             <!-- forEach标签 -->
             <!-- collection:要遍历的集合 -->
             <!-- open:循环开始之前输出的内容 -->
             <!-- item:设置循环变量 -->
             <!-- separator:分隔符 -->
             <!-- close:循环结束之后输出的内容 -->
             <foreach collection="ids" item="item" open="id in(" close=")" separator=",">
                 #{item}
             </foreach>
         </where>
    </select>

4.2 User对象(有一个ids属性,与foreach标签的collection对应

package com.itykd.domain;

import java.util.Date;
import java.util.List;

public class User {
	private int id;
	private int[] ids;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
    //省略get、set、toString方法
}

4.3 测试类

	void testGetUserByIds() {
		SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		User user = new User();
		int[] array= new int[] {24,31,39};
		user.setIds(array);
		List<User> userList= mapper.getUserByIds(user);
		for(User user2:userList)
			System.out.println(user2);
		sqlSession.close();
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值