12.平凡之路-自定義數(shù)據(jù)類(lèi)型轉(zhuǎn)換

胖先森

MyBatis數(shù)據(jù)類(lèi)型轉(zhuǎn)換,默認(rèn)情況下MyBatis已經(jīng)幫我們完成了很多的數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,一般情況下我們直接使用即可,下面大概介紹一下

一 Java日期類(lèi)型和Jdbc字符串類(lèi)型轉(zhuǎn)換

在做開(kāi)發(fā)時(shí)缘眶,我們經(jīng)常會(huì)遇到這樣一些問(wèn)題溜畅,比如我有一個(gè)Java中的Date數(shù)據(jù)類(lèi)型竟终,我想將之存到數(shù)據(jù)庫(kù)的時(shí)候存成一個(gè)1970年至今的毫秒數(shù)擦盾,怎么實(shí)現(xiàn)油宜?

就是我直接向數(shù)據(jù)庫(kù)寫(xiě)數(shù)據(jù),要寫(xiě)的是一個(gè)Date對(duì)象瓤湘,但是寫(xiě)到數(shù)據(jù)庫(kù)之后這個(gè)Date對(duì)象就變成了Date對(duì)象所描述的時(shí)間到1970年的秒數(shù)了备蚓,然后當(dāng)我從數(shù)據(jù)庫(kù)讀取這個(gè)秒數(shù)之后,系統(tǒng)又會(huì)自動(dòng)幫我將這個(gè)秒數(shù)轉(zhuǎn)為Date對(duì)象烁峭,就是這樣兩個(gè)需求.

1.新增數(shù)據(jù)庫(kù)字段

2.持久化類(lèi)中代碼

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類(lèi)型
    private Date create_time;
  
}

3.自定義typeHandler繼承自BaseTypeHandler

自定義typeHandler我們有兩種方式:

  • 實(shí)現(xiàn)TypeHandler接口
  • 簡(jiǎn)化的寫(xiě)法就是繼承自BaseTypeHandler類(lèi)
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中進(jìn)行配置

自定義好了typeHandler之后容客,接下來(lái)我們需要在UserMapper.xml中進(jìn)行簡(jiǎn)單的配置秕铛,首先我們可以像上文說(shuō)的,配置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"/>
        <!-- 使用自定義的轉(zhuǎn)換 -->
        <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.查詢(xún)數(shù)據(jù)

6.測(cè)試代碼

<result typeHandler="com.shxt.type.MyDateTypeHandler" 
            column="create_time" jdbcType="VARCHAR"
            property="create_time" javaType="java.util.Date"
        />
    @Test
    public void 數(shù)據(jù)類(lèi)型轉(zhuǎn)換(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

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


        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }

    }

7.控制臺(tái)運(yùn)行結(jié)果

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
第一次查詢(xún):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 將字符串轉(zhuǎn)換為了日期類(lèi)型

8.添加數(shù)據(jù)映射文件

這種方式有一個(gè)缺點(diǎn)那就是只適用于查詢(xún)操作但两,即在查詢(xún)的過(guò)程中系統(tǒng)會(huì)啟用我們自定義的typeHandler,會(huì)將秒數(shù)轉(zhuǎn)為Date對(duì)象供置,但是在插入的時(shí)候卻不會(huì)啟用我們自定義的typeHandler谨湘,想要在插入的時(shí)候啟用自定義的typeHandler,需要我們?cè)趇nsert節(jié)點(diǎn)中簡(jiǎn)單配置一下

    <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.測(cè)試代碼

    @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 >類(lèi)型和Jdbc字符串的轉(zhuǎn)換

1.準(zhǔn)備的SQL語(yǔ)句

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.新建持久化類(lèi)

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.自定義處理類(lèi)型

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集合轉(zhuǎn)字符串
        StringBuffer sb = new StringBuffer();
        for (String value : parameter) {
            sb.append(value).append(",");
        }
        //2.設(shè)置給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"/>
        <!-- 使用自定義的轉(zhuǎn)換 -->
        <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.測(cè)試代碼

    @Test
    public void 查詢(xún)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.控制臺(tái)運(yùn)行結(jié)果

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.添加數(shù)據(jù)映射文件

    <!-- 添加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.測(cè)試代碼

    @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.控制臺(tái)運(yùn)行結(jié)果

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

三 Java 數(shù)組和Jdbc字符串的轉(zhuǎn)換

該著上面的List<String>

