Mybatis分页查询及日期比较

Posted CuteXiaoKe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis分页查询及日期比较相关的知识,希望对你有一定的参考价值。

1. 背景

  在我们进行Mybatis的开发的时候,会遇到数据量大和日期的问题,本文关注以下问题:

  1. 怎么进行数据库分页查询,避免结果过于庞大,运行速度慢
  2. 怎么进行日期比较,从不同精度比较两个日期的大小

2. 样例数据库设计

  假设存在这样一张user用户表,他的定义(mysql)如下:

idnamebirthday
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文件的编写,查询会用到startRowpageSize,这里就省略了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分页查询怎么做

MyBatis SQL分页处理及查询总数据量

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询