學習MyBatis必知必會(6)~Mapper基礎的擴充

一樂樂發表於2022-02-04

一、typeAlias 型別別名【自定義別名、系統自帶別名】

1、型別別名:為 Java 型別設定一個縮寫名字。 它僅用於 XML 配置,意在降低冗餘的全限定類名書寫


2、配置自定義別名:

(1)方式一:為具體某個類配置別名

//在全域性配置檔案中新增別名的配置:
<configuration>  	
   <!-- 型別別名 -->
   <typeAliases>
   		<typeAlias type="com.shan.hello.User" alias="User"/>
   </typeAliases>
</configuration>    

//在Mapper檔案中使用:
<select id="get" parameterType="java.lang.Long" resultType="User">
	select * from t_user where id = #{id}
</select>

★(2)方式二:為具體包配置別名【一般包名就寫到domain包即可】,然後包下的類 直接類首字母小寫 即可使用:

//在全域性配置檔案中新增別名的配置:
<configuration>  
  <!-- 型別別名 -->
   <typeAliases>
   		 <!-- <typeAlias type="com.shan.hello.User" alias="User"/>-->
   		<!-- 一般包寫到domain包即可,系統自動為該包的類起別名,使用直接是簡單類首字母小寫 -->
   		<package name="com.shan.hello"/>
   </typeAliases>
</configuration> 

//在Mapper檔案中使用:
<select id="get" parameterType="java.lang.Long" resultType="user">
	select * from t_user where id = #{id}
</select>
  • myBatis中別名是不區分大小寫的

(3)方式三:使用註解的方式,貼標籤到domain類上 @Alias("**")


3、系統自帶的別名【基本型別+包裝型別,還有map型別】---作用:需要返回值時,設定返回型別 resultType

---就是基本型別加個下劃線,包裝型別的別名就是基本型別啦。例如int的別名是_int, Integer的別名是int

■ 舉例: 查詢的返回型別是整型,使用別名int:

 <!-- 查詢總數 -->
<select id="getCounts" resultType="int">
	select count(id) from t_user;
</select>

	/* 測試查詢總數 */
	@Test
	public void testGetCounts() throws IOException {
        SqlSession session = MyBatisUtil.getSession();
		//4、進行資料庫操作(CRUD)
		int count = session.selectOne("com.shan.hello.UserMapper.getCounts");
		System.out.println(count);
		//5、關閉資源
		session.close();
	}

■ 舉例: 查詢的返回型別是部分列,使用別名map:

 <!-- 查詢部分列,每一行記錄以map[鍵值對]形式返回 -->
<select id="getPartCrows" resultType="map">
	 select id, name from t_user where id = #{id};
</select>
          

	/* 測試查詢部分列 */
	@Test
	public void testGetPartCrows() throws IOException {
        SqlSession session = MyBatisUtil.getSession();
		//4、進行資料庫操作(CRUD)
		Map<String, Object> user = session.selectOne("com.shan.hello.UserMapper.getPartCrows", 2L);
		System.out.println(user);
		//5、關閉資源
		session.close();
	}



二、properties 屬性配置 [動態引入]

1、動態替換:屬性在外部進行配置,然後進行動態替換:

(1)建立一個外部的.properties 檔案 【key=value形式】:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdemo
username=root
password=admin

(2)引入和動態替換,通過properties的resource引入,然後動態替換是使用${}:

 <configuration>
  	<!-- 屬性properties配置 --> <!-- 檔案的根目錄是.classpath路徑 --> 
  	<properties resource="db.properties"/>
  	<environments default="dev">
	  	<!-- 1、配置資料庫的環境 -->
	  	<environment id="dev">
	  		<!-- ① 事務管理器 -->
	  		<transactionManager type="JDBC"/>
	  		<!-- ② 連線池【連線資料庫4要素】 -->
	  		<dataSource type="POOLED">
	  			<property name="driver" value="${driver}"/>
	  			<property name="url" value="${url}"/>
	  			<property name="username" value="${username}"/>
	  			<property name="password" value="${password}"/>
	  		</dataSource>
	  	</environment>
  </environments>
 </configuration>



三、resultMap [解決表的列名和物件的屬性名不匹配的問題]

✿ 預設情況下,通過設定返回型別resultType 是要求表的列名和物件的屬性名要一致,否則會出錯。

1、方式一:使用別名:

 <select id="getList" parameterType="java.lang.Long" resultType="user">
	 select u_id id, u_name name, u_salary salary from t_user;
 </select>

★ 2、方式二:使用resultMap:

  • resultMap 和 resultType不能同時使用
  <!-- resultMap 結果集合物件對映:解決表的列名和物件的屬性名不匹配的問題
  	   id:唯一標識
  	   type:封裝結果集的每一行記錄的型別
  	   子元素:result 匹配物件中的哪一個屬性對應表的哪一列 【若是主鍵,建議使用id元素代替result元素提高效能】
   -->
  	  <resultMap id="BaseResultMap" type="User" >
  	  	<id column="u_id" property="id"/>
  	  	<result column="u_name" property="name"/>
  	  	<result column="u_salary" property="salary"/>
  	  </resultMap>
  	  	  
<select id="getList" parameterType="java.lang.Long" resultMap="BaseResultMap">
	 select u_id, u_name, u_salary from t_user;
</select>



四、Mapper介面和原理 [好比是DAO層]

1、回顧之前執行sql的方式是:使用namespace.id 的方式找到sql元素,並執行sql語句。

