动态sql和物理分页

发表时间:2017-05-17 17:32:05 浏览量( 29 ) 留言数( 0 )

学习目标:

1、条件查询的实现,使用动态sql

2、理解逻辑分页和物理分页

3、掌握物理分页的基本写法


学习过程:

一、动态sql

在学习jdbc和hibernate的时候,我们在实现条件查询的时候都是采用sql(hql)查询语句拼接的方式,那么下载使用mybatis由于所有的sql语句都是写在映射文件里面的,如何实现动态的条件查询功能呢个?这里我们就要学习一些mybatis的动态sql,mybatis的映射文件功能非常强大,支持类似jstl表达式一样的条件判断或者循环等,具体内容大家可以查询一下mybatis的官方说明

这里我们就简单句几个例子,比如现在需要根据商品名称或者商品描述模糊查询商品,当然如果用户没有输入商品名称就表示忽略这个查询条件,首先修改映射文件,实现这个功能,代码如下:

   <select id="selectConditon" parameterType="Goods" resultMap="goodsMap">
	select * from goods where 1=1
	<if test="goodsName != null">
		and goods_name like #{goodsName}
	</if>
	<if test="goodsDesc != null">
		and goods_desc like #{goodsDesc}
	</if>

</select>

对应的GoodsDao实现就比较简单了。代码如下:

   public List<Goods> queryGoods(Goods condition) {
		SqlSession session = MyBacticUtil.getSqlSessionFactory().openSession();
		List<Goods> goodses = session.selectList("selectConditon", condition);
		session.close();
		return goodses;
	}

这样就可以实现模糊查询

二、分页查询

现在如果我们需要实现一个更加复杂,但也是更加使用的功能就是条件查询并分页显示,我们发现MyBatis的session提供的selectList方法之可以传入一个参数,那么我们应该如何实现分页呢?不过上面分页,我们以前写的分页对象的算法都是有用的,先写一个分页对象,和我们以前写的是一样的。

1、逻辑分页

事实上MyBatis提供了一个非常简单分页方法,不过这个分页是每一次都是查询所有的数据库,然后在内存中再分页,对于数据量比较少的情况还有作用,但是数据量比较大的时候就会占用很多内存。映射文件的代码和上一小节的条件查询一样。

   <select id="selectConditonPage" parameterMap="mygoodsmap"  resultMap="goodsMap">
		select * from goods where 1=1
		<if test="condition.goodsName != null">
			and goods_name like #{condition.goodsName}
		</if>
		<if test="condition.goodsDesc != null">
			and goods_desc like #{condition.goodsDesc}
		</if>
	</select>

在GoodsDao中实现逻辑分页。

   // 分页
	public List<Goods> queryGoods(Goods condition, Page page) {

		SqlSession session = MyBacticUtil.getSqlSessionFactory().openSession();
		// 逻辑分页 查询全部
		List<Goods> goodses = session.selectList("selectConditonPage",
				condition,
				new RowBounds(page.getItemStart(), page.getPageSize()));

		session.close();
		return goodses;

	}

2、数据库的物理分页

数据库的物理分页就是使用数据库的分页算法实现的,所以我们需要修改映射文件,mysql的分页还是比较简单的。但是我们只能传入一个参数,所以这里我们需要写一个参数映射

   <!-- 参数映射 -->
	<parameterMap type="map" id="mygoodsmap">
		<parameter property="condition" resultMap="goodsMap" />
		<parameter property="page" javaType="com.util.Page" />
	</parameterMap>

然后在修改sql映射

   <select id="selectConditonPage" parameterMap="mygoodsmap"  resultMap="goodsMap">
		select * from goods where 1=1
		<if test="condition.goodsName != null">
			and goods_name like #{condition.goodsName}
		</if>
		<if test="condition.goodsDesc != null">
			and goods_desc like #{condition.goodsDesc}
		</if>
		limit #{page.itemStart},#{page.pageSize}
	</select>

最好修改GoodsDao的查询,需要把条件对象和分页组织成为map对象

   // 分页
	public List<Goods> queryGoods2(Goods condition, Page page) {

		SqlSession session = MyBacticUtil.getSqlSessionFactory().openSession();

		// 物理分页

		Map<String, Object> param = new HashMap<String, Object>();
		param.put("condition", condition);
		param.put("page", page);

		List<Goods> goodses = session.selectList("selectConditonPage", param);
		session.close();
		return goodses;

	}