1. 程式人生 > >MyBatis中五種成功對映資料庫欄位與實體類屬性不一致的解決方案

MyBatis中五種成功對映資料庫欄位與實體類屬性不一致的解決方案

在Mybatis中,當根據某欄位查詢資料庫資訊時,如果資料庫欄位名與實體類屬性名稱不一致,查詢時,會出現賦值不上的情況,值為Null。本次將給出五種方案,其中方案三、四為推薦。

例如:根據學號sno查詢學生資訊

1.資料庫表student欄位名稱以及型別:

2.資料庫表內容:

3.實體類:實體類內 學號為s_no  不對應資料庫表內 sno

4.測試程式(方案一、二、三、四):

  1. package com.yuan.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import org.apache.ibatis.io.Resources;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9. import com.yuan.model.Student;
  10. public class MybatisTest {
  11. public static void main(String[] args) {
  12. SqlSession sqlSession = null;
  13. try {
  14. //1.載入核心配置檔案
  15. //路徑相對於src下
  16. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
  17. //2.建立sqlSession工廠相當於connection
  18. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  19. //3.建立sqlsession 相當於處理語句物件
  20. sqlSession = sqlSessionFactory.openSession();
  21. //4.執行語句獲取結果
  22. List<Student> stu = sqlSession.selectList(Student.class.getName()+".queryList"
    );
  23. System.out.println(stu);
  24. } catch (IOException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. } finally{
  28. //5.關閉資源
  29. if(sqlSession!=null){
  30. sqlSession.close();
  31. }
  32. }
  33. }
  34. }

方案五的測序程式需將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的對映關係