PageBean 以及动态SQL

SpringBoot学习第四天:PageBean 以及动态SQL

1)PageBean

分页查询是绝大多数 Web 页面都需要实现的功能,目的是限制每页显示的数据数量。通过分页可以有效地提高查询效率,避免一次性加载大量数据。在后端开发中,如果直接通过 SQL 查询语句实现分页,通常会使用类似下面的 SQL 语句:

SELECT * FROM dept LIMIT 1, 4;

这条 SQL 语句的作用是从 dept 表中查询数据,返回 从第 2 行开始的 4 条记录

  • LIMIT 子句:用于限制查询结果的数量。
    • 第一个参数 1:表示偏移量,即从第 2 行开始(行号从 0 开始)。
    • 第二个参数 4:表示返回的最大行数。

Java实现

public PageBean page(Integer page, Integer pageSize){  
    // 获取总记录数
    Long count = empMapper.count();  
  
    // 计算偏移量,获取结果列表
    Integer start = (page - 1) * pageSize;  
    List<Emp> empList = empMapper.page(start, pageSize);  
  
    // 创建并返回 PageBean 对象
    PageBean pageBean = new PageBean(count, empList);  
    return pageBean;  
}

上述代码中,我们通过 empMapper.count() 获取总记录数,计算分页偏移量后,再通过 empMapper.page(start, pageSize) 获取当前页的数据。最终,我们将总记录数和结果列表封装成 PageBean 对象返回。


使用 PageHelper 插件简化分页

PageHelper 是 MyBatis 提供的分页插件,它简化了分页查询的操作,不需要手动计算偏移量。以下是基于 PageHelper 实现分页的例子:

public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {   
    // 启动分页插件,自动添加 LIMIT 子句
    PageHelper.startPage(page, pageSize);  
  
    // 查询数据
    List<Emp> empList = empMapper.list(name, gender, begin, end);  
   
    // 获取分页结果并封装为 PageBean
    Page<Emp> p = (Page<Emp>) empList;
    PageBean pageBean = new PageBean(p.getTotal(), p.getResult());  
    return pageBean;  
}

empMapper.list 对应的 SQL 查询如下:

<select id="list" resultType="com.itheima.practice.pojo.Emp">  
    SELECT *  
    FROM emp    
    <where>  
        <if test="name != null">  
            name LIKE concat('%', #{name}, '%')  
        </if>  
  
        <if test="gender != null">  
            AND gender = #{gender}  
        </if>  
  
        <if test="begin != null AND end != null">  
            AND entrydate BETWEEN #{begin} AND #{end}  
        </if>  
    </where>  
    ORDER BY update_time DESC  
</select>

通过 PageHelper.startPage(page, pageSize)PageHelper 会自动拦截查询,并为其添加分页功能,相当于在 SQL 查询中自动插入 LIMIT 子句。这样,查询的结果将只包含指定页的数据。


2)动态SQL

在后端开发中,SQL 是不可或缺的重要组成部分,尤其是当需要根据不同条件查询数据时。假设数据库中有这样一张表:

usernamepasswordnamegenderjobentrydatedept_idcreate_timeupdate_time
john5f4dcc3b5John112021-06-151012021-06-15 10:30:002023-10-01 15:00:00
alice1a79a4d60Alice022020-09-011022020-09-01 09:00:002023-08-20 18:45:00
bobe99a18c42Bob132019-03-251032019-03-25 12:15:002023-11-15 09:20:00
jane098f6bcdJane042022-01-101042022-01-10 11:40:002023-09-25 16:10:00
tomd41d8cd9Tom112023-02-051012023-02-05 08:30:002023-10-10 14:00:00

有时我们需要通过 genderjob 查询数据,SQL 可以写成:

SELECT * 
FROM your_table_name
WHERE gender = ? AND job = ?;

显然有时候我们又会通过其他的参数来查询数据,例如只用usernamejob查询数据

SELECT * 
FROM your_table_name
WHERE username = ? AND job = ?;

又或是只通过gender查询等等,查询的方式有千万种,我们不可能在后端中定义所有的查询方式,这样是在太臃肿、繁琐了,一个很好的解决方案是通过动态SQL,代码如下(XML配置文件中)

<update id="update">
    UPDATE emp
    <set>
        <if test="emp.username != null">username = #{emp.username},</if>
        <if test="emp.password != null">password = #{emp.password},</if>
        <if test="emp.name != null">name = #{emp.name},</if>
        <if test="emp.gender != null">gender = #{emp.gender},</if>
        <if test="emp.job != null">job = #{emp.job},</if>
        <if test="emp.entrydate != null">entrydate = #{emp.entrydate},</if>
        <if test="emp.deptId != null">dept_id = #{emp.deptId},</if>
        <if test="emp.updateTime != null">update_time = #{emp.updateTime},</if>
    </set>
