mybatis IDEA——if和choose标签

if标签

如何实现用户高级查询功能,根据输入的条件查询用户信息,需要支持以下3种情况:
A.    当只输入用户名时,需要根据用户名来进行模糊查询
B.    当只输入邮箱时,根据邮箱进行完全匹配
C.    当同时输入用户名和邮箱时,同时用这两个条件来查询匹配的用户

(1)    在where条件中使用if

<select id="queryByUser" resultType="SysUser">
        select
        id,
        user_name,
        user_password,
        user_email,
        create_time
        from sys_user
        where 1 = 1
        <if test="userName != null and userName != ''">
            and user_name like concat('%',#{userName},'%')
        </if>
        <if test="userEmail != null and userEmail != ''">
            and user_email = #{userEmail}
        </if>
    </select>

测试类

    @Test
    public void testQueryByUser(){
        SqlSession sqlSession = getSqlSession();
        try{
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            SysUser query = new SysUser();
            query.setUserName("ad");
            List<SysUser> users = userMapper.queryByUser(query);
            Assert.assertTrue(users.size() > 0);

            query = new SysUser();
            query.setUserEmail("[email protected]");
            users = userMapper.queryByUser(query);
            Assert.assertTrue(users.size() > 0);

            query = new SysUser();
            query.setUserName("ad");
            query.setUserEmail("[email protected]");
            users = userMapper.queryByUser(query);
            Assert.assertTrue(users.size() == 0);
        }finally{
            sqlSession.close();
        }
    }

日志 

DEBUG [main] - ==>  Preparing: select id, user_name, user_password, user_email, create_time from sys_user where 1 = 1 and user_name like concat('%',?,'%') 
DEBUG [main] - ==> Parameters: ad(String)
TRACE [main] - <==    Columns: id, user_name, user_password, user_email, create_time
TRACE [main] - <==        Row: 1, admin, 123456, [email protected], 2018-01-01 00:00:00.0
DEBUG [main] - <==      Total: 1
DEBUG [main] - ==>  Preparing: select id, user_name, user_password, user_email, create_time from sys_user where 1 = 1 and user_email = ? 
DEBUG [main] - ==> Parameters: [email protected](String)
TRACE [main] - <==    Columns: id, user_name, user_password, user_email, create_time
TRACE [main] - <==        Row: 1001, test, 123456, [email protected], 2018-01-01 00:00:00.0
DEBUG [main] - <==      Total: 1
DEBUG [main] - ==>  Preparing: select id, user_name, user_password, user_email, create_time from sys_user where 1 = 1 and user_name like concat('%',?,'%') and user_email = ? 
DEBUG [main] - ==> Parameters: ad(String), [email protected](String)
DEBUG [main] - <==      Total: 0

 (2)    在update更新列中使用if,注意一定要加id = #{id}

    <update id="updateByIdSelective">
        update sys_user
        set
        <if test="userName != null and userName != ''">
            user_name = #{userName},
        </if>
        <if test="userPassword != null and userPassword != ''">
            user_password = #{userPassword},
        </if>
        <if test="userEmail != null and userEmail != ''">
            user_email = #{userEmail},
        </if>
        <if test="createTime != null and createTime != ''">
            create_time = #{createTime,jdbcType=TIMESTAMP},
        </if>
        id = #{id}
        where id = #{id}
    </update>

测试

    @Test
    public void testUpdateByIdSelective(){
        SqlSession sqlSession = getSqlSession();
        try{
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            SysUser user = new SysUser();
            user.setId(1L);
            //只更新Email
            user.setUserEmail("[email protected]");
            int result = userMapper.updateByIdSelective(user);
            Assert.assertEquals(1, result);

            user = userMapper.queryById(1L);
            //修改后名字不变,邮箱改变
            Assert.assertEquals("admin", user.getUserName());
            Assert.assertEquals("[email protected]", user.getUserEmail());
        }finally{
            sqlSession.close();
        }
    }

日志

DEBUG [main] - ==>  Preparing: update sys_user set user_email = ?, id = ? where id = ? 
DEBUG [main] - ==> Parameters: [email protected](String), 1(Long), 1(Long)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - ==>  Preparing: select * from sys_user where id = ? 
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <==    Columns: id, user_name, user_password, user_email, create_time
TRACE [main] - <==        Row: 1, admin, 123456, [email protected], 2018-01-01 00:00:00.0
DEBUG [main] - <==      Total: 1

(3)    在insert动态插入列中使用if

    <insert id="insertSelective" useGeneratedKeys="true" keyProperty="id">
        insert into sys_user(user_name,user_password,
        <if test="userEmail != null and userEmail != ''">
            user_email,
        </if>
        create_time)
        values(#{userName},#{userPassword},
        <if test="userEmail != null and userEmail != ''">
            #{userEmail},
        </if>
        #{createTime,jdbcType=TIMESTAMP})
    </insert>

 测试类

    @Test
    public void testInsertSelective(){
        try(SqlSession session = this.getSqlSession()){
            SysUserDao userDao = session.getMapper(SysUserDao.class);
            SysUser user = new SysUser();
            user.setUserName("张三");
            int result = userDao.insertSelective(user);
            session.commit();
            System.out.println(result);
        }
    }

日志

DEBUG [main] - ==>  Preparing: insert into sys_user(id,user_name,user_password, create_time) values(?,?,?, ?) 
DEBUG [main] - ==> Parameters: null, 张三(String), null, null
DEBUG [main] - <==    Updates: 1
1

 choose标签 

if标签无法提供if…else if…else..的逻辑,如果需要这样的逻辑,就需要用到choose标签。
实现根据id或者用户名查询用户

<!-- 根据Id或者用户名来查询数据 -->
	<select id="queryByIdOrUserName" resultType="SysUser">
		select id,
		   user_name,
		   user_password,
		   user_email,
		   create_time
		from sys_user
		where 1 = 1
		<choose>
			<when test="id != null">
				and id = #{id}
			</when>
			<when test="userName != null and userName != ''">
			    and user_name = #{userName}
			</when>
			<otherwise>
				and 1 = 0
			</otherwise>
		</choose>	
	</select>

测试类

    @Test
    public void testQueryByIdOrUsername(){
        try(SqlSession session = this.getSqlSession()){
            SysUserDao userDao = session.getMapper(SysUserDao.class);
            SysUser user = new SysUser();
            user.setUserName("t");
            user.setId(1L);
            List<SysUser> list = userDao.queryByIdOrUsername(user);
            System.out.println(list);
        }
    }

日志

DEBUG [main] - Cache Hit Ratio [com.etc.dao.SysUserDao]: 0.0
DEBUG [main] - ==>  Preparing: select * from sys_user where 1 = 1 and id = ? 
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <==    Columns: id, user_name, user_password, user_email, create_time
TRACE [main] - <==        Row: 1, admin, 123456, [email protected], 2018-01-01 00:00:00.0
Mon Jan 01 00:00:00 CST 2018
DEBUG [main] - <==      Total: 1
[SysUser{id=1, userName='admin', userPassword='123456', userEmail='[email protected]', createTime1=Mon Jan 01 00:00:00 CST 2018, roles=null, role=null}]

猜你喜欢

转载自blog.csdn.net/Milan__Kundera/article/details/82497099