学习目标:
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;
}