Mybatis自定义typeHandle过程解析
一前言
本篇文章的基础是建立在mybatis配置
二准备工作
2.1建表语句
CREATETABLE`customer`( `id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键', `customer_name`varchar(255)DEFAULTNULLCOMMENT'顾客名称', `gender`varchar(255)DEFAULTNULLCOMMENT'性别', `telephone`varchar(255)DEFAULTNULLCOMMENT'电话号码', `register_time`timestampNULLDEFAULTNULLCOMMENT'注册时间', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='顾客表';
2.2实体
publicclassCustomer{ //主键 privateLongid; //客户姓名 privateStringcustomer_name; //性别 privateStringgender; //电话 privateStringtelephone; //注册时间 privateLongregister_time; //省略setget }
三自定义TypeHandler
自定义TypeHandler实现一个业务逻辑就是当插入数据时可以将时间戳转为timestamp格式;当查询数据得时候再将数据库中得timestamp格式时间转为时间戳;好吧知识追寻者也是无聊透顶了做这种操作,不过易于读者理解;
/** *@Authorlsc *一个无聊的业务逻辑输入的是时间戳,到数据库中的是timestamp格式输出的又是时间戳
*/ @MappedJdbcTypes(JdbcType.TIMESTAMP) @MappedTypes(Long.class) publicclassTimeStringHandlerextendsBaseTypeHandler { publicvoidsetNonNullParameter(PreparedStatementpreparedStatement,inti,Tt,JdbcTypejdbcType)throwsSQLException{ //将时间戳转为LocalDateTime LocalDateTimelocalDateTime=LocalDateTime.ofInstant(Instant.ofEpochSecond((java.lang.Long)t),ZoneOffset.ofHours(8)); //参数设置 System.out.println("业务逻辑1"); preparedStatement.setString(i,localDateTime.toString()); } publicTgetNullableResult(ResultSetresultSet,Strings)throwsSQLException{ System.out.println("业务逻辑2"); Stringtime=resultSet.getString(s); LocalDateTimelocalDateTime=LocalDateTime.parse(time,DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss")); Longsecond=localDateTime.toEpochSecond(ZoneOffset.ofHours(8)); return(T)second; } publicTgetNullableResult(ResultSetresultSet,inti)throwsSQLException{ System.out.println("业务逻辑3"); Stringtime=resultSet.getString(i); LocalDateTimelocalDateTime=LocalDateTime.parse(time,DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss")); Longsecond=localDateTime.toEpochSecond(ZoneOffset.ofHours(8)); return(T)second; } publicTgetNullableResult(CallableStatementcallableStatement,inti)throwsSQLException{ System.out.println("业务逻辑4"); Stringtime=callableStatement.getString(i); LocalDateTimelocalDateTime=LocalDateTime.parse(time,DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss")); Longsecond=localDateTime.toEpochSecond(ZoneOffset.ofHours(8)); return(T)second; } }
四mappe接口
publicinterfaceCustomerMapper{ //添加客户 intaddCustomer(Customercustomer); //查询客户 ListgetCustomer(); }
五sql映射文件
sql映射文件中在使用得字段register_time中做专门得数据类型处理,这样不用配置到全局配置文件中,可以针对特定字段处理是个不错得选择;这边实现得逻辑是两个部分,查询语句用于返回时将register_time使用类型处理器处理;插入语句用于将数据进入数据库时使用register_time使用类型处理器处理。
select*from`customer` insertinto`customer`( `customer_name`, `gender`, `telephone`, `register_time` )values( #{customer_name}, #{gender}, #{telephone}, #{register_time,javaType=Long,jdbcType=TIMESTAMP,typeHandler=com.zszxz.typehandler.handler.TimeStringHandler} )
六测试类
测试类也是分为2部分,查询和新增部分;
/** *@Authorlsc * */ @RunWith(JUnit4.class) publicclassTypeHandlerTest{ SqlSessionsqlSession=null; //@Before会在执行测试类之前执行该方法 @Before publicvoidbefore()throwsIOException{ //资源路径resource目录下 Stringresource="mybatis-config.xml"; //配置mybatis获得输入流 InputStreaminputStream=Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream); //从SqlSessionFactory中获取SqlSession sqlSession=sqlSessionFactory.openSession(); } @Test publicvoidtestInsert(){ //获得mapper的形式 CustomerMappermapper=sqlSession.getMapper(CustomerMapper.class); Customercustomer=newCustomer(); customer.setCustomer_name("知识追寻者"); customer.setRegister_time(1580739214L); customer.setGender("男"); customer.setTelephone("999"); //添加客户 mapper.addCustomer(customer); sqlSession.commit(); sqlSession.close(); } @Test publicvoidtestSelect(){ //获得mapper的形式 CustomerMappermapper=sqlSession.getMapper(CustomerMapper.class); ListcustomerList=mapper.getCustomer(); for(Customercustomer:customerList){ System.out.println(customer.getCustomer_name()); System.out.println(customer.getRegister_time()); } sqlSession.commit(); sqlSession.close(); } }
七测试插入数据
插入数据时原本register_time是时间戳,从打印得SQL参数2020-02-03T22:13:34(String)可以看见入库时就变成了timestamp支持的格式入库;
[DEBUG]2020-02-0323:39:33,018method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>Preparing:insertinto`customer`(`customer_name`,`gender`,`telephone`,`register_time`)values(?,?,?,?)
业务逻辑1
[DEBUG]2020-02-0323:39:33,052method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>Parameters:知识追寻者(String),男(String),999(String),2020-02-03T22:13:34(String)
[DEBUG]2020-02-0323:39:33,116method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==Updates:1
八测试查询数据
原本数据库中是timestamp支持的格式得时间,出来就是时间戳;
[DEBUG]2020-02-0323:39:00,371method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>Preparing:select*from`customer`
[DEBUG]2020-02-0323:39:00,410method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>Parameters:
业务逻辑2
[DEBUG]2020-02-0323:39:00,468method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==Total:1
知识追寻者
1580739214
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。