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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的...
    笨鳥慢飛閱讀 5,571評論 0 4
  • Java數據持久化之mybatis 一. mybatis簡介 1.1 原始的JDBC操作: Java 通過 Jav...
    小Q逛逛閱讀 4,958評論 0 16
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,868評論 18 139
  • 第一次在徐志摩的詩中看到這個名字“翡冷翠”的時候,就禁不住想象,這是一個什么樣的城市,能夠襯得上這樣三個字,能夠承...
    獨孤紫馥閱讀 482評論 0 1
  • 一粥一飯,當思來處不易。半絲半縷,恒念物力維艱。勤儉乃持家之本。自古勤和儉不分家?!袄杳骷雌穑瑸咄コ?。...
    遷善1984閱讀 1,917評論 0 2