40、动态sql和物理分页

小编 2026-06-06 阅读:878 评论:0
学习目标: 1、条件查询的实现,使用动态sql 2、理解逻辑分页和物理分页 3、掌握物理分页的基本写法 学习过程: 一、动态sql 在学习jdbc和hibernate的时候,我们在实现条件查询的...

学习目标:

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

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表