MyBatis中使用LocalDateTime

时间:2024-10-18 07:33:46

背景

项目中使用MySQL数据库,然后用mybatis做数据持久化。最近使用时,想把一些model类的gmtCreate、gmtModified等字段从 改成java8的,此类是不可变类,且自带很好用的日期函数api。

原本依赖如下:

        compile ":mybatis:3.3.0"
        compile ":mybatis-spring:1.2.5"
        compile ":mybatis-generator-core:1.3.2"

直接修改代码有两两个问题:
1. mapper、model、xml文件都是用generator插件生成,维护成本高。
2. 会报错如下:


Caused by: : No typehandler found for property createTime
	at $(:151)
	at $(:140)
	at (:382)
	at (:378)
	at (:280)
	at (:252)
	at (:244)
	at (:116)

修改

首先,添加了以下依赖:(jsr310是java规范310)

compile ":mybatis-typehandlers-jsr310:1.0.2"

接着,在 中添加如下配置:(该配置来源于官网

<typeHandlers>
  <!-- ... -->
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
  <typeHandler handler="" />
</typeHandlers>

看了文档发现需要mybatis 3.4.0版本

compile ":mybatis:3.4.0"

不过这里有个问题了,会出现版本不兼容问题,报错如下:

: ()Ljava/lang/Integer;
	at (:85)
	at (:62)
	at (:325)
	at (:156)
	at (:109)
	at (:83)
	at .invoke0(Native Method)
	at (:62)
	at (:43)
	at (:498)

查看发现 SpringManagedTransaction未实现Transaction中的getTimeout() 方法

/**
 * Wraps a database connection.
 * Handles the connection lifecycle that comprises: its creation, preparation, commit/rollback and close. 
 *
 * @author Clinton Begin
 */
public interface Transaction {

  /**
   * Retrieve inner database connection
   * @return DataBase connection
   * @throws SQLException
   */
  Connection getConnection() throws SQLException;

  /**
   * Commit inner database connection.
   * @throws SQLException
   */
  void commit() throws SQLException;

  /**
   * Rollback inner database connection.
   * @throws SQLException
   */
  void rollback() throws SQLException;

  /**
   * Close inner database connection.
   * @throws SQLException
   */
  void close() throws SQLException;

}

 

查了文档发现:Spring版本跟Mybatis版本有个对照表要满足,详情见官网
 而我需要的文件类似如下:

<mapper namespace="">
    <resultMap  type="">
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="gmt_create" jdbcType="OTHER" property="gmtCreate" typeHandler=""/>

    </resultMap>
    <!--- 省略 --->

</mapper>

之后,查了generator的官方文档,发现还是可以通过的配置文件做到的。

        <table tableName="my_table" domainObjectName="MyModel">
            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
            <columnOverride column="gmt_create" property="gmtCreate" typeHandler="" jdbcType="OTHER" javaType="" />
            <columnOverride column="gmt_modified" property="gmtModified" typeHandler="" jdbcType="OTHER" 
            <!-- 省略其他 -->
        </table>

这里解释下:
columnOverride将数据库中的字段重命名为实体类的属性
column:数据库中字段名
property:POJO属性名
javaType:POJO类型,这里用的是
jdbcType:数据库字段类型,SQL中是timestamp,但这里要写OTHER,否则typehandler不处理
typehandler:帮我们处理类型的

此时再用generator生成的就是我想要的了

 

扩展

严格来说生成的是不能修改的。可实际中,很多时候需要我们再手写自定义的查询。此时可以再生成一个扩展的xml文件。或者在generator里面配置插件也会生成一个空的:

mybatis-ext

 

转义字符

在xml里面有些表达式是不允许的,需要转义:

含意思

原符号

转义后

小于号

<

&lt;

小于等于

<=

&lt;=

大于号

>

&gt;

大于等于

>=  

&gt;=

&

&amp;

单引号

&apos;

双引号

&quot;