Mybatis1.4——动态sql

JavaWeb框架学习文章索引
动态sql:
动态sql是sql语句进行进行的一种灵活操作,可以对sql语句进行拼接,组装。
以下例子在上一篇文章的基础上进行
Mybatis1.3——输入映射和输出映射

例1,查询user表中年级大于20并且名字中带有张三字样的人,要求sql语句传入参数进行判断。
xml:

		<select id="findUserList2" parameterType="com.hhh.dao.UserQueryVo" 
		resultType="com.hhh.dao.UserCustom">
			select * from user
			<!-- 使用where的时候可以省略第一个语句的and -->
			<where>
				<!-- test中填的是一个可以进行判断的条件 -->
				<if test="userCustom.age != null">
					and age > #{userCustom.age} 
				</if>
				<if test="userCustom.name !=null and userCustom.name != ''">
					and name like '%${userCustom.name}%'
				</if>
			</where>
		</select>

上面定义的xml就可以用于实现查询user表中age大于20,并且名字类似张三的查询。
并且当我们传入的age为null的时候,这个语句就只会查询名字类似张三的查询。当传入的张三为null或者空串的时候,这个语句就只会查询age大于20的数据。当两个条件都不满足的时候,查询结果则为所有的数据。

UserMapper中的方法定义:

public List<UserCustom> findUserList2(UserQueryVo userQueryVo) throws Exception;

测试:

	@Test
	public void test6() throws Exception {
		InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//由于创建的是源码包,所以可以直接读
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	
		UserCustom userCustom = new UserCustom();
		//suserCustom.setAge(20);
		userCustom.setName("张三");
		UserQueryVo userQueryVo = new UserQueryVo();
		userQueryVo.setUserCustom(userCustom);
		
		List<UserCustom> list = mapper.findUserList2(userQueryVo);
		System.out.println(list.toString());
		sqlSession.close();
	}

上面的代码中,将传入的age屏蔽掉,那么传入进去的age为空。
测试结果:
结果
如图所示,查询的内容为名字中带张三的,其中存在age为20的,说明没有对age进行判断。

Sql片段:
在上面的实例中,将sql语句进行了拆分形式的使用,为了提高语句的可重用性,可以将语句单独定义出来进行引用。

<sql id="sql1">
	<!-- sql片段中尽量不要有where
		一般基于单表
	 -->
	<if test="userCustom.age != null">
		and age > #{userCustom.age} 
	</if>
	<if test="userCustom.name !=null and userCustom.name != ''">
		and name like '%${userCustom.name}%'
	</if>		
</sql>

<select id="findUserList2" parameterType="com.hhh.dao.UserQueryVo" 
		resultType="com.hhh.dao.UserCustom">
	select * from user
	<!-- 使用where的时候可以省略第一个语句的and -->
	<where>
		<!-- refid填的是引用的sql片段的id,如果引用的片段不在本xml中,需要加上namespace -->
		<include refid="sql1"></include>
	</where>
.</select>

使用foreach
假设要实现以下语句

select * from user where id = 1 or id = 3 or id = 5
select * from user where id in(1,3,5)

xml配置:

		<sql id="sql2">
			<if test="userCustom.id != null">
				<!-- 
					collection:指定集合(和java代码中属性名相同)
					open:指定开始符号
					close:指定结束符号
					separator:指定参数之间的符号
				 -->
				 <!-- 注意这里and 和(不能后挨到一起 -->
				<foreach collection="ids" item="user_id" open="and (" close=")" separator="or">
					id = #{user_id}
				</foreach>
			</if>
		</sql>

		<select id="findUserList2" parameterType="com.hhh.dao.UserQueryVo" 
		resultType="com.hhh.dao.UserCustom">
			select * from user
			<where>
				<include refid="sql2"></include>
			</where>
		</select>

由于使用了List所以需要在UserCustom中添加List集合,添加后如下:

public class UserQueryVo {
	private UserCustom userCustom;
	private List<Integer> ids;
	public List<Integer> getIds() {
		return ids;
	}
	public void setIds(List<Integer> ids) {
		this.ids = ids;
	}
	public UserCustom getUserCustom() {
		return userCustom;
	}
	public void setUserCustom(UserCustom userCustom) {
		this.userCustom = userCustom;
	}
}

测试方法:

	@Test
	public void test7() throws Exception {
		InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//由于创建的是源码包,所以可以直接读
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	
		UserCustom userCustom = new UserCustom();
		UserQueryVo userQueryVo = new UserQueryVo();
		userQueryVo.setUserCustom(userCustom);
		//添加条件
		List<Integer> ids = new ArrayList<>();
		ids.add(1);
		ids.add(3);
		ids.add(5);
		userQueryVo.setIds(ids);
		
		List<UserCustom> list = mapper.findUserList2(userQueryVo);
		System.out.println(list.toString());
		sqlSession.close();
	}

结果:
结果

同理第二中方式的sql改写方式如下:

		<sql id="sql3">
			<if test="userCustom.id != null">
				<foreach collection="ids" item="user_id" open="and id in (" close=")" separator=",">
					#{user_id}
				</foreach>
			</if>
		</sql>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值