最近在做项目的过程中,使用mybatis的mapper.xml文件发现了一个很低级的错误,在此记录下来提醒自己。
一. 日期类型
数据库采用oracle,日期字段类型为Date。代码中对应实体类的类型为Date,这里注意Date要使用java.util.Date。在使用mybatis自动代码生成工具时,需要指定生成的mapper.xml文件中的字段的jdbcType为TIMESTAMP,因为默认生成的是Date。如果使用默认的Date,在查询时日期的精度只会精确到天,后面的时分秒精度出现丢失。
理论知识:
java.sql 定义的时间类型包含三个类,date,time和timestamp.分别用来表示日期(无时间信息,eg: yyyy-mm-dd),时间(只处理时间,无日期部分, eg:hh:mm:ss)和时间戳(精确到纳秒级别)在它们都继承自java.util.date。
二. 自定义的specMapper.xml
有时候自动生成的mapper无法满足我们的需求,需要自己手动编写mapper.xml文件。在手写mapper文件时,需要编写resultMap标签,并指定数据库中各个字段对应的jdbcType。如:
<resultMap id="BaseResultMap" type="com.cmrh.kettle.common.generated.dao.model.TableErrorFailure" >
<result column="JOB_NAME" property="jobName" jdbcType="VARCHAR" />
<result column="SDB" property="sdb" jdbcType="VARCHAR" />
<result column="TDB" property="tdb" jdbcType="VARCHAR" />
<result column="SOWNER" property="sowner" jdbcType="VARCHAR" />
<result column="STAB" property="stab" jdbcType="VARCHAR" />
<result column="TOWNER" property="towner" jdbcType="VARCHAR" />
<result column="TTAB" property="ttab" jdbcType="VARCHAR" />
<result column="CREATE_DATE" property="createDate" jdbcType="TIMESTAMP" />
<result column="COMM" property="comm" jdbcType="VARCHAR" />
<result column="ERROR_FLAG" property="errorFlag" jdbcType="VARCHAR" />
</resultMap>
我出现的错误就是在编写了resultMap标签后,在编写select语句时,还使用了别名!!!错误如下:
<!-- 根据条件分页查询链路抽取失败的抽取表信息 -->
<select id="getErrorTableLstByPage" resultMap="BaseResultMap" parameterType="com.cmrh.kettle.monitor.dto.TableErrorFailureReqDTO" >
select
job_name as jobName,
sdb,
tdb,
sowner,
stab,
towner,
ttab,
error_flag as errorFlag,
comm,
create_date as createDate
from
其他字段还好,不受影响。主要是日期字段,又出现了精度丢失的情况!!
造成错误的原因就是使用了别名!!
所以正确的写法应该是:
<select id="getErrorTableLstByPage" resultMap="BaseResultMap" parameterType="com.cmrh.kettle.monitor.dto.TableErrorFailureReqDTO" >
select
job_name,
sdb,
tdb,
sowner,
stab,
towner,
ttab,
error_flag,
comm,
create_date
from
好,问题解决。
其实这两个都是很低级的错误,以前只知道套用框架的东西,并没有去想为什么,在此警示自己多去学习mybatis底层的原理!