zoukankan      html  css  js  c++  java
  • MyBatis框架:第九章:动态SQL语句

    准备工作:

    public class User {
    private int id;
    private String lastName;
    private int sex;

    14.1、if 语句
    说明: if语句,可以动态的根据你的值来决定,是否需要动态的添加查询条件。

    UserMapper类中的方法

    public interface UserMapper {
    	public List<User> queryUsersByNameAndSex(User user);
    }
    

    UserMapper配置文件中的配置

    <!-- 
    	if语句
     -->
    <select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
    	select id,last_name lastName,sex  from t_user where 
    	<!-- 我们希望动态的创建这个条件语句 -->
    	<if test="lastName != null">
    		last_name like concat('%',#{ lastName },'%')
    	</if>
    	<if test="sex == 0 or sex == 1">
    		and sex = #{sex}
    	</if>
    </select>
    

    测试代码:

    @Test
    public void testQueryUsersByNameAndSex() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);			  
    		List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 1));			
    		System.out.println(users);			
    	} finally {
    		session.close();
    	}
    }
    

    执行的结果:
    在这里插入图片描述
    14.2、where 语句
    说明: where语句,可以帮我们在多个动态语句中,有效的去掉前面的多余的and 或 or 之类的多余关键字

    UserMapper配置文件

    <!-- 
    	where - if语句
     -->
    <select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.atguigu.bean.User">
    	select id,last_name lastName,sex  from t_user  
    	<where>
    		<!-- 我们希望动态的创建这个条件语句 -->
    		<if test="lastName != null">
    			last_name like concat('%',#{ lastName },'%')
    		</if>
    		<if test="sex == 0 or sex == 1">
    			and sex = #{sex}
    		</if>
    	</where>
    </select>
    

    测试的代码是:

    @Test
    public void testQueryUsersByNameAndSex() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);			  
    		List<User> users = userMapper.queryUsersByNameAndSex(new User(0, null, 1));			
    		System.out.println(users);			
    	} finally {
    		session.close();
    	}
    }
    

    测试的结果:
    在这里插入图片描述
    14.3、trim语句
    说明: trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容
    prefix 前面添加内容
    suffix 后面添加内容
    suffixOverrides 去掉的后面内容
    prefixOverrides 去掉的前面内容

    UserMapper配置文件中的内容

    <!-- 
    	trim - if 语句
     -->
    <select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
    	select id,last_name lastName,sex  from t_user  
    	<!-- 
    		trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容
    			prefix 前面添加内容
    			suffix 后面添加内容
    			suffixOverrides 去掉的后面内容
    			prefixOverrides 去掉的前面内容
    	 -->
    	<trim prefix="where" suffixOverrides="and" prefixOverrides="">
    		<!-- 我们希望动态的创建这个条件语句 -->
    		<if test="lastName != null">
    			last_name like concat('%',#{ lastName },'%') and
    		</if>
    		<if test="sex == 0 or sex == 1">
    		 	sex = #{sex}
    		</if>
    	</trim>
    </select>
    

    测试代码:

    @Test
    public void testQueryUsersByNameAndSex() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);			  
    		List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 5));			
    		System.out.println(users);			
    	} finally {
    		session.close();
    	}
    }
    

    测试的结果:
    在这里插入图片描述
    14.4、choose( when , otherwise )语句
    说明:choose when otherwise 可以执行多路选择判断,但是只会有一个分支会被执行。
    类似switch case 语句

    UserMapper接口中添加的方法:

    public List<User> queryUsersByNameAndSexForChoose(User user);
    

    UserMapper配置文件的内容:

    <!-- 
    	choose when otherwise 语句
    	有点类似于switch case 多路判断。只执行一路。
     -->
    <select id="queryUsersByNameAndSexForChoose" parameterType="com.bean.User" 
    	resultType="com.bean.User">
    	select id,last_name lastName,sex  from t_user  
    	<where>
    		<choose>
    			<when test="id > 0">
    				id = #{ id }
    			</when>
    			<when test="lastName != null">
    				last_name = #{lastName}
    			</when>
    			<otherwise>
    				1 = 1
    			</otherwise>
    		</choose>
    	</where>		
    </select>
    

    测试的代码:

    @Test
    public void testQueryUsersByNameAndSexForChoose() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);
    		List<User> users = userMapper.queryUsersByNameAndSexForChoose(new User(1, "admin", 0));
    		System.out.println(users);
    	} finally {
    		session.close();
    	}
    }
    

    测试的结果:
    在这里插入图片描述
    14.4、set语句
    说明: set语句可以去掉,更新时候,set更新的多个列,由于动态生成的sql语句,而导致多出来的逗号

    UserMapper中添加的方法
    public int updateUserForSet(User user);

    UserMapper配置文件中的内容:

    <!-- 
    	update语句
    	set标签,可以去掉,多个列中的逗号
     -->
    <update id="updateUserForSet" parameterType="com.bean.User">
    	update t_user 
    	<set>
    		<if test="lastName != null">
    			last_name = #{lastName},
    		</if>
    		<if test="sex == 0 or sex == 1">
    			sex = #{sex}
    		</if>
    	</set>
    	where id = #{id}
    </update>
    

    测试代码:

    @Test
    public void testUpdateUserForSet() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);
    		userMapper.updateUserForSet(new User(3, "xxxx", 10));
    		session.commit();
    	} finally {
    		session.close();
    	}
    }
    

    测试结果:
    在这里插入图片描述
    14.5、foreach语句
    说明: foreach语句,可以遍历输出一个集合的数据

    在UserMapper中添加的方法

    public List<User> queryUserByidsForIn(@Param("ids")List<Integer> ids);
    

    UserMapper配置文件中的内容

    <!-- 
    	foreach语句可以遍历输出数据
    		collection属性设置遍历的集合
    		open 属性设置遍历输出前的内容
    		close 属性设置遍历输出后的内容
    		separator 属性设置每输出一个元素中间的间隔内容
    		item 属性 当前正在遍历到的数据名
     -->
    <select id="queryUserByidsForIn" resultType="com.bean.User">
    	select id,last_name,sex from t_user
    	where 
    		id in 
    	<foreach collection="ids" open="(" close=")" separator="," item="item_id">
    		#{item_id}
    	</foreach>
    </select>
    

    测试代码:

    @Test
    public void testQueryUserByidsForIn() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);
    		List<Integer> ids = new ArrayList<>();
    		ids.add(3);
    		ids.add(6);
    		ids.add(7);			
    		List<User> users = userMapper.queryUserByidsForIn( ids );
    		System.out.println(users);
    	} finally {
    		session.close();
    	}
    }
    

    测试结果:
    在这里插入图片描述

  • 相关阅读:
    《DSP using MATLAB》 示例 Example 9.12
    《DSP using MATLAB》示例 Example 9.11
    《DSP using MATLAB》示例 Example 9.10
    《DSP using MATLAB》示例Example 9.9
    《DSP using MATLAB》示例 Example 9.8
    《DSP using MATLAB》示例Example 9.7
    《DSP using MATLAB》示例 Example 9.6
    《DSP using MATLAB》示例Example 9.5
    《DSP using MATLAB》示例 Example 9.4
    (转载)【C++11新特性】 nullptr关键字
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812088.html
Copyright © 2011-2022 走看看