MyBatis转换器-时间与字符串

背景:java字段类型为String,数据库类型为timestamp,需要统一处理时区

package xx.xx.xx;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeException;

import java.sql.*;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

@Slf4j
public class TimestampToStringTypeHandler extends BaseTypeHandler<String> {
    private static final DateTimeFormatter LDT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final DateTimeFormatter LDT_MILLIS_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    private static final ZoneId UTC = ZoneId.of("UTC");

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        // UTC时间写入
        LocalDateTime tm;
        try {
            if (parameter.length() == 19) {
                tm = LocalDateTime.parse(parameter, LDT_FORMATTER);
            } else if (parameter.length() == 23) {
                tm = LocalDateTime.parse(parameter, LDT_MILLIS_FORMATTER);
            } else {
                throw new TypeException("Error for parameter #" + i + " with JdbcType " + jdbcType + " . " +
                        "Cause: formatter unsupported, parameter=" + parameter);
            }
            ps.setTimestamp(i, new Timestamp(tm.toInstant(ZoneOffset.UTC).toEpochMilli()));
        } catch (Exception e) {
            throw new TypeException("Error for parameter #" + i + " with JdbcType " + jdbcType + " . " +
                    "Try parse timestamp for this parameter. " +
                    "Cause: " + e, e);
        }
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Timestamp date = null;
        try {
            date = rs.getTimestamp(columnName);
        } catch (Exception e) {
            log.warn("unexpected: getTimestamp from ResultSet error, val={}", rs.getString(columnName), e);
        }
        return date == null ? null : LocalDateTime.ofInstant(date.toInstant(), UTC).format(LDT_FORMATTER);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Timestamp date = null;
        try {
            date = rs.getTimestamp(columnIndex);
        } catch (Exception e) {
            log.warn("unexpected: getTimestamp from ResultSet error, val={}", rs.getString(columnIndex), e);
        }
        return date == null ? null : LocalDateTime.ofInstant(date.toInstant(), UTC).format(LDT_FORMATTER);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Timestamp date = null;
        try {
            date = cs.getTimestamp(columnIndex);
        } catch (Exception e) {
            log.warn("unexpected: getTimestamp from ResultSet error, val={}", cs.getString(columnIndex), e);
        }
        return date == null ? null : LocalDateTime.ofInstant(date.toInstant(), UTC).format(LDT_FORMATTER);
    }
}

xml配置,xml报错注意MyBatis的标签顺序

  <typeHandlers>
    <typeHandler handler="xx.xx.xx.TimestampToStringTypeHandler"
                 javaType="java.lang.String" jdbcType="TIMESTAMP"/>
  </typeHandlers>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文档是所有和平之翼(PeaceWingSHC)代码生成器所有版本的Readme合集 =========和平之翼代码生成器的介绍目标和景愿=========== 和平之翼代码生成器是无垠式代码生成器的第二代,轻量级定制版的代码生成器。 他有如下的特点 1)每个版本都是单一技术栈支持。分为不同版本。本版是SpingMVC Spring Hibernate Criteria技术栈。 2)比无垠式代码生成器更美观的弹性界面。 3)比无垠式代码生成器更快的迭代周期。 4)神秘礼物。 5)代码生成器的界面美化。 ==============PeaceWingSHC 0.7.11============== 1)将生成器改进到无垠式代码生成器0.8的水平 2)增加ActiveField名为deleted或delete自动反义功能 3)增加对DomainID为int类型的支持 4)修改了数据库生成器 5)修复Boolean转换字符串“false”被视为true的Bug ==============PeaceWingSHC 0.7.10============== 1)迁徙到SHC技术栈(SpringMVC 4, Spring 4, Hibernate 4 Criteria) 2)更新了文档 ==============PeaceWingSM 0.7.9============== 1)完善了文档 ==============PeaceWingSM 0.7.8============== 1)Bug修复 ==============PeaceWingSM 0.7.7============== 1)Bug修复 ==============PeaceWingSM 0.7.6============== 1)完善了文档 ==============PeaceWingSM 0.7.5============== 1)完成了SM技术栈(SpringMVC 4, Spring 4, Mybatis 3) ===============PeaceWing 0.7================= 1)完成了输出和Eclipse JEE版相兼容的完整源码包 2)修复测试见面的一些缺陷 ===============PeaceWing 0.6================= 1)完成PeaceWing的骨架。 2)完成了S2SM技术栈(Struts 2, Spring 4, Mybatis 3) 3)完成了SGS源码在生成物中的保存 4)完成了SGS1.2,新增了call magic语句 5)完成了HTML5的测试界面
