MyBatis系列(三)——MyBatis的类型处理器和PageHelper分页插件

前言

在之前的文章中,我们介绍了MyBatis的基本使用和动态代理等知识点,本篇文章中,我们将对MyBatis中的类型处理器和插件使用进行介绍,二者的使用比较简单,但在一些场景下可以帮助我们较好的简化开发的步骤,是值得学习的一个小内容。也希望本篇文章对各位读者能够有所帮助。

想要了解更多MyBaits系列文章,可以从下面的传送门阅读:

MyBatis系列(一)——MyBatis的介绍和CRUD
MyBatis系列(二)——MyBatis的动态代理和映射文件动态配置


一、MyBatis的类型处理器

在使用MyBatis进行增删改查的的时候我们会发现,MyBatis会帮我们自动做好SQL语句参数的封装和POJO对象属性的封装,这中间涉及到JAVA的数据类型和SQL数据库的数据类型之间的转换,那么这是怎么实现的呢?
答案是MyBatis内部提供了类型处理器来帮助我们自动完成不同应用之间的类型转换。


但如果现在我们有特殊的需求,比如说Java对象的属性是Date类型,我们想要它保存到数据库时是Bitint类型,常规的类型处理器是无法满足我们的需要的,这时候就需要我们自定义类型处理器了。

下面我们就来介绍一下自定义处理器的具体步骤:

步骤一:定义转换类继承类BaseTypeHandler<T>

(这里的话也可以实现 org.apache.ibatis.type.TypeHandler 接口)

public class MyDateHandler extends BaseTypeHandler<Date> {
    /*
      这个方法主要用于执行sql语句前的封装参数
     */
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        long time = date.getTime();
        // i 表示封装的参数位置,一般来说直接传过去就行
        preparedStatement.setLong(i,time);
    }

    /*
      这个方法主要用于获取resultSet结果集中的数据
     */
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        // s 表示列名
        return new Date(resultSet.getLong(s));
    }

    /*
      这个方法和第二个方法一样,不同之处在于具体的api
      这里的 i 表示第几列的column
     */
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return new Date(resultSet.getLong(i));
    }

    /*
     这个方法和第二个方法也是一样的,我们照猫画虎调用一下参数即可
     */
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return new Date(callableStatement.getLong(i));
    }
}
步骤二:在MyBatis核心配置文件中注册自定义的类型处理器
    <!--注册自定义处理器-->
    <typeHandlers>
        <typeHandler handler="com.qiqv.handler.MyDateHandler"></typeHandler>
    </typeHandlers>

这里需要注意,根据sqlMapConfig约束文件的要求,自定义处理器需要排在自定义别名标签后面。

步骤三:在代码中进行测试:
    @Test
    public void handleTest() throws Exception{
        User user = new User(null,"阿呆","9877899",new SimpleDateFormat("yyyy-MM-dd").parse("1997-08-01"));
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.insertUser(user);
        System.out.println(mapper.getUserByConditions(new User(null, "阿呆", null, null)));
    }

二、分页插件PageHelper的使用

MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。

在介绍分页插件前,我们不妨先想想实现分页可以有哪些方式?

这个问题还不简单,原始的jdbc操作写好sql语句后,在原来的步骤上封装上limitoffsetpagesize两个参数就行。但是MyBatis的封装是采用paramerType来进行封装的,也就是说如果直接采用原生的limit方法的话,我们可能需要手动在我们的POJO类上面添加新的属性,来封装offsetpagesize这两个分页参数。
但这样的话就会有一个问题,一个是操作比较繁琐,我每个pojo类上面都要加上这个属性,另外一个是从面向对象的角度讲,offsetpagesize这两个属性并不属于pojo类。所以我们这里可以用PageHelper这款第三方插件来帮我们完成分页这个问题。

下面我们就正式来介绍我们的分页插件使用吧

步骤一:引入相关依赖
<!-- 分页助手 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>3.7.5</version>
</dependency>
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>0.9.1</version>
</dependency>
步骤二:在核心配置文件中注册插件
<!-- 注意:插件标签配置在通用馆mapper之前 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!--指定方言-->
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>
步骤三:在代码中使用插件

PageHelper的使用十分简单,我们只需要使用PageHelper.startPage方法,PageHelper就会在sql执行过程中动态地帮我们拼接limit关键字上去。

    @Test
    public void pageHelperTest() throws Exception{
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 使用PageHelper定义 起始页 和pageSize 
        PageHelper.startPage(3,2);
        List<User> allUser = mapper.getAllUser();
        for (User user : allUser) {
            System.out.println(user);
        }
    }

PageHelper的方便之处当然不止是设置limit一个功能,事实上它内部还封装了Page的基本常用属性,我们这里也来看看吧。

    @Test
    public void pageHelperTest2() throws Exception{
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 使用PageHelper定义 起始页 和pageSize
        PageHelper.startPage(3,2);
        List<User> allUser = mapper.getAllUser();
        // 把查询到的集合作为参数传入PageInfo对象中
        PageInfo<User> pageInfo = new PageInfo<User>(allUser);
        System.out.println("每页大小是" + pageInfo.getPageSize());
        System.out.println("总页数是" + pageInfo.getPages());
        System.out.println("总条数是" + pageInfo.getTotal());
        System.out.println("当前页页面是" + pageInfo.getPageNum());
        System.out.println("上一页页码" + pageInfo.getPrePage());
        System.out.println("下一页页码" + pageInfo.getNextPage());
        System.out.println("当前页是否是第一页" + pageInfo.isIsFirstPage());
        System.out.println("当前页是否是最后一页" + pageInfo.isIsLastPage());
    }

好了,本篇文章对类型处理器和PageHelper分页插件的介绍就到这里了。如果对本篇文章有什么不清楚,欢迎留言讨论。

参考文章:
MyBatis中三种分页查询方式:
https://blog.csdn.net/hezhiying_/article/details/108555519

posted @ 2021-04-02 15:11  moutory  阅读(18)  评论(0编辑  收藏  举报  来源