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ù)兼容的 NUMERIC 或 BYTE
|
ShortTypeHandler |
java.lang.Short , short
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 SHORT INTEGER
|
IntegerTypeHandler |
java.lang.Integer , int
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 INTEGER
|
LongTypeHandler |
java.lang.Long , long
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 LONG INTEGER
|
FloatTypeHandler |
java.lang.Float , float
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 FLOAT
|
DoubleTypeHandler |
java.lang.Double , double
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 DOUBLE
|
BigDecimalTypeHandler |
java.math.BigDecimal |
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 DECIMAL
|
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 | 任何兼容的 NUMERIC 或 DOUBLE 類(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 |