40、动态sql和物理分页

学习目标:

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;
    }

猜你喜欢

转载自blog.csdn.net/liubao616311/article/details/84973991
今日推荐