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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。