幽兰生空谷
--绝世独自开

Mybatis快速入门(九)-typeHandlers标签

typeHandlers标签

类型处理器,处理可以使用默认的类型处理器,还可以自己重写类型处理器或创建自己的类型处理器,来处理不支持的或非标准的类型。

具体的做法:

实现 org.apache.ibatis.type.TypeHandler 接口,

或继承 org.apache.ibatis.type.BaseTypeHandler 类,

然后可以选择性的将它映射到一个JDBC类型。

例子:

一个Java中的Date 数据类型,我想将它存到数据库的时候,存成一个1970年至今的毫秒数,取出来时转换成Java的Date,即Java的Date与数据库的 varchar 毫秒值之间的转换。

开发步骤:

1.定义转换类,继承BaseTypeHandler 类,

2.覆盖4个未实现的方法,其中 setNonNullParameter 为程序设置 数据到数据库 的回调方法,getNullableResult 为查询时 MySQL的字符串类型转换成 Java 的Type类型的方法,

3.在MyBatis核心配置文件中进行注册

4.测试转换是否正确

首先,向数据库表中添加新的字段,birthday 类型类 bigint

修改User实体类为

package com.itheibai.entity;
import java.util.Date;
public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
    //此处省略了get、set和toString方法

创建mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheibai.dao.UserDao">
   <insert id="save" parameterType="user">
       insert into user values (#{id},#{username},#{password},#{birthday})
   </insert>
</mapper>

dao层创建方法

package com.itheibai.dao;
import com.itheibai.entity.User;
public interface UserDao{
    public void save(User user);
}

定义转换类,在com.itheibai目录下

package com.itheibai.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
public class DateTypeHandler extends BaseTypeHandler<Date> {
    /**
     * 将Java类型 转换成 数据库 需要的类型
     * @param preparedStatement
     * @param i
     * @param date
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        //将Java类型Date 转换为毫秒值
        long time = date.getTime();
        preparedStatement.setLong(i,time);
    }
    /**
     * 将数据库 的类型转换成 Java类型
     * @param resultSet 查询出的结果集
     * @param s 要转换的字段的名称
     * @return
     * @throws SQLException
     */
    @Override
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        //将结果集中需要的数据(long)转换成Date类型 返回
        long aLong = resultSet.getLong(s);
        Date date = new Date(aLong);
        return date;
    }
    /**
     * 将数据库 的类型转换成 Java类型
     * @param resultSet 查询出的结果集
     * @param i 要转换的字段
     * @return
     * @throws SQLException
     */
    @Override
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        //将结果集中需要的数据(long)转换成Date类型 返回
        long aLong = resultSet.getLong(i);
        Date date = new Date(aLong);
        return date;
    }
    /**
     * 将数据库 的类型转换成 Java类型
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        long aLong = callableStatement.getLong(i);
        Date date = new Date(aLong);
        return date;
    }
}

在核心配置文件中注册类型处理器

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--通过properties标签加载外部properties文件-->
    <properties resource="jdbc.properties"></properties>
    <!--自定义别名-->
    <typeAliases>
        <typeAlias type="com.itheibai.entity.User" alias="user"></typeAlias>
    </typeAliases>
    <!--注册类型处理器-->
    <typeHandlers>
        <typeHandler handler="com.itheibai.handler.DateTypeHandler"></typeHandler>
    </typeHandlers>
    <!--数据源环境-->
    <environments default="developement">
        <environment id="developement">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件-->
    <mappers>
        <mapper resource="com/itheibai/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

测试类型处理器

package com.itheibai.test;
import com.itheibai.dao.UserDao;
import com.itheibai.entity.User;
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;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MyBatisTest {
    /**
     * 测试类型转换器
     * @throws IOException
     */
    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //模拟传入的user数据
        User user = new User();
        user.setUsername("张三");
        user.setPassword("123456");
        user.setBirthday(new Date());
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        userDao.save(user);
        sqlSession.commit();
        sqlSession.close();
    }
}

测试结果

赞(3) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Mybatis快速入门(九)-typeHandlers标签》
文章链接:https://www.itheibai.com/archives/215
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。

评论 抢沙发

评论前必须登录!

 

养成“打赏”的好习惯,从我做起!

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册