12.平凡之路-自定义数据类型转换

胖先森

MyBatis数据类型转换,默认情况下MyBatis已经帮我们完成了很多的数据类型的转换,一般情况下我们直接使用即可,下面大概介绍一下

一 Java日期类型和Jdbc字符串类型转换

在做开发时,我们经常会遇到这样一些问题,比如我有一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,怎么实现?

就是我直接向数据库写数据,要写的是一个Date对象,但是写到数据库之后这个Date对象就变成了Date对象所描述的时间到1970年的秒数了,然后当我从数据库读取这个秒数之后,系统又会自动帮我将这个秒数转为Date对象,就是这样两个需求.

1.新增数据库字段

2.持久化类中代码

public class User implements java.io.Serializable{

    private static final long serialVersionUID = 1L;

    private Integer user_id;
    private String account;
    private String password;
    private String user_name;
    private Integer status;
    private Date login_time;
    private String ip;
    private Integer fk_role_id;
    //注意这里是java.util.Date类型
    private Date create_time;
  
}

3.自定义typeHandler继承自BaseTypeHandler

自定义typeHandler我们有两种方式:

  • 实现TypeHandler接口
  • 简化的写法就是继承自BaseTypeHandler类
package com.shxt.type;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class MyDateTypeHandler extends BaseTypeHandler<Date> {

    @Override
    public Date getNullableResult( ResultSet rs , String columnName ) throws SQLException {
        return this.getDate(rs.getLong(columnName));
    }

    @Override
    public Date getNullableResult( ResultSet rs , int columnIndex ) throws SQLException {
        return this.getDate(rs.getLong(columnIndex));
    }

    @Override
    public Date getNullableResult( CallableStatement cs , int columnIndex ) throws SQLException {
        return this.getDate(cs.getLong(columnIndex));
    }

    @Override
    public void setNonNullParameter( PreparedStatement ps , int index , Date parameter , JdbcType jdbcType )
            throws SQLException {
        ps.setString(index, String.valueOf(parameter.getTime()));

    }

    private Date getDate(Long columnValue){
        if(columnValue==null){
            return null;
        }
        return new Date(columnValue);
    }

}

4.在Mapper中进行配置

自定义好了typeHandler之后,接下来我们需要在UserMapper.xml中进行简单的配置,首先我们可以像上文说的,配置resultMap,如下:

<mapper namespace="com.shxt.dao.UserDao">
     <resultMap type="com.shxt.model.User" id="BaseResultMapper">
        <id column="user_id" property="user_id"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="user_name" property="user_name"/>
        <result column="status" property="status"/>
        <result column="login_time" property="login_time"/>
        <result column="ip" property="ip"/>
        <result column="fk_role_id" property="fk_role_id"/>
        <!-- 使用自定义的转换 -->
        <result typeHandler="com.shxt.type.MyDateTypeHandler" 
            column="create_time" jdbcType="VARCHAR"
            property="create_time" javaType="java.util.Date"
        />
    </resultMap>
    
    <sql id="sys_user_columns">
        user_id,account,password,user_name,status,login_time,ip,fk_role_id,create_time
    </sql>
    <select id="load" parameterType="int" resultMap="BaseResultMapper">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
        WHERE user_id=#{user_id}
    </select>
</mapper>

5.查询数据

6.测试代码

<result typeHandler="com.shxt.type.MyDateTypeHandler" 
            column="create_time" jdbcType="VARCHAR"
            property="create_time" javaType="java.util.Date"
        />
    @Test
    public void 数据类型转换(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            User u1 = sqlSession.selectOne(UserDao.class.getName()+".load",-888);
            System.out.println("第一次查询:"+u1);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }

    }

7.控制台运行结果

DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id,create_time FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -888(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id, create_time
TRACE [main] - <==        Row: -888, admin, admin, 悟空, 1, 2017-07-30 09:50:47.0, , -100, 1504618580
DEBUG [main] - <==      Total: 1
第一次查询:User [user_id=-888, account=admin, password=admin, user_name=悟空, status=1, login_time=Sun Jul 30 09:50:47 CST 2017, ip=, fk_role_id=-100, create_time=Sun Jan 18 17:56:58 CST 1970]

create_time=Sun Jan 18 17:56:58 CST 1970 将字符串转换为了日期类型

8.添加数据映射文件

这种方式有一个缺点那就是只适用于查询操作,即在查询的过程中系统会启用我们自定义的typeHandler,会将秒数转为Date对象,但是在插入的时候却不会启用我们自定义的typeHandler,想要在插入的时候启用自定义的typeHandler,需要我们在insert节点中简单配置一下

    <insert id="add01" parameterType="com.shxt.model.User">
        INSERT INTO
            sys_user
            (account,password,user_name,create_time)
            VALUES
            (#{account},#{password},#{user_name},
            #{create_time,javaType=Date,jdbcType=VARCHAR,typeHandler=com.shxt.type.MyDateTypeHandler})
    </insert>

或者配置如下

<insert id="add02" parameterType="com.shxt.model.User">
        INSERT INTO
            sys_user
            (account,password,user_name,create_time)
            VALUES
            (#{account},#{password},#{user_name},
            #{create_time,typeHandler=com.shxt.type.MyDateTypeHandler})
</insert>

9.测试代码

    @Test
    public void 添加方式1(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            User user = new User();
            user.setAccount("tangseng");
            user.setPassword("123");
            user.setUser_name("唐僧");
            user.setCreate_time(new Date());

            sqlSession.insert(UserDao.class.getName()+".add02", user);

            sqlSession.commit();

        }catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }

    }

二 List< String >类型和Jdbc字符串的转换

1.准备的SQL语句

CREATE TABLE `person` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`hobby`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=1
ROW_FORMAT=DYNAMIC
;

2.新建持久化类

public class Person {
    private Integer id;
    private List<String> hobbyList;

    public Integer getId() {
        return this.id;
    }
    public void setId( Integer id ) {
        this.id = id;
    }
    public List<String> getHobbyList() {
        return this.hobbyList;
    }
    public void setHobbyList( List<String> hobbyList ) {
        this.hobbyList = hobbyList;
    }
    @Override
    public String toString() {
        return "Person [id=" + this.id + ", hobbyList=" + this.hobbyList + "]";
    }


}

3.自定义处理类型

package com.shxt.type;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class MyListTypeHandler extends BaseTypeHandler<List<String>> {

    @Override
    public List<String> getNullableResult( ResultSet rs , String columnName ) throws SQLException {
        return this.getList(rs.getString(columnName));
    }

    @Override
    public List<String> getNullableResult( ResultSet rs , int columnIndex ) throws SQLException {
        return this.getList(rs.getString(columnIndex));
    }

    @Override
    public List<String> getNullableResult( CallableStatement cs , int columnIndex ) throws SQLException {
        return this.getList(cs.getString(columnIndex));
    }

    @Override
    public void setNonNullParameter( PreparedStatement ps , int index , List<String> parameter , JdbcType jdbcType )
            throws SQLException {
        //1.List集合转字符串
        StringBuffer sb = new StringBuffer();
        for (String value : parameter) {
            sb.append(value).append(",");
        }
        //2.设置给ps
        ps.setString(index, sb.toString().substring(0, sb.toString().length() - 1));

    }

    private List<String> getList(String columnValue){
        if (columnValue == null) {
            return null;
        }
        return  Arrays.asList(columnValue.split(","));
    }

}


4.新建映射文件

<mapper namespace="com.shxt.model.Person">
     <resultMap type="com.shxt.model.Person" id="BaseResultMapper">
        <id column="id" property="id"/>
        <!-- 使用自定义的转换 -->
        <result typeHandler="com.shxt.type.MyListTypeHandler" 
            column="hobby" jdbcType="VARCHAR"
            property="hobbyList" javaType="list"
        />
    </resultMap>
    <select id="load" parameterType="int" resultMap="BaseResultMapper">
        SELECT
            id,hobby
        FROM
            person
        WHERE id=#{id}
    </select>
</mapper>

5.测试代码

    @Test
    public void 查询02(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            Person p = sqlSession.selectOne(Person.class.getName()+".load",1);
            System.out.println(p);
          
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

6.控制台运行结果

DEBUG [main] - ==>  Preparing: SELECT id,hobby FROM person WHERE id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
TRACE [main] - <==    Columns: id, hobby
TRACE [main] - <==        Row: 1, basketball,football,music
DEBUG [main] - <==      Total: 1

Person [id=1, hobbyList=[basketball, football, music]]

7.添加数据映射文件

    <!-- 添加1 -->
    <insert id="add" parameterType="com.shxt.model.Person">
        INSERT INTO
            person
            (hobby)
            VALUES
            (
            #{hobbyList,javaType=java.util.List,jdbcType=VARCHAR,typeHandler=com.shxt.type.MyListTypeHandler}
            )
    </insert>

8.测试代码

    @Test
    public void 添加方式02(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            List<String> hobbyList = new ArrayList<String>();
            hobbyList.add("music");
            hobbyList.add("book");

            Person p = new Person();
            p.setHobbyList(hobbyList);

            sqlSession.insert(Person.class.getName()+".add", p);

            sqlSession.commit();

        }catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }

    }

