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

MyBatis學習筆記-03.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的對映關係