Mybatis分页查询及日期比较
Posted CuteXiaoKe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis分页查询及日期比较相关的知识,希望对你有一定的参考价值。
1. 背景
在我们进行Mybatis的开发的时候,会遇到数据量大和日期的问题,本文关注以下问题:
- 怎么进行数据库分页查询,避免结果过于庞大,运行速度慢
- 怎么进行日期比较,从不同精度比较两个日期的大小
2. 样例数据库设计
假设存在这样一张user用户表,他的定义(mysql)如下:
id | name | birthday |
---|---|---|
bigint(20) | varchar(64) | datetime |
我们要设计一个查询:
- 查询生日小于1990-01-30的用户(也就是在90年之前出生)
假设90年之前出生的人数很多,一次拉取会花费很多时间,所以我们在这引入分页查询
3. 分页查询设计
一般我们在编写Mapper的流程如下:DO
=>Query
=>Mapper
=>mapper.xml
=>sql查询,当然这不是必须遵循的编写顺序,你可以按照自己的意愿来。首先我们来看DO:
@Getter
@Setter
@ToString
public UserDO
private Long id;
private String name;
private Date birthday;
接着重点关注一下Query
类的编写,首先我们写编写一个PageQuery
,然后以后的查询类都可以继承这个类即可:
public class PageQuery
private Integer currentPage;
private Integer pageSize;
public int getStartRow()
if (currentPage == null || pageSize == null || currentPage <= 1)
return 0;
return (currentPage - 1) * pageSize;
//getter和setter
自定义查询类BirthdayQuery
继承自PageQuery
,主要添加了查询日期字段:
@Getter
@Setter
@ToString
public class BirthdayQuery extends PageQuery
/**
* 查询的生日日期
*/
private Date queryDate;
然后是Mapper接口的定义,UserMapper
接口定义如下:
@Mapper
public interface UserMapper
List<UserDO> listByBirthday(BirthdayQuery birthdayQuery)
最后是xml文件的编写,查询会用到startRow
和pageSize
,这里就省略了result的映射了哈:
<mapper namespace="com.test.mapper.Usermapper">
<select id="" resultMap="com.test.dataobject.UserDO">
SELECT
id,name,birthday
FROM
user
WHERE <![CDATA[ birthday < (#queryDate,jdbcType=TIMESTAMP)]]>
LIMIT #startRow, #pageSize
</select>
</mapper>
至此就大功告成了,值得注意
#startRow
属性的利用getStartRow()
方法获取的,Mybatis内部是使用OGNL表达式来获取属性值的,大家有兴趣可以深入了解一下
4. Mybatis中的日期比较
在xml里面编写中,我们使用到了jdbcType
,我们要注意Mybatis中有一个枚举类JdbcType
,在这里jdbcType
起到了拦截器的作用,在向数据库写入数据的时候拦截,同时从数据库中取数据的时候,会在数据库取出数据之后和向对象赋值之前拦截作用,正确的jdbcType
设置规则为:
- date类型字段对应的jdbctype类型为jdbcType=“DATE”
- datetime和timestimp类型字段对应的为jdbcType=“TIMESTAMP”
- time字段对应个为jdbcType=“TIME”
jdbcType
类型对java.util.Date日期数据向数据库存取的影响:
- 当jdbcType=“DATE”,当向数据库存取数据时会过滤掉时分秒
- 当jdbcType="TIMESTAMP"时,jdbcType不过滤任何内容,对存取没影响
- 当jdbcType="TIME"时,当向数据库存取数据时会过滤掉年月日
5. 参考资料
1.JdbcType
2.MyBatis中的OGNL教程
3.java日期类型对象通过mybatis向数据库中的存取
以上是关于Mybatis分页查询及日期比较的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询
Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询