</update>

解释:

  • <if test="emp.xxx != null">:判断 emp 对象中的某个属性是否为空(null),如果不为空,则将该字段拼接到 SQL 中。

    • 例如,如果 emp.username 不为 null,则生成 username = #{emp.username},
    • 如果 emp.password 不为 null,则生成 password = #{emp.password},
  • <set>:用于动态构建 SQL 的 SET 子句。MyBatis 会自动添加逗号,并跳过空字段。

示例:假设我们只输入 gender

如果只输入了 gender 参数,真实的 SQL 会是:

UPDATE emp
SET gender = ?
  • <if test="emp.gender != null">:判断 gender 是否为 null,若不为空,则生成 gender = #{emp.gender}

其他字段由于值为空(null),不会被包含在 SET 子句中。

动态 SQL 的优势

  • 简洁:不需要为每种查询条件编写独立的 SQL。
  • 灵活:可以根据传入的条件动态生成不同的 SQL。
  • 可维护:在增加或修改查询条件时,只需修改 XML 配置,而不需要修改 Java 代码。
1.本版本的需要2.0框架支持<br>2.功能:<br> 支持数据缓存<br> 支持分页方式多样化<br> 支持SQL数据库<br> 支持GridView数据表格<br><br> 请注意若您需要用到图片分页模式请拷贝Images文件夹.如果需要定义自己的图片样式,请不要改变图片的名称即可.<br><br>3.不足 <br> 控件暂时只支持SQL数据库其他数据库的支持接口以完成还没来得及写,有时间我会升级<br> 控件暂时不支持存储过程<br> 现在发布的也只是个BATE版有BUG欢迎指正<br> 邮箱:wensifww@163.com<br> QQ:24754991<br> QQ群:24604453<br><br> <br>4版本升级<br> (1) SqlPage 1.0.1.0 版本:(修改时间:2006-11-23)<br> 1.修正了在不使用缓存的情况下控检不显示数据的BUG<br> 2.去除HasGridView属性该为控件自行判断数据表格类型<br> 3.增加在用缓存模式下改变SQL语句获得新数据功能<br> 4.在绑定表格后对表格操作后绑定更加简单只需添加SqlPage1.DataBind()方法即可<br> 去除程序员写繁琐的绑定CODE<br> 5.添加了ControlToPaginate内置属性用于获得当前控件所绑定的数据表格控件<br> <br> (2)SqlPage 1.0.1.2 版本:(修改时间:2007-1-27)<br> 1.修正了表格控检在多层中SqlPage找不到绑定控件的BUG。 <br> 2.应很多朋友呼吁删除排序字段开发排序SQL语句,由程序员自己写<br><br> (3)SqlPage 1.1.4.8 版本:(修改时间:2007-7-31)<br> 1.优化数据读取(支持百万级数据读取)<br> 2.分页控件资源集成化,不需要用户Copy控件资源文件<br> 3.分页控件排序优化:默认情况下为表主键排序<br> 4.修正分页控件在删除当前索引也中所有行不能自动转到上一页的错误<br> 5.添加分页的排序方式<br> 6.自定义排序的字段<br> 7.修正在除GridView外表格控件绑定空数据库时出错问题<br> 8.修正用户SQL语句后面带分号出错<br> 9.修正降序排序单页显示成升序的错误<br> (4)SqlPage 1.2.2.3 版本:(修改时间:2007-8-9)<br> 1.修正MSSQL用户SQL语句中同时带有TOP 和ORDER BY 语句程序不能识别问题<br> 2.添加了以分页段的分页样式丰富了分页样式<br> 3.做了一个控制分页控件样式表(CSS)的DOME(有朋友不知道怎么去控制这里简单的 说明使用方法,很简单)<br> 4.修正MSSQL用户SQL语句中ORDER BY再次绑定的问题 <br> 5.修正控件分页模式在图片分页模式下控件编辑状态出错问题<br> 6.新添了控件自动添加前缀功能(Wensi)<br> 7.新增分页跳转类型,两种:下拉列表框和文本框,系统默认为下拉列表框,(在实际开发中我们发现下拉列表框在分页数达到1000级以上的时候明显变慢,所以建议大家在分页数很大时使用文本框类型这样可以明显提高效率)<br> 8.新增控件样式CSS文件是否用系统自带的样式文件还是用户自定义样式文件属性 HasSystemPageStyle<br> (5)SqlPage 1.2.5.3 版本:(修改时间:2007-10-24)<br> 1.修改了在2次绑定无数据时现实前一次绑定数据的BUG<br> 2.修改了在页面索引为-1时系统不能正常恢复显示数据BUG<br>如果您在使用中发现BUG或有很好的建议请联系我,让大家一起参与进来维护好这个控件.<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值