该问题出现在ORACLE 数据库,其他数据库没有试过。
如果JAVA中的属性为DATE,而数据库中是DATE类型的话。mybatis会默认将JAVA中DATE属性映射到数据库的
Timestamp类型。这时就会有这样的查询
where create_time >= v_time
左边为DATE右边为Timestamp.类型不一致,ORACLE会隐式将小的转成大的。
也就是变成这样
where to_Timestamp(create_time) >= v_time
这样导致左边的列用到函数的。索引列上使用函数后会导致索引失效。
开始想的解决办法是指定handle,或指定jdbcType
typeHandler=org.apache.ibatis.type.DateOnlyTypeHandler
或者指定
jdbcType=DATE
但这两种办法都有一个缺点,会将时间分截取掉,只留年月日
这样带时分秒的查询就不行了。
带时分秒的查询有如下三种解决办法:
1.将数据库字段改成Timestamp类型
2.将JAVA的属性改成字符串,然后mybatis这样写
where create_time >= to_date(#{v_time},'YYYY-MM-DD HH24:MI:SS')
3.利用一个小技巧timestamp+0会直接强转成date类型
where create_time >= #{v_time} + 0
4.使用一个下面这样的自定义handle,将JAVA的DATE类型转成字符串,然后在mybatis中将字符串转成DATE
HANDLE代码如下:
public class DateTimeTypeHandler extends BaseTypeHandler<Date> { public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, dateToString(parameter)); } public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { java.sql.Timestamp sqlTimestamp = rs.getTimestamp(columnName); if (sqlTimestamp != null) { return new java.util.Date(sqlTimestamp.getTime()); } return null; } public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { java.sql.Timestamp sqlTimestamp = cs.getTimestamp(columnIndex); if (sqlTimestamp != null) { return new java.util.Date(sqlTimestamp.getTime()); } return null; } public String dateToString(Date date){ SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:MM:ss"); return df.format(date); } }
mybatis中代码如下:
where create_time >= to_date(#{v_time,typeHandler=com.mybatisTypehandle.DateTimeTypeHandler},'yyyy-mm-dd hh24:mi:ss')
相关推荐
mybatis 对clob类型转换,解决clob类型数据插入数据库报异常问题
Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)
Mybatis 处理 CLOB、BLOB 类型数据
mybatis数据类型错误及解决方法
3、mybatis类型的定义方式
主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
oracle中date类型的操作,增删改查oracle中date类型的操作,增删改查
总结了Mybatis传递参数的几种方式,并对几种方式进行比较,另外还有一些参数的限制说明
关于MyBatis找不到映射文件的问题的解决方法
Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql mybatis sql connection mybatis中使用sql,不实用配置文件中的sql实例
主要介绍了mybatis连接MySQL8出现的问题解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
我们看到, 直接在可视化工具里用SQL写 ccf.last_update_timestamp between TIMESTAMP '2019-12-13' AND TIMESTAMP '2019-12-13...但是在mapper文件中这么写就不可以了, 它会提示你varchar类型不能和日期类型进行比较
本文处理spring+mybatis,或springjdbc,对oracle事务不能提交的问题分析与解决
mybatis常用jdbcType数据类型.txt mybatis常用jdbcType数据类型.txt
IDEA新建Mybatis项目遇到无法执行的问题,自己多次尝试无果,希望大家能解决这个问题,看看原因,欢迎留言,感谢大家
NULL 博文链接:https://zw7534313.iteye.com/blog/2221078
mybatis-plus是新一代mybatis集成技术,在mybatis基础上集成强大功能。安装此插件到idea上之后,可以在dao层和xml文件之间一键跳转,再也不用反复查找了
MyBatis传入多个参数
Cause: java.lang.ClassNotFoundException: Cannot find class: student 当你使用mybatis注解别名找不到文件时,在你的mybatis配置文件中加入 注意标签一定要放在标签下面