java有java的数据类型,数据库有数据库的数据类型,
那么在往数据库中插入数据的时候是如何把java类型当做数据库类型插入数据库?
在从数据库读取数据的时候又是如何把数据库类型当做java类型来处理呢?
mybatis中jdbcType时间类型
jdbcType = DATE , 只传入年月日 (数据库中的时间为yyyy-MM-dd)
jdbcType = TIME , 只传入时分秒
jdbcType = TIMESTAMP , 年月日+ 时分秒 (数据库中的时间为yyyy-MM-dd HH:mm:ss)
可以在result中设置jdbcType
<result column="modified_date" jdbcType="TIMESTAMP" property="modified_date" javaType="java.sql.Timestamp" />
Ibatis是怎么处理日期类型的
之前碰到过Oracle中的Date字段只剩下日期部分,数据丢失了。(oracle时间类型DATE:它可以保存日期和时间)
一些人的解决方法是将jdbcType指定为datetime。
其实这完全是瞎猫撞上死耗子,那个datetime根本没意义,却歪打正着。
一般的错误都是如下的配置jdbcType="DATE"(或者是pojo的属性为java.sql.Date类型):
<sqlMap namespace="Info" >
<resultMap id="Info" class="pojo.Info" >
<result column="INFO_BEGINTIME" property="begin" jdbcType="DATE" />
<result column="INFO_ENDTIME" property="end" jdbcType="DATE" />
</resultMap>
===========================================================
<result column="date" jdbcType="DATE" property="date" javaType="java.util.Date" />
如果指定jdbcType="Date",此时不论你pojo.date中的字段类型(或者的javaType属性)是java.util.Date还是java.sql.Date,最终都会丢失数据。
实际上,在pojo.Info中的字段类型(或者javaType属性)为java.util.Date时,如果指定jdbcType为DATE或TIME(区分大小写),则将分别得到DateOnlyTypeHandler或TimeOnlyTypeHandler。
如果你不指定jdbcType,或者指定一个错误的值,例如datetime,或者xxxx等,都会得到DateTypeHandler(日期时间都会处理)。
如果pojo.date的字段类型(或者配置中的javaType属性)是java.sql.Date,则选择处理handler类时不会使用jdbcType,而是根据属性类型得到SqlDateTypeHandler(只包含日期)。
jdbcType 是否必须:
使用时不加jdbcType也可以正常运行, 当传入字段值为null时,需要jdbcType,否则报错。
在Ibatis的手册中,指出来jdbcType一般情况下是不用于判断处理方式的,大部分情况下是依据javaType或者pojo属性类型来判断处理方式,只有在少部分无法根据pojo属性类型判断的情况下才使用。(字段为null,或javaType没写)
优先级(jdbcType->javaType->pojo字段类型)
如果你用java.util.Date对应到MySQL则就是这种少数情况之一。
因为MySQL可以将多个数据库字段类型映射到java.util.Date,所以需要指定是DATE还是TIME(必须是大写),如果不指定则默认是完整的日期时间(此时按JDBC的timestamp操作)。
对于Mybatis操作Date/Time/DateTime,总结如下:
将pojo的属性类型设置为java.sql.Date(或java.sql.Time, java.sql.Timestamp),此时会严格遵循这三种类型的语义。但此方法因存在前文中提到的性能问题,在JDK1.6以前的JDK版本中能少使用就少使用。
在JDK1.6之前版本的构造java.sql.{Date|Time|TimeStamp}对象时存在性能问题,尤其是在多线程环境下更严重。这个Bug在这里。其原因是java.util.Date的相关方法调用了TimeZone.getDefaultRef(),而此方法是同步方法。
如果你想在pojo中使用java.util.Date, 则要注意:
完整的日期时间,要确保jdbcType为空,或jdbcType为DATE,TIME以外的值
只需要时间,要指定jdbcType=”TIME”
只需要日期,要指定jdbcType=”DATE”
相关推荐
在Mybatis中,TypeHandler起着至关重要的作用,它是Mybatis处理Java类型与JDBC类型之间转换的桥梁。这篇博文将深入探讨Mybatis的TypeHandler机制及其在实际开发中的应用。 TypeHandler的主要职责是将Java类型的参数...
首先,MyBatis提供了多种类型处理器(TypeHandler),它们是MyBatis在数据库与Java对象间进行类型转换的关键。类型处理器的作用在于,当SQL查询执行后,数据库返回的结果会被类型处理器转换为Java对象,反之,当执行...
在 MyBatis 框架中,`jdbcType` 起到了桥梁的作用,使得 Java 类型的数据能够正确地转换为 SQL 语句中的对应类型。以下是对 MyBatis 常用的 `jdbcType` 数据类型的详细解释: 1. **BIT**: 用于存储单个二进制位,...
在MyBatis框架中,类型转换器TypeHandler扮演着至关重要的角色,它负责在Java对象与数据库之间的数据转换。在某些场景下,MyBatis内置的类型转换器可能无法满足我们的需求,这时就需要我们自定义TypeHandler。下面将...
现在,当你在Mapper接口中使用`Gender`枚举类型时,MyBatis会自动使用我们定义的`GenderTypeHandler`进行转换。例如: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE gender...
在使用MyBatis Generator生成Java ...理解这种类型的转换规则以及如何自定义映射关系,对优化MyBatis的使用和提高代码的可维护性至关重要。在实际开发中,应根据项目的具体需求和数据库设计来选择合适的方法进行处理。
MyBatis的TypeHandler是处理Java类型与JDBC类型之间转换的关键组件。当我们在映射文件中配置SQL语句时,MyBatis会根据TypeHandler来处理Java对象与数据库字段之间的数据转换。对于枚举类型,MyBatis默认并没有内置的...
MyBatis会根据此类型进行转换。 5. **jdbcType**:JDBC的类型,对应于SQL语句中的类型。在某些情况下,如Oracle的CLOB类型,可能需要指定。 6. **property**:Java对象的属性名,这个属性会接收来自数据库列的值。...
- **typeHandlers**:类型处理器,它决定了 MyBatis 如何将特定类型的值在 JavaType、JdbcType 和 SQL 类型之间进行转换。 - **objectFactory**:指定创建具有延迟加载能力的对象所需的类。 - **plugins**:为 ...
6. `javaType` 和 `jdbcType`:指定Java类型和JDBC类型,用于数据转换。 7. `association`:用于处理一对一关联关系,内部还可以包含另一个ResultMap来映射关联的对象。 8. `collection`:用于处理一对多关联关系,...
- **类型处理器**:用于将预处理语句(PreparedStatement)的参数从JavaType转换到JdbcType,或者从数据库结果集中取出的数据转换为JavaType。 - **对象工厂**:控制MyBatis创建的新对象的实例化方式。 - **插件**:...
这里,`id`, `result`标签分别表示主键和普通字段,`property`属性对应Java对象的字段名,`column`属性对应数据库表的列名,`jdbcType`则是JDBC类型,用于优化数据类型转换。 Mybatis还支持关联映射,如一对多、多...
然而,默认情况下,MyBatis并不直接支持Java 8的日期时间类型。当尝试将`LocalDate`或`LocalDateTime`映射到数据库字段时,可能会遇到类型转换异常。 为了解决这个问题,我们可以采用以下步骤: 1. 添加MyBatis的...
- 语法:`#{property}` 或 `#{property,javaType=int,jdbcType=INTEGER}`。 - **resultMap元素**:用于定义复杂结果映射规则。 - 关联属性:`id`, `resultType`, `association`, `collection`, `constructor`, `...
在Mybatis中,TypeHandler是一个关键组件,它负责Java类型与JDBC类型的转换。当数据库字段需要与Java对象中的特定类型进行映射时,Mybatis会使用预定义或自定义的TypeHandler。以下是对"Mybatis实现自定义的type...
TypeHandler是MyBatis处理Java类型与JDBC类型之间转换的接口,用于处理自定义类型的字段。当数据库中的字段需要与Java的枚举类型进行映射时,我们就需要自定义TypeHandler。例如,如果我们有一个`Sex`枚举类型,我们...
- **实现方法**:通过配置文件中的`<columnOverride>`标签指定特定字段的注释,或者使用`<javaType>`和`<jdbcType>`属性来自动生成默认注释。 - **效果展示**:例如,对于一个名为`User`的实体类,可以通过配置使其...
- **#{}**:被解析成预编译语句中的参数,可以防止SQL注入攻击,并支持类型自动转换。 - **${}**:直接替换为字符串值,不会进行预编译处理,容易引发SQL注入攻击。 `#{}` 的使用格式一般为 `{property, jdbcType=...
MyBatis是一个基于Java的持久层框架,提供了强大的数据持久化功能,而TypeHandler是MyBatis中一个非常重要的组件,负责将Java类型转换为数据库类型,反之亦然。在实际开发中,我们常常需要根据业务需求自定义Type...
在处理UUID主键时,通用Mapper会自动调用自定义的TypeHandler进行转换,从而实现了对UUID类型的支持。这个示例的3页PDF文档很可能会详细介绍这些步骤,并提供更具体的代码示例和注意事项,帮助开发者更好地理解和...