9.控制台运行结果

DEBUG [main] - ==>  Preparing: INSERT INTO person (hobby) VALUES ( ? ) 
DEBUG [main] - ==> Parameters: music,book(String)
DEBUG [main] - <==    Updates: 1

三 Java 数组和Jdbc字符串的转换

该着上面的List<String>

1.自定义类型

package com.shxt.type;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class MyArrayTypeHander extends BaseTypeHandler<String[]> {
    /**
     * 获取数据结果集时把数据库类型转换为对应的Java类型
     * @param rs 当前的结果集
     * @param columnName 当前的字段名称
     * @return  转换后的Java对象
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult( ResultSet rs , String columnName ) throws SQLException {
        return this.getStringArray(rs.getString(columnName));
    }
    /**
     * 通过字段位置获取字段数据时把数据库类型转换为对应的Java类型
     * @param rs 当前的结果集
     * @param columnIndex 当前字段的位置
     * @return 转换后的Java对象
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult( ResultSet rs , int columnIndex ) throws SQLException {
        return this.getStringArray(rs.getString(columnIndex));
    }
    /**
     * 调用存储过程后把数据库类型的数据转换为对应的Java类型
     * @param cs  当前的CallableStatement执行后的CallableStatement
     * @param columnIndex  当前输出参数的位置
     * @return
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult( CallableStatement cs , int columnIndex ) throws SQLException {
        return this.getStringArray(cs.getString(columnIndex));
    }
    /**
     * 把Java类型参数转换为对应的数据库类型
     * @param ps 当前的PreparedStatement对象
     * @param index 当前参数位置
     * @param parameter 当前参数的Java对象
     * @param jdbcType 当前参数的数据库类型
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter( PreparedStatement ps , int index , String[] parameter , JdbcType jdbcType )
            throws SQLException {
        // 由于BaseTypeHandler中已经把parameter为null的情况做了处理,所以这里我们就不用在判断parameter是否为空,直接用就可以了
        StringBuffer result = new StringBuffer();
        for (String value : parameter) {
            result.append(value).append(",");
        }
        result.deleteCharAt(result.length() - 1);

        ps.setString(index, result.toString());

    }

    /**
     * 讲"book,music"转化为数组对象
     * @param columnValue
     * @return
     */
    private String[] getStringArray(String columnValue) {
        if (columnValue == null) {
            return null;
        }
        return columnValue.split(",");
    }

}

2.映射文件代码

<mapper namespace="com.shxt.model.Person">
     <resultMap type="com.shxt.model.Person" id="BaseResultMapper">
        <id column="id" property="id"/>
        <!-- 数据库字符串转List<String> -->
        <result typeHandler="com.shxt.type.MyListTypeHandler" 
            column="hobby" jdbcType="VARCHAR"
            property="hobbyList" javaType="list"
        />
        <!-- 数据库字符串转Boolean -->
        <result typeHandler="com.shxt.type.MyBooleanTypeHandler"
            column="flag" jdbcType="VARCHAR"
            property="flag" javaType="boolean"
        />
        <!-- 数据库字符串转String[] -->
         <result typeHandler="com.shxt.type.MyArrayTypeHander"
            column="hobbyArray" jdbcType="VARCHAR"
            property="hobbyArray" javaType="[Ljava.lang.String;"
        />
        
    </resultMap>
    <select id="load" parameterType="int" resultMap="BaseResultMapper">
        SELECT
            id,hobby,flag,hobby hobbyArray
        FROM
            person
        WHERE id=#{id}
    </select>