这是一款轻量级的MyBatis插件,在GitHub上发布的有打好的jar包,25.2Kb,导入项目中即可使用,支持创建数据表、自定义查询、分页查询等常用的数据库操作。 依赖包 <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> 目录结构 mybatisMyBatis 通用 Mapper 相关 annotation:注解相关 FieldAttribute.java:字段注解,标示成员变量为数据库字段,并设置相应的约束信息,如:长度、非空、查询字段、索引字段等 KeyAttribute.java:主键注解,标示成员变量为主键,支持标注为自增主键 SortAttribute.java:排序注解,标示成员变量为排序字段 TableAttribute.java:数据表注解,标示实体类对应的表名称、说明信息 provider:Sql 语句生成相关 BaseCreateProvider.java:数据表创建语句的生成器,支持生成索引 BaseDeleteProvider.java:delete 语句生成器,支持根据 ID、主键、自定义条件删除 BaseInsertProvider.java:insert 语句生成器,支持自增主键的 insert 操作 BaseSelectProvider.java:select 语句生成器,支持分页查询、统计查询、自定义条件查询等 BaseUpdateProvider.java:update 语句生成器,支持根据 ID、主键修改数据 BaseEntity.java:所有实体类的父类,提供了自定义查询条件、分页查询、排序的扩展 BaseException.java:自定义异常,在通用 Mapper 运行过程中抛出的异常 BaseMapper.java:所有 Mapper 的父类,提供了通用 Mapper 功能 SqlFieldReader.java:Sql 字段解析类,用于解析实体类中的自定义注解,为生成 Sql 语句服务 TypeCaster.java:类型转换,用于将 Java 中的数据类型转换成相应的 MySql 数据类型 util:工具类相关 Console.java:日志输出工具类,用于在控制台、日志文件中输出相关信息 ObjectUtils.java:Object 工具类,用于对象的空值判断 StringUtils.java:字符串工具类,用于生成指定格式的字符串及对字符串进行各种处理 使用方式 实体类继承 BaseEntity 并使用注解 @TableAttribute(name = "user_info",comment = "用户信息表") public class UserInfo extends BaseEntity { // 标注是自增主键 @KeyAttribute(autoIncr = true) // 标注是数据库字段 @FieldAttribute private int id; // 设置字段注释、非空约束、作为查询条件 @FieldAttribute(value = "用户类型",notNull = true,isCondition = true) private Integer type; @FieldAttribute(value = "密码",length = 200, isDetailed = true) private String password; // 设置字段注释、非空约束、字段长度、是索引字段 @FieldAttribute(value = "邮箱",notNull = true,length = 200,isIndex = true) private String email; @FieldAttribute @SortAttrtibute private Date createTime = new Date(); @FieldAttribute(value = "用户账号状态",isCondition = true) private Integer status ; @FieldAttribute(value = "是否删除,1 表示删除",isCondition = true) private Integer isDelete; ... ... } Dao 层继承 BaseMapper @Mapper public interface UserMapper extends BaseMapper<UserInfo> { } 调用 /** * 根据类型和邮箱查询用户 * @param type * @param email * @return */ private UserInfo getByEmailAndType(int type,String email){ UserInfo userInfo = new UserInfo(); // 设置查询条件1 Email userInfo.setEmail(email); // 设置查询条件2 Type userInfo.setType(type); // 设置使用 And 连接多个查询条件 userInfo.setBaseKyleUseAnd(true); // 执行查询并返回结果 List<UserInfo> list = userMapper.baseSelectList(userInfo); if(list != null && list.size() > 0){ return list.get(0); } return null; }
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现关联数据的查询 mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看中文的:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html) 写在这个系列前面的话: 以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此重新温习了一下 mybatis, 因此就有了这个系列的 mybatis 教程. 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 产生 session 3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包。这些软件工具均可以到各自的官方网站上下载。 首先建立一个名字为 MyBaits 的 dynamic web project 1. 现阶段,你可以直接建立java 工程,但一般都是开发web项目,这个系列教程最后也是web的,所以一开始就建立web工程。 2. 将 mybatis-3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar 拷贝到 web工程的lib目录. 3. 创建mysql 测试数据库和用户表,注意,这里采用的是 utf-8 编码 创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值