• 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();
    	}
    }
    

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

  • 相关阅读:
    php网摘收藏
    php优秀网摘
    jquery ajax thinkphp异步局部刷新完整流程
    easyui的accordion为动态生成,accordion的onSelect方法中又动态生成tree,为什么要第二次选择accordion,tree才生成出来
    php导出CSV文件时身份证号码显示为科学计数的解决方法
    php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法
    JQuery实战教程即将面市
    在windows+apache环境下安装ioncube
    PHP长文章分页 实现手动分页代码 代码简单
    DEDE非内容页调用自定义字段使用方法
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812088.html
Copyright © 2020-2023  润新知