</mapper>

3.测试代码

    @Test
    public void 查询02(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            Person p = sqlSession.selectOne(Person.class.getName()+".load",1);
            System.out.println(p);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

4.控制台运行结果

DEBUG [main] - ==>  Preparing: SELECT id,hobby,flag,hobby hobbyArray FROM person WHERE id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
TRACE [main] - <==    Columns: id, hobby, flag, hobbyArray
TRACE [main] - <==        Row: 1, basketball,football,music, N, basketball,football,music
DEBUG [main] - <==      Total: 1
Person [id=1, hobbyList=[basketball, football, music], flag=false, hobbyArray=[basketball, football, music]]

5.添加操作映射文件

    <insert id="add" parameterType="com.shxt.model.Person">
        INSERT INTO
            person
            (hobby,flag)
            VALUES
            (
            #{hobbyArray,typeHandler=com.shxt.type.MyArrayTypeHander}
            ,
            #{flag,typeHandler=com.shxt.type.MyBooleanTypeHandler}
            )
    </insert>

6.测试代码

    @Test
    public void 添加方式02(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();


            Person p = new Person();
            p.setHobbyArray(new String[]{"book","music"});
            p.setFlag(true);

            sqlSession.insert(Person.class.getName()+".add", p);

            sqlSession.commit();

        }catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }

    }

7.控制台运行结果

DEBUG [main] - ==>  Preparing: INSERT INTO person (hobby,flag) VALUES ( ? , ? ) 
DEBUG [main] - ==> Parameters: book,music(String), Y(String)
DEBUG [main] - <==    Updates: 1

Java 布尔类型和Jdbc字符串的转换

需求场景:当数据库中保存'Y'/'N',而对应bean字段的值的类型为boolean,这是就需要我们自定义类型转换器,在Mybatis执行SQL得到结果时,通过自定义类型转换器将CHAR或者VARCHAR2类型转换为boolean类型,Java代码如下:

1.自定义类型

package com.shxt.type;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class MyBooleanTypeHandler extends BaseTypeHandler<Boolean> {

    private Boolean getBoolean(String flag){
        Boolean bool = Boolean.FALSE;
        if (flag.equalsIgnoreCase("Y")){
            bool = Boolean.TRUE;
        }
        return bool;
    }

    @Override
    public Boolean getNullableResult( ResultSet rs , String columnName ) throws SQLException {
        return this.getBoolean(rs.getString(columnName));
    }

    @Override
    public Boolean getNullableResult( ResultSet rs , int columnIndex ) throws SQLException {
        return this.getBoolean(rs.getString(columnIndex));
    }

    @Override
    public Boolean getNullableResult( CallableStatement cs , int columnIndex ) throws SQLException {
        return this.getBoolean(cs.getString(columnIndex));
    }

    @Override
    public void setNonNullParameter( PreparedStatement ps , int index , Boolean parameter , JdbcType jdbcType )
            throws SQLException {
        String flag = parameter?"Y":"N";
        ps.setString(index, flag);
    }

}


2.映射文件

<mapper namespace="com.shxt.model.Person">
     <resultMap type="com.shxt.model.Person" id="BaseResultMapper">
        <id column="id" property="id"/>
        <!-- 使用自定义的转换 -->
        <result typeHandler="com.shxt.type.MyListTypeHandler" 
            column="hobby" jdbcType="VARCHAR"
            property="hobbyList" javaType="list"
        />
        
        <result typeHandler="com.shxt.type.MyBooleanTypeHandler"
            column="flag" jdbcType="VARCHAR"
            property="flag" javaType="boolean"
        />
    </resultMap>
    <select id="load" parameterType="int" resultMap="BaseResultMapper">
        SELECT
            id,hobby,flag
        FROM
            person
        WHERE id=#{id}
    </select>
