热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Mybatis自定义typeHandle过程解析

这篇文章主要介绍了Mybatis自定义typeHandle过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一 前言

本篇文章的基础是建立在mybatis配置

二 准备工作

2.1建表语句

CREATE TABLE `customer` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `customer_name` varchar(255) DEFAULT NULL COMMENT '顾客名称',
 `gender` varchar(255) DEFAULT NULL COMMENT '性别',
 `telephone` varchar(255) DEFAULT NULL COMMENT '电话号码',
 `register_time` timestamp NULL DEFAULT NULL COMMENT '注册时间',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='顾客表';

2.2 实体

public class Customer {
  // 主键
  private Long id;
  // 客户姓名
  private String customer_name;
  // 性别
  private String gender;
  // 电话
  private String telephone;
  // 注册时间
  private Long register_time;
  // 省略 set get
 } 

三 自定义TypeHandler

自定义TypeHandler实现一个业务逻辑就是 当插入数据时可以将时间戳转为timestamp格式;当查询数据得时候再将数据库中得timestamp格式时间转为时间戳;好吧知识追寻者也是无聊透顶了做这种操作,不过易于读者理解;

/**
 * @Author lsc
 * 

一个无聊的业务逻辑 输入的是时间戳,到数据库中的是 timestamp 格式 输出的又是时间戳

*/ @MappedJdbcTypes(JdbcType.TIMESTAMP) @MappedTypes(Long.class) public class TimeStringHandler extends BaseTypeHandler { public void setNonNullParameter(PreparedStatement preparedStatement, int i, T t, JdbcType jdbcType) throws SQLException { // 将 时间戳转为 LocalDateTime LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond((java.lang.Long) t), ZoneOffset.ofHours(8)); // 参数设置 System.out.println("业务逻辑1"); preparedStatement.setString(i,localDateTime.toString()); } public T getNullableResult(ResultSet resultSet, String s) throws SQLException { System.out.println("业务逻辑2"); String time = resultSet.getString(s); LocalDateTime localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); Long secOnd= localDateTime.toEpochSecond(ZoneOffset.ofHours(8)); return (T) second; } public T getNullableResult(ResultSet resultSet, int i) throws SQLException { System.out.println("业务逻辑3"); String time = resultSet.getString(i); LocalDateTime localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); Long secOnd= localDateTime.toEpochSecond(ZoneOffset.ofHours(8)); return (T) second; } public T getNullableResult(CallableStatement callableStatement, int i) throws SQLException { System.out.println("业务逻辑4"); String time = callableStatement.getString(i); LocalDateTime localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); Long secOnd= localDateTime.toEpochSecond(ZoneOffset.ofHours(8)); return (T) second; } }

四 mappe接口

public interface CustomerMapper {

  // 添加客户
  int addCustomer(Customer customer);
  // 查询客户
  List getCustomer();
}

五 sql映射文件

sql映射文件中在使用得字段register_time中做专门得数据类型处理,这样不用配置到全局配置文件中,可以针对特定字段处理是个不错得选择;这边实现得逻辑是两个部分,查询语句用于返回时将register_time使用类型处理器处理;插入语句用于将数据进入数据库时使用register_time使用类型处理器处理。

<&#63;xml version="1.0" encoding="UTF-8" &#63;>




  
    
  

  

  
     insert into `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部分,查询和新增部分;

/**
 * @Author lsc
 * 

*/ @RunWith(JUnit4.class) public class TypeHandlerTest { SqlSession sqlSession = null; // @Before 会在执行测试类之前执行该方法 @Before public void before() throws IOException { // 资源路径 resource目录下 String resource = "mybatis-config.xml"; // 配置mybatis获得输入流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建 SqlSessionFactory SqlSessionFactory sqlSessiOnFactory= new SqlSessionFactoryBuilder().build(inputStream); //从 SqlSessionFactory 中获取 SqlSession sqlSession= sqlSessionFactory.openSession(); } @Test public void testInsert(){ // 获得mapper的形式 CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class); Customer customer = new Customer(); customer.setCustomer_name("知识追寻者"); customer.setRegister_time(1580739214L); customer.setGender("男"); customer.setTelephone("999"); // 添加客户 mapper.addCustomer(customer); sqlSession.commit(); sqlSession.close(); } @Test public void testSelect(){ // 获得mapper的形式 CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class); List customerList = mapper.getCustomer(); for (Customer customer :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-03 23:39:33,018 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: insert into `customer`( `customer_name`, `gender`, `telephone`, `register_time` )values ( &#63;, &#63;, &#63;, &#63; )
业务逻辑1
[DEBUG] 2020-02-03 23:39:33,052 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 知识追寻者(String), 男(String), 999(String), 2020-02-03T22:13:34(String)
[DEBUG] 2020-02-03 23:39:33,116 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Updates: 1

八 测试查询数据

原本数据库中是timestamp支持的格式得时间,出来就是时间戳;

[DEBUG] 2020-02-03 23:39:00,371 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: select * from `customer`
[DEBUG] 2020-02-03 23:39:00,410 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters:
业务逻辑2
[DEBUG] 2020-02-03 23:39:00,468 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Total: 1
知识追寻者
1580739214

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文档整理了公司内部常用的网站链接和重要资源路径,包括部门周报、内控报销系统、邮件服务等,同时提供了相关数据库的登录信息。 ... [详细]
  • 深入理解Hibernate延迟加载机制
    本文探讨了Hibernate框架中的延迟加载(懒加载)特性,分析其对程序性能的影响及实现原理,同时提供了具体的代码示例来说明如何配置和使用延迟加载。 ... [详细]
  • 本文详细解析了Tomcat服务器的核心配置文件server.xml,包括其主要功能、结构组成及各标签的具体作用。 ... [详细]
  • MyBatis入门指南
    本文详细介绍了MyBatis的基础知识,包括如何整合日志框架(如log4j和logback),使用外部JDBC文件,getMapper()方法的应用,以及别名设置等技巧。 ... [详细]
  • 全面解读Apache Flink的核心架构与优势
    Apache Flink作为大数据处理领域的新兴力量,凭借其独特的流处理能力和高效的批处理性能,迅速获得了广泛的关注。本文旨在深入探讨Flink的关键技术特点及其应用场景,为大数据处理提供新的视角。 ... [详细]
  • 本文介绍如何使用 Google 开发的 libphonenumber 库在 Java 应用中实现电话号码的有效性验证。该库不仅支持多种国际电话号码的格式化与解析,还提供了一系列强大的验证工具。 ... [详细]
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • 本文探讨了Java异常处理的本质,提出了设计模式以优化异常处理,并分析了在AOP模型中异常处理的应用。文章强调了正确使用Java异常对于提升代码质量和维护性的关键作用。 ... [详细]
  • Pikachu平台SQL注入漏洞详解
    本文详细介绍了SQL注入漏洞的基本原理、攻击流程、不同类型注入点的识别与利用方法,以及基于union联合查询、报错信息、布尔盲注、时间盲注等多种技术手段的信息获取方式。同时,探讨了如何通过SQL注入获取操作系统权限,以及HTTP Header注入和宽字节注入等高级技巧。最后,提供了使用SQLMap自动化工具进行漏洞测试的方法和常见的SQL注入防御措施。 ... [详细]
  • 初学者必备:iBATIS入门指南与常见问题解决
    本文旨在为iBATIS初学者提供一份详细的入门指南,并针对官方文档中示例不足的问题提出解决方案。适合零基础学习者。 ... [详细]
  • mybatis相关面试题 ... [详细]
  • 本文介绍了如何在Java中使用`JCheckBoxMenuItem.setMnemonic()`方法,并提供了多个实际应用的代码示例。 ... [详细]
  • 本文探讨了在使用 ClickOnce 部署方式时遇到的自动更新失败问题,包括本地安装与服务器安装的不同表现,并提供了详细的解决方案。 ... [详细]
  • PHP 5.4.8 编译安装指南
    本文详细介绍了如何在Linux环境下编译安装PHP 5.4.8,并配置为FastCGI模式运行。包括所需依赖包的安装、源代码下载、编译配置及启动服务等步骤。 ... [详细]
  • 本文详细介绍了Java中com.sun.xml.bind.v2.runtime.XMLSerializer类下的childAsRoot()方法,并提供了多个实际应用的代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
author-avatar
倩女__沃洪伟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有