MyBatis中五種成功對映資料庫欄位與實體類屬性不一致的解決方案
在Mybatis中,當根據某欄位查詢資料庫資訊時,如果資料庫欄位名與實體類屬性名稱不一致,查詢時,會出現賦值不上的情況,值為Null。本次將給出五種方案,其中方案三、四為推薦。
例如:根據學號sno查詢學生資訊
1.資料庫表student欄位名稱以及型別:
2.資料庫表內容:
3.實體類:實體類內 學號為s_no 不對應資料庫表內 sno
4.測試程式(方案一、二、三、四):
- package com.yuan.test;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.List;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import com.yuan.model.Student;
- public class MybatisTest {
- public static void main(String[] args) {
- SqlSession sqlSession = null;
- try {
- //1.載入核心配置檔案
- //路徑相對於src下
- InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
- //2.建立sqlSession工廠相當於connection
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
- //3.建立sqlsession 相當於處理語句物件
- sqlSession = sqlSessionFactory.openSession();
- //4.執行語句獲取結果
- List<Student> stu = sqlSession.selectList(Student.class.getName()+".queryList"
); - System.out.println(stu);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally{
- //5.關閉資源
- if(sqlSession!=null){
- sqlSession.close();
- }
- }
- }
- }
方案五的測序程式需將List的泛型從Student,改為Map<String,Object>
解決方案一、採用sql語句 as 別名 的形式:為查詢語句的顯示列定義別名,讓這個別名與實體類的屬性名相同完成自動封裝
在StudentMapper.xml中(as可省略)
缺點:
1.如果列數過多會導致語句難以閱讀
2.如果查詢語句的定義多個,會導致重複程式碼增多,多次定義顯示列增加了工作量
可採用方案三解決此問題
解決方案二、採用實體類set方法名符合對應資料庫欄位名
在Student.java實體類中,因為Mybatis對映的原理就是通過返回的資料庫欄位名找實體類的setXxx方法進行對應注入
同樣也查詢成功
解決方案三、利用XxxMapper.xml的sql標籤(同解決方案一原理相同,將方案一提取封裝,簡化操作)【推薦】
在StudentMapper.xml中
解決方案四、使用resultMap 手動配置一個數據結果的封裝規則【推薦】
在StudentMapper.xml中使用resultMap標籤:
type 用於指定將資料的返回結果封裝到哪個實體類中
id 這個封裝規則的唯一標識,用於被查詢標籤中的resultMap所引用
結果:
resultMap 用於指定某個自定義的封裝規則,MyBatis會根據這個自定義的封裝規則進行資料封裝優點:這個自定義的封裝規則可以被重複使用,省去多次定義別名的問題缺點:需要額外定義一套封裝規則的resultMap
解決方案五、使用resultType屬性並指定返回結果為一個map集合(這類方案僅是返回資料庫資料,並未將其封裝到實體類中)
這時MyBatis會將顯示列作為Map即可key顯示列對應的值為Map集合的value,將每條記錄封裝到不同的Map集合中,最後將Map集合新增到List集合中進行返回每一個Map集合對應著一條記錄
結果
優點:簡單方便快捷缺點:破壞了ORM的對映關係