MyBatis初探四

一、 IF 判断

  1. 需要额外定义一个查询类来封装查询对象( getXX setXX )。

  2. 编写mapper.xml文件

  3. 测试


  4. package com.ts.dao.vo;
    
    import com.ts.domain.Users;
    /**
     * 复杂条件查询VO
     * @author TS
     *
     */
    public class UsersQueryVo {
    
    	private Users users;
    
    	public Users getUsers() {
    		return users;
    	}
    
    	public void setUsers(Users users) {
    		this.users = users;
    	}	
    }
package com.ts.domain;

import java.util.Date;
/*实体Bean*/
public class Users {
	
	public Users() {}

	public Users(String name,Date birth, String sex , String address) {
		this.name = name;
		this.sex = sex;
		this.birth = birth;
		this.address = address;
	}
	private int id;
	private String name;
	private String sex;
	private Date birth;
	private String address;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "Users [id=" + id + ", name=" + name + ", sex=" + sex + ", birth=" + birth + ", address=" + address + "]";
	}
}
	<select id="findUserList" parameterType="com.ts.dao.vo.UsersQueryVo" resultType="com.ts.domain.Users">
		select * from Users
		<!-- 可以自动去掉条件中的第一个and -->
		<where>
			<if test="users!=null">
				<if test="users.sex!=null and users.sex!=''">
					and users.sex = #{users.sex}
				</if>
				<if test="users.name!=null and users.name!=''">
					and users.name like '%${users.name}%'
				</if>
			</if>
		</where>
	</select>
//动态SQL测试
	@Test
	public void testDynamicSql() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		UsersQueryVo uv = new UsersQueryVo();
		uv.setUsers(new Users("田", null, null, null));
		List<Users> list = userMapper.findUserList( null );
		System.out.println(list);
	}

二、sql片段( 本质是:抽出IF重复判断逻辑 )

  1. 定义SQL片段

    2.引用SQL片段

<!-- SQL片段
		1.最好基于单表来定义SQL片段,如果涉及多表查询,可以把单表的SQL判断组合起来。可重用高
		2.在SQL片段里不要包含where,因为可能一个SQL引用多个SQL片段。一条SQL只能有一个where条件。
	 -->
	<sql id="queryUsersWhere">
			<if test="users!=null">
				<if test="users.sex!=null and users.sex!=''">
					and users.sex = #{users.sex}
				</if>
				<if test="users.name!=null and users.name!=''">
					and users.name like '%${users.name}%'
				</if>
			</if>
	</sql>
	
	<!-- 引用SQL片段 -->
	<select id="findUserList" parameterType="com.ts.dao.vo.UsersQueryVo" resultType="com.ts.domain.Users">
		select * from Users
		<where>
			<include refid = "queryUsersWhere"></include><!-- 如果SQL片段的id不在本mapper文件中,需要加上namespace -->
		</where>
	</select>

三、sql-foreach判断( 如果向SQL传递数据或者List,Mybatis使用foreach解析 )





你可能感兴趣的:(MyBatis初探四)