■ 該方式存在幾個問題:

	public void testGet() throws IOException {
		// 建立SqlSession會話物件,好比連線物件Connection
		SqlSession session = MyBatisUtil.getSession();
		// 進行資料庫操作(CRUD)
		User user = session.selectOne("com.shan.hello.UserMapper.get", 2L);//第一個引數是字串無法編譯時檢查,第二個引數是Object型別也無法編譯時檢查
		System.out.println(user);
		// 關閉資源
		session.close();
	}

(1)第一個引數:因為傳入的是String型別的引數,可能會寫錯,寫錯檢查也是等到執行時才發現

(2)第二個引數:Object型別,不需要被檢查,萬物皆物件

(3)每個操作【增刪改查】的程式碼模板是相同的,可以抽取


--------解決:使用Mapper 介面,類似DAO介面,在Mapper介面中去定義每一個操作方法。

★ DAO誕生的背景:以前我們是把資料庫的操作程式碼編寫到客戶端裡:
跟業務程式碼混雜在一起;②而且每次運算元據庫時都需要重複書寫程式碼

2、Mapper元件:Mapper介面+Mapper檔案

(1)Mapper 檔案和Mapper 介面應該放到同一包下

(2)Mapper檔案中的namespace 對應 Mapper介面的全限定名稱

(3)Mapper檔案中的操作元素的**id **對應 Mapper介面的方法名稱

/* Mapper 介面*/
public interface UserMapper {
	void save(User user);
	void delete(Long id);
	void update(User user, Long id);
	void get(Long id);
	List<User> getListAll();
}
<!-- Mapper檔案 -->
<!-- Mapper檔案的namespace對應Mapper 介面的全限定名 -->
  <mapper namespace="com.shan.hello.mapper.UserMapper">
  
  	  <!-- 儲存操作 -->  <!-- Mapper 檔案的操作元素的id對應Mapper介面的方法名 -->
	  <insert id="save">
	  	insert into t_user (name, salary) values (#{name}, #{salary});
	  </insert>	  
	  
	  <!-- 刪除操作 -->
	  <delete id="delete">
	  	delete from t_user where id = #{id};
	  </delete>
	  
	  <!-- 更改操作 -->
	  <update id="update">
	  	update t_user set name = #{name}, salary = #{salary} where id = #{aid}; 
	  </update>
	  
  	  <!-- 查詢操作 -->
	  <select id="get" parameterType="java.lang.Long" resultType="user">
	    select * from t_user where id = #{id}
	  </select>
	  
	  <select id="getListAll" parameterType="java.lang.Long" resultType="user">
	    select * from t_user;
	  </select>
	  
</mapper>
/* 測試,呼叫Mapper介面運算元據庫 */
@Test
public void testGetList() throws IOException{
	SqlSession session = MyBatisUtil.getSession();
	UserMapper userMapper = session.getMapper(UserMapper.class);

	List<User> users = userMapper.getListAll();
	System.out.println(users);	
}



五、引數處理【使用註解@Param實現處理多個引數】

---myBatis預設情況下只能處理一個引數,解決查詢多個引數的方法:

1、方法一:封裝成一個物件 【可以,但是麻煩,需要定義很多的javaBean物件】

2、方法二:封裝成Map物件 (Map的key好比時javaBean物件的屬性名,Map的value好比時javaBean的屬性值)【也有點麻煩,因為每次都需要建立一個Map物件】

/* ClientMapper 介面 */
public interface ClientMapper {
	//將多個引數封裝成一個Map物件
	Client login2(Map<String,Object> map);
}

<!-- Mapper檔案 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
   <select id="login2" resultType="Client">
	  select id, username, password from client where username = #{username} and password = #{password} ;
    </select>
</mapper>
        
/* 測試 */       
@Test
public void testLogin2() throws IOException {
	Map<String,Object> paramMap = new HashMap<String, Object>() {
		{
				//設定map的元素的鍵值對的值
				this.put("username", "shan");
				this.put("password", "1");
		}
	};
	SqlSession session = MyBatisUtil.getSession();
	ClientMapper clientMapper = session.getMapper(ClientMapper.class);	
	Client client = clientMapper.login2(paramMap);
	System.out.println(client);
	session.close();
}        

★ 3、方法三:使用Param註解,底層原理就是方式二,myBatis幫我們使用map來封裝。

/* ClientMapper 介面 */
public interface ClientMapper {
	//使用params註解封裝多個引數
	Client login3(@Param("username")String username, @Param("password")String password);
}

<!-- Mapper檔案 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
   <select id="login3" resultType="Client">
	  select id, username, password from client where username = #{username} and password = #{password} ;
    </select>
</mapper>
        
/* 測試 */       
@Test
public void testLogin2() throws IOException {
	SqlSession session = MyBatisUtil.getSession();
	ClientMapper clientMapper = session.getMapper(ClientMapper.class);	
	Client client = clientMapper.login3("shan", "1");
	System.out.println(client);
	session.close();
} 



六、myBatis外掛 [eclipse的外掛MyBatipse]

  • 作用:編寫對映檔案時有程式碼提示

1、eclipse 安裝 外掛MyBatispse

■ 方式一(線上安裝):看外掛官網提供的方式【有的外掛會提供拖動安裝,重啟eclipse即可】

● 通用:Help -> Eclipse Marketplace -> 搜 MyBatipse,然後進行安裝即可

image

■ 驗證是否安裝成功,在eclipse的window->Preferences-> 搜 MyBatipse,有看到即成功


相關文章