TangYuan之數據映射

7. 數據映射


7.1 數據類型映射

數據類型映射指的是數據庫中的數據類型和Java數據類型之間的映射關係:好比:默認狀況下,Mysql中的int類型對應Java中的int(Integer)類型,bigint對應Java中的BigIntegerdecimal對應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

  • 整數類型映射整數類型,浮點類型映射浮點類型,好比:tinyint(DB)->int(Java);
  • 小類型到大類型的映射是安全的.好比:tinyint(DB)->int(Java);大類型到小類型的映射是不安全的,須要用戶自行肯定是否超出範圍,好比:bigint(DB)->long(Java)。

Schema設計圖:數據庫

圖片1

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

7.2 返回結果映射

返回結果映射指對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文件中配置一個返回結果的映射規則userResult3type="*"表示返回結果的載體將爲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設計圖:

圖片1

resultMap節點屬性說明:

屬性名 用途及說明 必填 取值
id 返回結果映射規則的惟一標識,不能重複 Y 用戶定義
type 返回結果載體對象類型 N 用戶定義
rule 所引用的列到屬性處理器實現類id N 用戶定義

Schema設計圖:

圖片1

mappingClass節點屬性說明:

屬性名 用途及說明 必填 取值
id 列到屬性處理器的惟一標識,不能重複 Y 用戶定義
class 列到屬性處理器全類名,須要實現org.xson.tangyuan.mapping.MappingHandler接口 Y 用戶定義

到此,本章節的內容就結束了,感興趣的朋友能夠關注TangYuan項目。

相關文章
相關標籤/搜索