`
liulanghan110
  • 浏览: 1078087 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Mybatis的Date类型不走索引的问题

阅读更多

该问题出现在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中操作日期实例分析

    在Java中,日期时间类型通常有`java.util.Date`、`java.sql.Date`、`java.sql.Time`和`java.sql.Timestamp`。MyBatis在映射XML文件中,需要对这些类型进行适当地配置,例如使用`jdbcType`属性指定数据库对应的日期...

    Mybatis 3+Mysql 实现批量插入

    综上所述,利用MyBatis结合MySQL实现批量插入不仅可以大幅提高数据处理效率,还能有效降低系统资源消耗,是数据库操作中不可或缺的一项技能。通过上述详细讲解,相信读者已经对如何实现批量插入有了清晰的理解。

    oracle,mysql表格转换mybatis相关文件

    Oracle和MySQL的表结构在设计上有所不同,包括字段类型、约束条件、索引等方面。在转换过程中,需要理解这两个数据库的数据类型对应关系,比如Oracle的NUMBER对应MySQL的DECIMAL,VARCHAR2对应VARCHAR等。同时,还要...

    解决mybatis-plus使用jdk8的LocalDateTime 查询时报错的方法

    在使用Mybatis-Plus进行数据查询时,如果你的实体类中使用了Java 8的`LocalDateTime`类型来表示日期时间,并遇到了`SQLFeatureNotSupportedException`的异常,这通常是因为数据库驱动不支持直接将`LocalDateTime`...

    ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob).pdf

    然而,Long类型在处理大量数据时可能效率较低,且不支持索引。在Oracle 10g及更高版本中,建议使用Clob类型代替Long,因为Clob提供了更好的性能和功能。 2. Raw类型: Raw数据类型用于存储二进制数据,如MAC地址或...

    oracle表分区详解

    - 分区表不支持所有类型的索引。例如,全局唯一索引无法跨分区创建。 - 分区表的管理可能比非分区表复杂,尤其是当涉及到大量分区时。 - 对于频繁更改分区键的场景,分区表的维护成本较高。 #### 四、分区类型及...

    mysql 记录不存在时插入 记录存在则更新的实现方法

    在MySQL中,有时候我们需要在确保记录不存在的情况下插入新数据,如果记录已经存在,则需要更新已有数据。这种操作通常被称为“Upsert”或者“Insert...On Duplicate Key Update”。MySQL提供了这样的功能,但要注意...

    java实体转mysql建表语句

    首先,分析实体类的属性,然后根据属性类型选择对应的MySQL数据类型,比如`String`对应`VARCHAR`,`int`对应`INT`,`Date`对应`DATE`或`TIMESTAMP`等。同时,别忘了添加主键、外键、索引等约束。 6. **数据类型映射...

    数据库建库脚本.zip

    3. **数据类型**:在创建表时,需要指定每列的数据类型,如`VARCHAR`用于可变长度的字符串,`INT`用于整数,`DATE`用于日期,`TIMESTAMP`用于日期时间等。 4. **主键和外键**:主键是表中唯一标识记录的字段,通常...

    kellerMapper.jar

    这是一款轻量级的MyBatis插件,在GitHub上发布的有打好的jar包,25.2Kb,导入项目中即可使用,支持创建数据表、自定义查询、分页查询等常用的数据库操作。 依赖包 &lt;groupId&gt;org.mybatis.spring.boot ...

    mysql复杂动态行转列解决方案

    在传统的SQL查询中,我们可以使用`CASE`语句配合`GROUP BY`来实现简单的行转列转换,但这种方法往往不适用于动态列,即列的数量和名称可能根据不同的数据而变化。在这种情况下,我们通常会依赖于`PIVOT`操作,但在...

    TS_系统数据库详细设计模版

    日期和时间类型有DATE、TIME、TIMESTAMP等。 7. **存储过程与触发器**:存储过程是一组预先编译的SQL语句,可以提高性能,降低网络通信,并增强安全性。触发器则在特定数据库操作(如INSERT、UPDATE、DELETE)发生...

    jsp+servlet 实现 财务管理系统

    `Transactions`表用于记录交易,包含`transaction_id`、`account_id`、`amount`、`date`等字段。 系统实现时,还需要考虑以下几个关键点: 1. **安全性**:使用HTTPS协议确保数据传输的安全,防止中间人攻击;对...

    Java 数据库编程面试题资料 pdf

    - 正确的数据类型选择:根据业务需求选择适合的字段类型,如INT、VARCHAR、DATE等。 - 索引的使用:创建合适的索引可以加快查询速度,但过多的索引会影响写操作性能。 - 规范化设计:遵循第一范式(1NF)、第二...

    MYSQL文档资料,基础进阶运维

    - 数据类型:MySQL支持多种数据类型,如整数(INT)、浮点数(FLOAT、DOUBLE)、字符串(VARCHAR、CHAR)、日期和时间(DATE、TIME、DATETIME)等。 - 主键:表中的一个或多个字段,用来唯一标识每一行,确保数据...

    JAVA面试题.zip

    以上是针对给定文件名所涵盖的Java、MySQL、Redis、MyBatis、Spring、Spring Boot、Spring Cloud以及Linux等技术领域的关键知识点,这些内容都是面试中常见的问题点,深入理解和掌握将有助于提升你的IT专业技能。

    java课程设计

    - **索引设计**:考虑对频繁查询的字段添加索引以提高查询效率。 #### 系统设计 - **系统界面设计**:使用Swing或JavaFX等图形库设计用户界面。 - **系统功能模块设计**:划分功能模块,如客户管理模块、供应商管理...

    SSM上机测试试卷-航班信息查询系统.docx

    2. **查看全部航班信息**:展示所有航班的信息列表,包括但不限于航班编号、始发地、目的地等关键信息。 3. **以始发地和目的地名称为条件查询航班信息**:用户可以选择始发地和目的地,系统将根据这两个条件查询...

    JeeSite 默认MySql,让我们来看看如何更换为Oracle数据库

    你需要将MySQL的表结构脚本转换为Oracle兼容的格式,这包括删除`ENGINE=InnoDB`等MySQL特定语句,以及处理字段类型的差异,如`TIMESTAMP`与`DATE`的区别。 二、SQL语法调整 1. 存储过程与函数:Oracle和MySQL的存储...

Global site tag (gtag.js) - Google Analytics