一、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]
- 作用:編寫對映檔案時有程式碼提示