一、什么是結果集映射
這里我們直接看MyBatis官方檔案給出的內容:
結果映射
resultMap 元素是 MyBatis 中最重要最強大的元素,它可以讓你從 90% 的 JDBC ResultSets 資料提取代碼中解放出來,并在一些情形下允許你進行一些 JDBC 不支持的操作,實際上,在為一些比如連接的復雜陳述句撰寫映射代碼的時候,一份 resultMap 能夠代替實作同等功能的數千行代碼,ResultMap 的設計思想是,對簡單的陳述句做到零配置,對于復雜一點的陳述句,只需要描述陳述句之間的關系就行了,
二、為什么需要結果集映射
解決屬性名和欄位名不一致的問題,
我們來看下面一個例子:
首先我們看資料庫表中的列名:

然后我們將User.class的password屬性改為pwd屬性,對應的get、set方法也要改,
下面是其它的配置:
UserMapper介面
package com.jms.dao; import com.jms.pojo.User; public interface UserMapper { //根據id獲取User資訊 User getUserbyid(int id); }
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 命名空間namespace對應Mapper介面 --> <mapper namespace="com.jms.dao.UserMapper"> <!-- id對應介面中的方法 --> <select id="getUserbyid" parameterType="_int" resultType="User"> select * from mybaties.user where id=#{id} </select> </mapper>
測驗類
package com.jms.dao; import com.jms.pojo.User; import com.jms.utils.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test;public class UserMapperTest { @Test public void test() { //利用工具類獲取SqlSession SqlSession sqlSession = MyBatisUtil.getSqlSession(); //利用SqlSession獲取UserMapper介面 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //呼叫方法 User user = userMapper.getUserbyid(10001); System.out.println(user); sqlSession.close(); } }
測驗結果如下:

pwd的回傳值是null,
為什么會出現這種問題呢,很明顯,這與我們屬性名的修改有關,而且經過我的測驗,準確的說是與set方法有關,
那么怎么解決這個問題呢?
1.最簡單的就是欄位對應
讓資料庫的列名與物體類的屬性名相同,這也是前面一直做的,
2.在SQL陳述句中起別名
首先我們來看上面的UserMapper.xml中的SQL陳述句:
select * from mybaties.user where id=#{id}
它的另一種種寫法應該是:
select id,username,password from mybaties.user where id=#{id}
我們password起一個別名為pwd:
select id,username,password as pwd from mybaties.user where id=#{id}
現在我們將SQL陳述句修改為以上這句再來測驗:

成功得到結果,
3.第三種方法就是進行結果映射,我們在下面進行詳細的介紹,
三、怎樣進行結果集映射
我們直接上一段代碼:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 命名空間namespace對應Mapper介面 --> <mapper namespace="com.jms.dao.UserMapper"> <resultMap id="UserMap" type="User"> <!--column對應資料庫表的列名,property對應物體類屬性--> <result column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="pwd"/> </resultMap> <!-- id對應介面中的方法--> <select id="getUserbyid" parameterType="_int" resultMap="UserMap"> select * from mybaties.user where id=#{id} </select> </mapper>
可以看見在SQL陳述句原來的resultType變成了resultMap,并且多了一個id為UserMap的標簽,SQL中的resultMap對應的就是resultMap標簽的id,而resultMap標簽中的type對應的就是需要映射的物體類,其中的內容則被result標簽包括著,column對應資料庫表的列名,prooerty對應物體類的屬性,
我們進行測驗試一下:

嗯,問題解決,
問題雖然得到了解決,但是很明顯上面我們id和username其實是不需要映射的,那么可不可以不對他們進行映射呢,
我們可以直接去測驗,但我們首先抱著問題去看官方給出的檔案內容:
之前你已經見過簡單映射陳述句的示例,它們沒有顯式指定 resultMap,比如:
<select id="selectUsers" resultType="map">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
上述陳述句只是簡單地將所有的列映射到 HashMap 的鍵上,這由 resultType 屬性指定,雖然在大部分情況下都夠用,但是 HashMap 并不是一個很好的領域模型,你的程式更可能會使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 物件)作為領域模型,MyBatis 對兩者都提供了支持,
很明顯,這就是我們前面用過的一個map的拓展,繼續往下看,
package com.someapp.model;
public class User {
private int id;
private String username;
private String hashedPassword;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getHashedPassword() {
return hashedPassword;
}
public void setHashedPassword(String hashedPassword) {
this.hashedPassword = hashedPassword;
}
}
基于 JavaBean 的規范,上面這個類有 3 個屬性:id,username 和 hashedPassword,這些屬性會對應到 select 陳述句中的列名,
這樣的一個 JavaBean 可以被映射到 ResultSet,就像映射到 HashMap 一樣簡單,
<select id="selectUsers" resultType="com.someapp.model.User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
這就是我們一直在用的javabean了,我們注意到其中一句話,他說沒有指定顯性的resultMap映射,意思也就是說有著隱性的resultMap映射,那么隱性的映射是怎樣的呢,正如上面所說,屬性會對應到select陳述句中的列名,對應不上的時候才需要顯性的resultMap映射,
也就是說,resultMap映射其實是本來就存在的,它把列名和屬性能對應的已經映射好了,我們只需要在顯性映射中寫出不能對應的即可,
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 命名空間namespace對應Mapper介面 --> <mapper namespace="com.jms.dao.UserMapper"> <resultMap id="UserMap" type="User"> <!--column對應資料庫表的列名,property對應物體類屬性--> <result column="password" property="pwd"/> </resultMap> <!-- id對應介面中的方法--> <select id="getUserbyid" parameterType="_int" resultMap="UserMap"> select * from mybaties.user where id=#{id} </select> </mapper>
只留下為未對應的,進行測驗:

測驗結果沒有問題,
但這只是簡單的映射,后面會有更加復雜的情況,那個留在日后再進行深入學習,
在此再借用檔案中的一句話進行結尾:
如果這個世界總是這么簡單就好了,
(本文僅作個人學習記錄用,如有紕漏敬請指正)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508047.html
標籤:Java
上一篇:不好意思, Maven 該換了!
