MyBatis核心配置文件深入

目录

1.typeHandler标签

2.plugins标签

3.知识小结


1.typeHandler标签

无论是MyBatis在预处理语句(PrepareedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成java类型。

类型处理器Java类型JDBC类型
BooleanTypeHandlerjava.lang.Boolean.boolean数据库兼容的BOOLEAN
ByteTypeHandlerjava.lang.Byte.byte数据库兼容的NUMERIC或BYTE
ShortTypeHandlerjava.lang.Short.short数据库兼容的NUMERIC或SHORT INTEGER
IntegerTypeHandlerjava.lang.Integer.int数据库兼容的NUMERIC或INTEGER
LongTypeHandlerjava.lang.Long.long数据库兼容的NUMERIC或LONG INTEGER

重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型,具体做法为:实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,然后可以选择性的将它映射到一个JDBC类型。例如需求:一个java中的Date数据类型,我想要将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库中的varchar毫秒值之间的转换。

开发步骤为:

  • 定义转换类型类BaseTypeHandler<T>
  • 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java的Type类型的方法
  • 在MyBatis核心配置文件中进行注册
  • 测试转换是否正确
package com.caoyan.handler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class DateTypeHandler extends BaseTypeHandler<Date> {

    // 将数据库中类型 转换成java类型
    // String参数 要转换的字段名称
    // ResultSet 查询出的结果集
    @Override
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        // 获得结果集中需要的数据(long) 转换成Date类型 返回
        Long long1 = resultSet.getLong(s);
        Date date = new Date(long1);
        return date;
    }

    // 将数据库中类型 转换成java类型
    @Override
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        Long long1 = resultSet.getLong(i);
        Date date = new Date(long1);
        return date;
    }

    // 将数据库中类型 转换成java类型
    @Override
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        Long long1 = callableStatement.getLong(i);
        Date date = new Date(long1);
        return date;
    }

    // 将java类型转换为数据库需要的类型
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType)
            throws SQLException {
        long time = date.getTime();
        preparedStatement.setLong(i, time);
    }

}

在sqlMapConfig.xml中配置类型处理器。 

<!-- 注册类型处理器 -->
<typeHandlers>
    <typeHandler handler="com.caoyan.handler.DateTypeHandler" />
</typeHandlers>
package com.caoyan.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

import com.caoyan.domain.User;
import com.caoyan.mapper.UserMapper;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

public class MapperTest {
    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 创建user
        User user = new User();
        user.setUsername("ceshi");
        user.setPassword("abc");
        user.setBirthday(new Date());
        // 执行保存操作
        userMapper.save(user);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void test2() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findById(8);
        System.out.println("user中的birthday:" + user.getBirthday());
        sqlSession.commit();
        sqlSession.close();
    }
}

2.plugins标签

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

  • 导入通用PageHelper的坐标
    <!-- 分页助手 -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.github.jsqlparser</groupId>
      <artifactId>jsqlparser</artifactId>
      <version>4.4</version>
    </dependency>
  • 在mybatis核心配置文件中配置PageHelper插件
    <!-- 版本5.0以下配置分页助手插件 -->
    <!-- <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql" />
        </plugin>
    </plugins> -->

    <!-- 版本5.0以上配置分页助手插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>
  • 测试分页数据获取
    @Test
    public void test3() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 设置分页相关参数,当前页+每页显示的条数
        PageHelper.startPage(2, 3);

        List<User> userList = userMapper.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

3.知识小结

MyBatis核心配置文件常用标签:

  • properties标签:该标签可以加载外部的properties文件
  • typeAlias标签:设置类型别名
  • environments标签:数据源环境配置标签
  • typeHandlers标签:配置自定义类型处理器
  • plugins标签:配置MyBatis的插件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caoyy686868

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值