背景
项目中使用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里面有些表达式是不允许的,需要转义:
含意思 |
原符号 |
转义后 |
小于号 |
< |
< |
小于等于 |
<= |
<= |
大于号 |
> |
> |
大于等于 |
>= |
>= |
和 |
& |
& |
单引号 |
‘ |
' |
双引号 |
“ |
" |