數據類型映射指的是數據庫中的數據類型和Java數據類型之間的映射關係:好比:默認狀況下,Mysql中的int
類型對應Java中的int(Integer)
類型,bigint
對應Java中的BigInteger
,decimal
對應Java中的bigDecimal
等等,這些都是Tangyuan框架提供的默認映射關係,但若是咱們但願數據庫中的bigint能映射成Java中的long類型,或者decimal映射成Java中的double類型,該如何處理呢?咱們能夠經過下面的配置來實現咱們的目的:java
示例:git
<!-- 數據類型映射 --> <dataTypeMapping> <relation jdbcType="tinyint" javaType="int" /> <relation jdbcType="bigint" javaType="long" /> <relation jdbcType="double" javaType="float" /> <relation jdbcType="real" javaType="float" /> <relation jdbcType="decimal" javaType="float" /> <relation jdbcType="numeric" javaType="float" /> </dataTypeMapping>
說明:github
該配置位於tangyuan-mapper.xml
文件中,經過上述配置,咱們就能夠實現數據庫中的數據類型到Java數據類型的自定義映射關係了。固然這種自定義映射關係也不是能夠隨便指定,須要遵循必定的規則:sql
Schema設計圖:數據庫
relation節點屬性說明:安全
屬性名 | 用途及說明 | 必填 | 取值 |
---|---|---|---|
jdbcType | 數據庫中的數據類型 | Y | bit<br />boolean<br />tinyint<br />smallint<br />bigint<br />int<br />real<br />decimal<br />numeric<br />float<br />double |
javaType | Java中的數據類型 | Y | byte<br />boolean<br />short<br />int<br />long<br />float<br />double<br />bigInteger<br />bigDecimal |
返回結果映射指對SQL服務執行成功後的返回數據進行處理,轉換成調用方所但願的類型或者名稱。好比:<selectOne>
標籤執行後獲得的是一條行記錄,調用方拿到的返回結果默認是一個XCO
對象,若是調用方但願獲得的是一個Map
對象,固然能夠,甚至按照面向對象的習慣,咱們查詢user表,最後可否獲得一個Java中的User對象呢,這固然也是能夠的,這些都是經過數據映射來實現的,下面來詳細的介紹一下。app
首先返回結果映射的配置分爲兩部分,一部分是定義的配置,經過tangyuan-mapper.xml
文件中resultMap
標籤和mappingClass
標籤來定義;另外一部分是使用的配置,經過SQL服務標籤的resultType
屬性和resultMap
屬性來使用。示例以下:框架
首先,咱們須要作一些準備工做,定義一張user表,3個JavaBean對象(用於演示結果映射不一樣使用)來承載user表的中數據和一個自定義的列到屬性處理器。ide
user表定義:設計
CREATE TABLE `user` ( `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '姓名', `user_age` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '年齡', `create_time` datetime NOT NULL COMMENT '建立時間', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';
Bean對象:
public class User1 { private Long user_id; private String user_name; private Integer user_age; private Date create_time; //set, get } public class User2 { private Long id; private String name; private Integer age; private Date time; //set, get } public class User3 { private Long user_id; private String user_name; private Integer age; private Date time; //set, get }
自定義列到屬性轉換處理器:
public class User2Mapper implements MappingHandler{ @Override public String columnToProperty(String arg0) { return arg0.substring(arg0.lastIndexOf("_") + 1); } }
示例1:
<selectOne id="getUserToMap" resultType="map" dsKey="ds" txRef="tx_01"> select * from user where user_id = 1 </selectOne>
返回結果:
class java.util.HashMap {user_name=張三, create_time=Sun Nov 20 10:58:04 CST 2016, user_id=1, user_age=18}
說明:
示例1中,<selectOne>
標籤的resultType
屬性值爲map,表示其返回結果的載體類型爲Map。
示例2:
<selectOne id="getUserToBean" resultType="org.xson.tangyuan.vo.User1" dsKey="ds" txRef="tx_01"> select * from user where user_id = 1 </selectOne>
返回結果(使用JSON序列化後的):
class org.xson.tangyuan.vo.User1 {"create_time":1479610684000,"user_age":18,"user_id":1,"user_name":"張三"}
說明:
示例2中,<selectOne>
標籤的resultType
屬性值爲org.xson.tangyuan.vo.User1
,表示其返回結果的載體類型爲一個具體JavaBean類型。
示例3:
tangyuan-mapper.xml文件中:
<resultMap id="userResult1" type="org.xson.tangyuan.vo.User2"> <result column="user_id" property="id"/> <result column="user_name" property="name"/> <result column="user_age" property="age"/> <result column="create_time" property="time"/> </resultMap>
SQL服務的XML中:
<selectOne id="getUser1" resultMap="userResult1" dsKey="ds" txRef="tx_01"> select * from user where user_id = 1 </selectOne>
返回結果(使用JSON序列化後的):
class org.xson.tangyuan.vo.User2 {"age":18,"id":1,"name":"張三","time":1479610684000}
說明:
示例3中,首先在tangyuan-mapper.xml
文件中配置了一個返回結果的映射規則userResult1
,其載體類型爲User2對象,user表中列和User2對象中屬性的對於關係則依照<result>
中的配置。而後在<selectOne>
標籤中經過resultMap
屬性來進行使用。
示例4:
tangyuan-mapper.xml文件中:
<mappingClass id="user2Mapper" class="org.xson.tangyuan.mapper.User2Mapper"/> <resultMap id="userResult2" type="org.xson.tangyuan.vo.User2" rule="user2Mapper" />
SQL服務的XML中:
<selectOne id="getUser2" resultMap="userResult2" dsKey="ds" txRef="tx_01"> select * from user where user_id = 1 </selectOne>
返回結果(使用JSON序列化後的):
class org.xson.tangyuan.vo.User2 {"age":18,"id":1,"name":"張三","time":1479610684000}
說明:
示例4中,先配置一個自定義的列到屬性的處理器user2Mapper(須要實現org.xson.tangyuan.mapping.MappingHandler
接口),而後在tangyuan-mapper.xml
文件中配置一個返回結果的映射規則userResult2,其載體類型爲User2對象,使用user2Mapper來處理數據庫列到User2中屬性的映射關係。最後在<selectOne>
標籤中經過resultMap
屬性來進行使用。
示例5:
tangyuan-mapper.xml文件中:
<resultMap id="userResult3" type="*" rule="user2Mapper" />
SQL服務的XML中:
<selectOne id="getUser3" resultType="org.xson.tangyuan.vo.User2" resultMap="userResult3" dsKey="ds" txRef="tx_01"> select * from user where user_id = 1 </selectOne>
返回結果(使用JSON序列化後的):
class org.xson.tangyuan.vo.User2 {"age":18,"id":1,"name":"張三","time":1479610684000}
說明:
示例5中,在tangyuan-mapper.xml
文件中配置一個返回結果的映射規則userResult3
,type="*"
表示返回結果的載體將爲SQL服務標籤中resultType屬性所設置的具體載體對象,同時使用user2Mapper
來處理數據庫列到具體對象中屬性的映射關係。最後在<selectOne>
標籤中經過resultMap
屬性設置返回結果的映射規則,經過resultType
屬性來設置返回結果的載體爲User2對象。
示例6: tangyuan-mapper.xml文件中:
<resultMap id="userResult4" type="org.xson.tangyuan.vo.User3"> <result column="user_age" property="age"/> <result column="create_time" property="time"/> </resultMap>
SQL服務的XML中:
<selectOne id="getUser4" resultMap="userResult4" dsKey="ds" txRef="tx_01"> select * from user where user_id = 1 </selectOne>
返回結果(使用JSON序列化後的):
class org.xson.tangyuan.vo.User3 {"age":18,"time":1479610684000,"user_id":1,"user_name":"張三"}
說明:
示例6和示例3類似,區別在於user_id,和user_name因爲沒有配置列到屬性的映射關係,則按照數據庫列的名稱直接映射到User3的屬性中。
使用限制和說明:
返回結果的映射功能只能在<selectSet>
,<selectOne>
服務標籤中,經過resultMap使用;而且<selectSet>
,<selectOne>
必須爲簡單服務時纔有效,在組合服務中設置無效。
Schema設計圖:
resultMap節點屬性說明:
屬性名 | 用途及說明 | 必填 | 取值 |
---|---|---|---|
id | 返回結果映射規則的惟一標識,不能重複 | Y | 用戶定義 |
type | 返回結果載體對象類型 | N | 用戶定義 |
rule | 所引用的列到屬性處理器實現類id | N | 用戶定義 |
Schema設計圖:
mappingClass節點屬性說明:
屬性名 | 用途及說明 | 必填 | 取值 |
---|---|---|---|
id | 列到屬性處理器的惟一標識,不能重複 | Y | 用戶定義 |
class | 列到屬性處理器全類名,須要實現org.xson.tangyuan.mapping.MappingHandler接口 | Y | 用戶定義 |
到此,本章節的內容就結束了,感興趣的朋友能夠關注TangYuan項目。