Git Product home page Git Product logo

typehandlers-jsr310's Introduction

❗️ Note:
❗️ Type handlers for "JSR 310: Date and Time API" has been merged into mybatis core since 3.4.5. (See #974)


MyBatis Type Handlers for JSR 310: Date and Time API

Build Status Coverage Status Dependency Status Maven central License

mybatis

The MyBatis type handlers supporting types introduced in JSR 310: Date and Time API.

Installation

If you are using Maven add the following dependency to your pom.xml:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-typehandlers-jsr310</artifactId>
  <version>1.0.2</version>
</dependency>

If you are using Gradle add the following dependency to your build.gradle:

compile("org.mybatis:mybatis-typehandlers-jsr310:1.0.2")

Configuration

If you are using MyBatis 3.4 or later, you can simply add this artifact on your classpath and MyBatis will automatically register the provided type handlers. If you are using an older version, you need to add the type handlers to your mybatis-config.xml as follow:

<typeHandlers>
  <!-- ... -->
  <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.YearTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.MonthTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler" />
</typeHandlers>

Supported types

The following type handlers are supported:

Type handler Date and Time API type JDBC types Available
version
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER 1.0.1
MonthTypeHandler java.time.Month INTEGER 1.0.1
YearMonthTypeHandler java.time.YearMonth VARCHAR or LONGVARCHAR 1.0.2
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE 1.0.2

Note:

For more details of type handler, please refer to "MyBatis 3 REFERENCE DOCUMENTATION".

typehandlers-jsr310's People

Contributors

emacarron avatar harawata avatar hazendaz avatar kazuki43zoo avatar raupachz avatar trohovsky avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

typehandlers-jsr310's Issues

Support for threeten-extra

ThreeTen-Extra is a small library that builds on the Java SE 8 java.time package. It provides some additional classes that come in handy as value types.

We use it quite often in our projects and we already have several converters in place. Would be nice if we could add these type converters to mybatis/typehandlers-jsr310.

I don't think it would make sense to add a compile scope dependency to threeten-extra. Is there any other way to add type converters to this project? I do know some maven intrinsics but dependency scopes like optional and runtime I do not know much.

Edit
In my repo I added threeten-extra as an optional dependency.

<dependency>
  <groupId>org.threeten</groupId>
  <artifactId>threeten-extra</artifactId>
  <version>1.0</version>
  <scope>compile</scope>
  <optional>true</optional>
</dependency>

Now I can use typehandlers-jsr310 in my project even if threeten-extra is not included. Adding threeten-extra allows me to use the additional typehandlers.

We just can't auto register the threeten-extra typehandlers in mybatis-3, since we don't know if threeten-extra is included or not.

Update README.md for 1.0.2

Update as follow:

  • Update version from 1.0.1 to 1.0.2
  • Add the YearMonthTypeHandler
  • Add the JapaneseDateTypeHandler

JapaneseDateTypeHandlerTest inconsistent results

I'm unable to build this module on my local machine. Possibly something with daylight savings time not sure.

Build always works fine on travis-ci.

Here is what I get locally. I'm in US Eastern time zone.

Failed tests:
  JapaneseDateTypeHandlerTest.shouldGetResultFromCallableStatement:76 expected:<Japanese Heisei 28-12-29> but was:<Japanese Heisei 28-12-28>
  JapaneseDateTypeHandlerTest.shouldGetResultFromResultSetByName:46 expected:<Japanese Heisei 28-12-29> but was:<Japanese Heisei 28-12-28>
  JapaneseDateTypeHandlerTest.shouldGetResultFromResultSetByPosition:61 expected:<Japanese Heisei 28-12-29> but was:<Japanese Heisei 28-12-28>

refs #12

OSGI header Private-Package

I think there is something wrong in MANIFEST.MF generation.

In version 1.0.1 we have this:

Private-Package: org.apache.ibatis.type

Which makes all handlers invisble when running in for example Karaf.

When looking at the POM's (both this one and parent) it seems correct.
In parent we add Private-Package only if the property ${osgi.private} is set and it's not set in this projects pom from what I can see but still we get the header in MANIFEST.MF

OffsetDateTimeTypeHandler or ZonedDateTimeTypeHandler loses time zone information

Hello,
I would assume that people using your implementation of a "ZonedDateTimeTypeHandler" expect it to convert dates with timezone information in their database to EQUIVALENT Java objects, which it does not (really).

It merely converts them to objects that, technically point to the same moment in time, however with the zone or offset information completely lost. All the ZonedDateTime or OffsetDateTime objects that the handlers create always refer to the system default time zone, never to the one of the actual entry!

Instead of only using the getTimestamp() method of the ResultSet (which can only return a java.sql.Timestamp with the zone information already lost) it would be cool if you could at least offer an alternative implementation that tries to retain the offset/timezone information by using the getString() method instead.

An example for the OffsetDateTimeTypeHandler could be:

@Override
public OffsetDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
  String dateString = rs.getString(columnName)
  if(dateString == null) {
    return null;
  }
  OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateString, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
  return offsetDateTime;
}

I found the idea here. Of course, this would assume that the String representation of the databases for those "timestamp with time zone" datatypes comply with the ISO format. Instead of guessing users could hand over the format-mask to a method that converts to the String representation of that column in the select statement. E.g. in Oracle that could be:
SELECT to_char(table0.MY_DATE_COLUMN, 'YYYY-MM-DD"T"HH24:MI:SSFFTZH:TZM') as MY_DATE_COLUMN). Such a remark could be added in the class documentation of the type handler, for example.

Even if you do not want to add such handlers, you should at least mention in your documentation (class documentation and README.MD) that the handlers you provide do NOT retain the information of the original timezone or the original offset but do always convert them to the system's default.

Cheers!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.