Mybatis分页查询及日期比较

1. 背景

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

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

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文件的编写,查询会用到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向数据库中的存取

猜你喜欢

转载自blog.csdn.net/u012397189/article/details/101701141