8. Mybatis typeHandlers标签
MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用 类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器(截取部分):
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler,
然后可以选择性地将它映射到一个JDBC类型。
例如需求:一个Java中的Date数据类型,我想将之存到数据库的时候存成一 个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换。
步骤分3步走:
① 定义转换类继承类BaseTypeHandler
② 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult 为查询时 mysql的字符串类型转换成 java的Type类型的方法
③ 在MyBatis核心配置文件中进行注册
④ 测试转换是否正确
我们就写 写继承的吧:
1.首先在数据库user中添加 birthday 字段 然后设置为bigint型(毫秒 所以bigint) 、Bean加上字段 birthday 是Date类型
【这里省略 写接口 和 写 映射文件,就是一个普通的加入用户:】
2.我们继承BaseTypeHandler类吧 泛型为你要转换的类型:
package com.bihu.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数据中的类型 到 数据库中的数据类型 的回调方法 @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException { preparedStatement.setLong(i,date.getTime()); //i就是位置 ,然后设置一下Date转换一下毫秒值 } //这个是数据库中的类型 到 java数据类型 的回调方法【下面三个都是】 /** * * @param resultSet 查询出来的结果集 * @param s 要转换的字段名称 */ @Override public Date getNullableResult(ResultSet resultSet, String s) throws SQLException { long aLong = resultSet.getLong(s);//按照字段获取到数据库的Long【bigint】 return new Date(aLong); // Long转Date返回 } //这个是数据库中的类型 到 java数据类型 的回调方法 @Override public Date getNullableResult(ResultSet resultSet, int i) throws SQLException { long aLong = resultSet.getLong(i); //按照index找 return new Date(aLong); // Long转Date返回 } //这个是数据库中的类型 到 java数据类型 的回调方法 @Override public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException { long aLong = callableStatement.getLong(i); //按照index找 return new Date(aLong); // Long转Date返回 } }
3.我们在核心配置文件注册一下即可:
然后我们测试:
package com.bihu.Service; import com.bihu.Bean.User; import com.bihu.Dao.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 java.io.IOException; import java.io.InputStream; import java.util.Date; public class UserService { public static void main(String[] args) throws IOException { User bihu = new User(); bihu.setId(10086); bihu.setUsername("中国一动不动"); bihu.setPassword("1008611"); bihu.setBirthday(new Date()); InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = build.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.addUser(bihu); sqlSession.commit(); //提交事务 sqlSession.close(); //关闭(回收)连接口 } }
运行发现:
语句和参数都正确 发现date变了 一长串毫秒数。
返回查询来也一样 这里给出结果 不给出过程 自己测:
本文来自博客园,作者:Bi-Hu,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/15162821.html
原文地址:https://www.cnblogs.com/bi-hu/p/15162821.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 0812-7.1.3-如何使用Ranger给HBase授权
- Redis集群方案对比:Codis、Twemproxy、Redis Cluster
- 这就是你日日夜夜想要的docker!!!---------Docker镜像制作与私有仓库建立
- 排障集锦:九九八十一难之第十八难!-----System has not been booted with systemd as init system (PID 1). Can‘t operat
- 深入了解 Flex 属性
- 如何设计一个安全的短信接口?
- ERROR Shell:396 - Failed to locate the winutils binary in the hadoop binary path java.io.IOE...
- Windows 安装配置 PySpark 开发环境(详细步骤+原理分析)
- 安利三个关于Python字符串格式化进阶知识
- TCP/IP学习笔记1——协议分层
- 用Python爬取淘宝4403条大裤衩数据进行分析,终于找到可以入手的那一条
- Python 微信机器人:属于自己的微信机器人制作,简单易懂。图灵机器人接口api调用。
- 最全总结:把模块当做脚本来执行的 7 种案例及其原理
- 经典八种排序算法总结(带动画演示)
- bokeh作图过程报错解决方法兼Pycharm如何升级安装包的方法