40、动态sql和物理分页

学习目标:

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

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

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

学习过程:

一、动态sql

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

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

   
    select * from goods where 1=1
    
        and goods_name like #{goodsName}
    

    
        and goods_desc like #{goodsDesc}
    

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

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

这样就可以实现模糊查询

二、分页查询

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

1、逻辑分页

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

 
        select * from goods where 1=1
        
            and goods_name like #{condition.goodsName}
        
        
            and goods_desc like #{condition.goodsDesc}
        
    

在GoodsDao中实现逻辑分页。

// 分页
    public List queryGoods(Goods condition, Page page) {
        SqlSession session = MyBacticUtil.getSqlSessionFactory().openSession();
        // 逻辑分页 查询全部
        List goodses = session.selectList("selectConditonPage",
                condition,
                new RowBounds(page.getItemStart(), page.getPageSize()));
        session.close();
        return goodses;
    }

2、数据库的物理分页

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

 
    
        
        
    

然后在修改sql映射

  
        select * from goods where 1=1
        
            and goods_name like #{condition.goodsName}
        

        
            and goods_desc like #{condition.goodsDesc}
        
        limit #{page.itemStart},#{page.pageSize}
    

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

// 分页
    public List queryGoods2(Goods condition, Page page) {
        SqlSession session = MyBacticUtil.getSqlSessionFactory().openSession();
        // 物理分页
        Map param = new HashMap();
        param.put("condition", condition);
        param.put("page", page);
        List goodses = session.selectList("selectConditonPage", param);
        session.close();
        return goodses;
    }

 

你可能感兴趣的:(中级阶段2-常用框架学习)