1.自定義類(lèi)型

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[]> {
    /**
     * 獲取數(shù)據(jù)結(jié)果集時(shí)把數(shù)據(jù)庫(kù)類(lèi)型轉(zhuǎn)換為對(duì)應(yīng)的Java類(lèi)型
     * @param rs 當(dāng)前的結(jié)果集
     * @param columnName 當(dāng)前的字段名稱(chēng)
     * @return  轉(zhuǎn)換后的Java對(duì)象
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult( ResultSet rs , String columnName ) throws SQLException {
        return this.getStringArray(rs.getString(columnName));
    }
    /**
     * 通過(guò)字段位置獲取字段數(shù)據(jù)時(shí)把數(shù)據(jù)庫(kù)類(lèi)型轉(zhuǎn)換為對(duì)應(yīng)的Java類(lèi)型
     * @param rs 當(dāng)前的結(jié)果集
     * @param columnIndex 當(dāng)前字段的位置
     * @return 轉(zhuǎn)換后的Java對(duì)象
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult( ResultSet rs , int columnIndex ) throws SQLException {
        return this.getStringArray(rs.getString(columnIndex));
    }
    /**
     * 調(diào)用存儲(chǔ)過(guò)程后把數(shù)據(jù)庫(kù)類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的Java類(lèi)型
     * @param cs  當(dāng)前的CallableStatement執(zhí)行后的CallableStatement
     * @param columnIndex  當(dāng)前輸出參數(shù)的位置
     * @return
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult( CallableStatement cs , int columnIndex ) throws SQLException {
        return this.getStringArray(cs.getString(columnIndex));
    }
    /**
     * 把Java類(lèi)型參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)庫(kù)類(lèi)型
     * @param ps 當(dāng)前的PreparedStatement對(duì)象
     * @param index 當(dāng)前參數(shù)位置
     * @param parameter 當(dāng)前參數(shù)的Java對(duì)象
     * @param jdbcType 當(dāng)前參數(shù)的數(shù)據(jù)庫(kù)類(lèi)型
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter( PreparedStatement ps , int index , String[] parameter , JdbcType jdbcType )
            throws SQLException {
        // 由于BaseTypeHandler中已經(jīng)把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"轉(zhuǎn)化為數(shù)組對(duì)象
     * @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"/>
        <!-- 數(shù)據(jù)庫(kù)字符串轉(zhuǎn)List<String> -->
        <result typeHandler="com.shxt.type.MyListTypeHandler" 
            column="hobby" jdbcType="VARCHAR"
            property="hobbyList" javaType="list"
        />
        <!-- 數(shù)據(jù)庫(kù)字符串轉(zhuǎn)Boolean -->
        <result typeHandler="com.shxt.type.MyBooleanTypeHandler"
            column="flag" jdbcType="VARCHAR"
            property="flag" javaType="boolean"
        />
        <!-- 數(shù)據(jù)庫(kù)字符串轉(zhuǎn)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.測(cè)試代碼

    @Test
    public void 查詢(xún)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.控制臺(tái)運(yùn)行結(jié)果

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.測(cè)試代碼

    @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.控制臺(tái)運(yùn)行結(jié)果

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

Java 布爾類(lèi)型和Jdbc字符串的轉(zhuǎn)換

需求場(chǎng)景:當(dāng)數(shù)據(jù)庫(kù)中保存'Y'/'N',而對(duì)應(yīng)bean字段的值的類(lèi)型為boolean续担,這是就需要我們自定義類(lèi)型轉(zhuǎn)換器擅耽,在Mybatis執(zhí)行SQL得到結(jié)果時(shí),通過(guò)自定義類(lèi)型轉(zhuǎn)換器將CHAR或者VARCHAR2類(lèi)型轉(zhuǎn)換為boolean類(lèi)型物遇,Java代碼如下:

1.自定義類(lèi)型

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"/>
        <!-- 使用自定義的轉(zhuǎn)換 -->
        <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.測(cè)試代碼

    @Test
    public void 查詢(xún)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.控制臺(tái)運(yùn)行結(jié)果

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.控制臺(tái)運(yùn)行結(jié)果

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

附錄A : 常用java類(lèi)型和jdbc類(lèi)型對(duì)應(yīng)表

類(lèi)型處理器 Java 類(lèi)型 JDBC 類(lèi)型
BooleanTypeHandler java.lang.Boolean, boolean 數(shù)據(jù)庫(kù)兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 數(shù)據(jù)庫(kù)兼容的 NUMERICBYTE
ShortTypeHandler java.lang.Short, short 數(shù)據(jù)庫(kù)兼容的 NUMERICSHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 數(shù)據(jù)庫(kù)兼容的 NUMERICINTEGER
LongTypeHandler java.lang.Long, long 數(shù)據(jù)庫(kù)兼容的 NUMERICLONG INTEGER
FloatTypeHandler java.lang.Float, float 數(shù)據(jù)庫(kù)兼容的 NUMERICFLOAT
DoubleTypeHandler java.lang.Double, double 數(shù)據(jù)庫(kù)兼容的 NUMERICDOUBLE
BigDecimalTypeHandler java.math.BigDecimal 數(shù)據(jù)庫(kù)兼容的 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[] 數(shù)據(jù)庫(kù)兼容的字節(jié)流類(lèi)型
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 或未指定類(lèi)型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串類(lèi)型乖仇,存儲(chǔ)枚舉的名稱(chēng)(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERICDOUBLE 類(lèi)型,存儲(chǔ)枚舉的索引(而不是名稱(chēng))询兴。
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

一個(gè)簡(jiǎn)單的結(jié)果集映射示例

<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"/>
  <!-- 如果自己不知道寫(xiě)說(shuō)明,那么就可以省略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>

如果自己不知道寫(xiě)說(shuō)明,那么就可以省略javaType和jdbcType也是可以的

附錄B : Oracle數(shù)據(jù)類(lèi)型和對(duì)應(yīng)的java類(lèi)型

用mybatis generator生成代碼后乃沙,執(zhí)行查詢(xún)語(yǔ)句時(shí),oracle里的Date類(lèi)型字段只精確到年月日诗舰,后面時(shí)分秒都為零警儒。

jdbcType="DATE"時(shí)候,存入到數(shù)據(jù)庫(kù)中的字段只有年月日!

后來(lái)發(fā)現(xiàn)是jdbcType問(wèn)題眶根,改成 jdbcType="TIMESTAMP" 就可以冷蚂。(原先默認(rèn)生成時(shí)是jdbcType="DATE")

SQL數(shù)據(jù)類(lèi)型 JDBC類(lèi)型代碼 標(biāo)準(zhǔn)的Java類(lèi)型 Oracle擴(kuò)展的Java類(lèi)型
1.0標(biāo)準(zhǔn)的JDBC類(lèi)型:
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標(biāo)準(zhǔn)的JDBC類(lèi)型:
BLOB java.sql.Types.BLOB java.sql.Blob oracle.sql.BLOB
CLOB java.sql.Types.CLOB java.sql.Clob oracle.sql.CLOB
用戶(hù)定義的對(duì)象 java.sql.Types.STRUCT java.sql.Struct oracle.sql.STRUCT
用戶(hù)定義的參考 java.sql.Types.REF java.sql.Ref oracle.sql.REF
用戶(hù)定義的集合 java.sql.Types.ARRAY java.sql.Array oracle.sql.ARRAY
Oracle擴(kuò)展:
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市汛闸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艺骂,老刑警劉巖诸老,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钳恕,居然都是意外死亡别伏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)忧额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厘肮,“玉大人,你說(shuō)我怎么就攤上這事睦番±嗝” “怎么了耍属?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)巩检。 經(jīng)常有香客問(wèn)我厚骗,道長(zhǎng),這世上最難降的妖魔是什么兢哭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任领舰,我火速辦了婚禮,結(jié)果婚禮上迟螺,老公的妹妹穿的比我還像新娘冲秽。我一直安慰自己,他們只是感情好矩父,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布锉桑。 她就那樣靜靜地躺著,像睡著了一般浙垫。 火紅的嫁衣襯著肌膚如雪刨仑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天夹姥,我揣著相機(jī)與錄音杉武,去河邊找鬼。 笑死辙售,一個(gè)胖子當(dāng)著我的面吹牛轻抱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旦部,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼祈搜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了士八?” 一聲冷哼從身側(cè)響起容燕,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婚度,沒(méi)想到半個(gè)月后蘸秘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝗茁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年醋虏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮翘。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颈嚼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饭寺,到底是詐尸還是另有隱情阻课,我是刑警寧澤叫挟,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站柑肴,受9級(jí)特大地震影響霞揉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晰骑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一适秩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硕舆,春花似錦秽荞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至凌节,卻和暖如春钦听,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倍奢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工朴上, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卒煞。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓痪宰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親畔裕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衣撬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL扮饶、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,511評(píng)論 0 4
  • Java數(shù)據(jù)持久化之mybatis 一. mybatis簡(jiǎn)介 1.1 原始的JDBC操作: Java 通過(guò) Jav...
    小Q逛逛閱讀 4,912評(píng)論 0 16
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理具练,服務(wù)發(fā)現(xiàn),斷路器甜无,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 第一次在徐志摩的詩(shī)中看到這個(gè)名字“翡冷翠”的時(shí)候靠粪,就禁不住想象,這是一個(gè)什么樣的城市毫蚓,能夠襯得上這樣三個(gè)字,能夠承...
    獨(dú)孤紫馥閱讀 462評(píng)論 0 1
  • 一粥一飯昔善,當(dāng)思來(lái)處不易元潘。半絲半縷,恒念物力維艱君仆。勤儉乃持家之本翩概。自古勤和儉不分家牲距。“黎明即起钥庇,灑掃庭除牍鞠。...
    遷善1984閱讀 1,828評(píng)論 0 2