</mapper>

3.测试代码

    @Test
    public void 查询02(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            Person p = sqlSession.selectOne(Person.class.getName()+".load",1);
            System.out.println(p);


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

4.控制台运行结果

DEBUG [main] - ==>  Preparing: SELECT id,hobby,flag FROM person WHERE id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
TRACE [main] - <==    Columns: id, hobby, flag
TRACE [main] - <==        Row: 1, basketball,football,music, N
DEBUG [main] - <==      Total: 1

Person [id=1, hobbyList=[basketball, football, music], flag=false]

5.添加操作映射文件

    <insert id="add" parameterType="com.shxt.model.Person">
        INSERT INTO
            person
            (hobby,flag)
            VALUES
            (
            #{hobbyList,javaType=java.util.List,jdbcType=VARCHAR,typeHandler=com.shxt.type.MyListTypeHandler}
            ,
            #{flag,typeHandler=com.shxt.type.MyBooleanTypeHandler}
            )
    </insert>

6.控制台运行结果

DEBUG [main] - ==>  Preparing: INSERT INTO person (hobby,flag) VALUES ( ? , ? ) 
DEBUG [main] - ==> Parameters: music,book(String), Y(String)
DEBUG [main] - <==    Updates: 1

附录A : 常用java类型和jdbc类型对应表

类型处理器 Java 类型 JDBC 类型
BooleanTypeHandler java.lang.Boolean, boolean 数据库兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 数据库兼容的 NUMERICBYTE
ShortTypeHandler java.lang.Short, short 数据库兼容的 NUMERICSHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 数据库兼容的 NUMERICINTEGER
LongTypeHandler java.lang.Long, long 数据库兼容的 NUMERICLONG INTEGER
FloatTypeHandler java.lang.Float, float 数据库兼容的 NUMERICFLOAT
DoubleTypeHandler java.lang.Double, double 数据库兼容的 NUMERICDOUBLE
BigDecimalTypeHandler java.math.BigDecimal 数据库兼容的 NUMERICDECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 数据库兼容的字节流类型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定类型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERICDOUBLE 类型,存储枚举的索引(而不是名称)。
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
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR or LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE

一个简单的结果集映射示例

<resultMap type="java.util.Map" id="resultjcm">
  <result property="FLD_NUMBER" column="FLD_NUMBER"  javaType="double" jdbcType="NUMERIC"/>
  <result property="FLD_VARCHAR" column="FLD_VARCHAR" javaType="string" jdbcType="VARCHAR"/>
  <result property="FLD_DATE" column="FLD_DATE" javaType="java.sql.Date" jdbcType="DATE"/>
  <result property="FLD_INTEGER" column="FLD_INTEGER"  javaType="int" jdbcType="INTEGER"/>
  <result property="FLD_DOUBLE" column="FLD_DOUBLE"  javaType="double" jdbcType="DOUBLE"/>
  <result property="FLD_LONG" column="FLD_LONG"  javaType="long" jdbcType="INTEGER"/>
  <result property="FLD_CHAR" column="FLD_CHAR"  javaType="string" jdbcType="CHAR"/>
  <!-- 如果自己不知道写说明,那么就可以省略javaType和jdbcType也是可以的 -->
  <result property="FLD_BLOB" column="FLD_BLOB"  javaType="[B" jdbcType="BLOB" />
  <result property="FLD_CLOB" column="FLD_CLOB"  javaType="string" jdbcType="CLOB"/>
  <result property="FLD_FLOAT" column="FLD_FLOAT"  javaType="float" jdbcType="FLOAT"/>
  <result property="FLD_TIMESTAMP" column="FLD_TIMESTAMP"  javaType="java.sql.Timestamp" jdbcType="TIMESTAMP"/>
 </resultMap>

如果自己不知道写说明,那么就可以省略javaType和jdbcType也是可以的

附录B : Oracle数据类型和对应的java类型

用mybatis generator生成代码后,执行查询语句时,oracle里的Date类型字段只精确到年月日,后面时分秒都为零。

jdbcType="DATE"时候,存入到数据库中的字段只有年月日!

后来发现是jdbcType问题,改成 jdbcType="TIMESTAMP" 就可以。(原先默认生成时是jdbcType="DATE")

SQL数据类型 JDBC类型代码 标准的Java类型 Oracle扩展的Java类型
1.0标准的JDBC类型:
CHAR java.sql.Types.CHAR java.lang.String oracle.sql.CHAR
VARCHAR2 java.sql.Types.VARCHAR java.lang.String oracle.sql.CHAR
LONG java.sql.Types.LONGVARCHAR java.lang.String oracle.sql.CHAR
NUMBER java.sql.Types.NUMERIC java.math.BigDecimal oracle.sql.NUMBER
NUMBER java.sql.Types.DECIMAL java.math.BigDecimal oracle.sql.NUMBER
NUMBER java.sql.Types.BIT boolean oracle.sql.NUMBER
NUMBER java.sql.Types.TINYINT byte oracle.sql.NUMBER
NUMBER java.sql.Types.SMALLINT short oracle.sql.NUMBER
NUMBER java.sql.Types.INTEGER int oracle.sql.NUMBER
NUMBER java.sql.Types.BIGINT long oracle.sql.NUMBER
NUMBER java.sql.Types.REAL float oracle.sql.NUMBER
NUMBER java.sql.Types.FLOAT double oracle.sql.NUMBER
NUMBER java.sql.Types.DOUBLE double oracle.sql.NUMBER
RAW java.sql.Types.BINARY byte[] oracle.sql.RAW
RAW java.sql.Types.VARBINARY byte[] oracle.sql.RAW
LONGRAW java.sql.Types.LONGVARBINARY byte[] oracle.sql.RAW
DATE java.sql.Types.DATE java.sql.Date oracle.sql.DATE
DATE java.sql.Types.TIME java.sql.Time oracle.sql.DATE
TIMESTAMP java.sql.Types.TIMESTAMP javal.sql.Timestamp oracle.sql.TIMESTAMP
2.0标准的JDBC类型:
BLOB java.sql.Types.BLOB java.sql.Blob oracle.sql.BLOB
CLOB java.sql.Types.CLOB java.sql.Clob oracle.sql.CLOB
用户定义的对象 java.sql.Types.STRUCT java.sql.Struct oracle.sql.STRUCT
用户定义的参考 java.sql.Types.REF java.sql.Ref oracle.sql.REF
用户定义的集合 java.sql.Types.ARRAY java.sql.Array oracle.sql.ARRAY
Oracle扩展:
BFILE oracle.jdbc.OracleTypes.BFILE N/A oracle.sql.BFILE
ROWID oracle.jdbc.OracleTypes.ROWID N/A oracle.sql.ROWID
REF CURSOR oracle.jdbc.OracleTypes.CURSOR java.sql.ResultSet oracle.jdbc.OracleResultSet
TIMESTAMP oracle.jdbc.OracleTypes.TIMESTAMP java.sql.Timestamp oracle.sql.TIMESTAMP
TIMESTAMP WITH TIME ZONE oracle.jdbc.OracleTypes.TIMESTAMPTZ java.sql.Timestamp oracle.sql.TIMESTAMPTZ
TIMESTAMP WITH LOCAL TIME ZONE oracle.jdbc.OracleTypes.TIMESTAMPLTZ java.sql.Timestamp oracle.sql.TIMESTAMPLTZ
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,423评论 0 4
  • Java数据持久化之mybatis 一. mybatis简介 1.1 原始的JDBC操作: Java 通过 Jav...
    小Q逛逛阅读 4,896评论 0 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 第一次在徐志摩的诗中看到这个名字“翡冷翠”的时候,就禁不住想象,这是一个什么样的城市,能够衬得上这样三个字,能够承...
    独孤紫馥阅读 447评论 0 1
  • 一粥一饭,当思来处不易。半丝半缕,恒念物力维艰。勤俭乃持家之本。自古勤和俭不分家。“黎明即起,洒扫庭除。...
    迁善1984阅读 1,771评论 0 2