反重力競速遊戲《紅視2》延期至6月17日發售
Mybatis入門
1 Mybatis概述
1.1 Mybatis概念
- MyBatis 是一款優秀的持久層框架,用於簡化 JDBC 開發
- MyBatis 本是 Apache 的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github
- 官網:https://mybatis.org/mybatis-3/zh/index.html
持久層:
- 負責將資料到儲存到資料庫的那一層程式碼。
- JavaEE三層架構:表現層、業務層、持久層
1.2 JDBC 缺點
-
硬編碼
-
註冊驅動、獲取連線
連線資料庫的基本資訊在程式碼中,如果要更換資料庫就需要修改程式碼。
-
SQL語句
如果表結構發生變化,SQL語句就要進行更改。這也不方便後期的維護。
-
-
操作繁瑣
- 手動設定引數
- 手動封裝結果集
1.3 Mybatis 優化
- 硬編碼可以配置到配置檔案
- 操作繁瑣的地方mybatis都自動完成
如圖所示
2 Mybatis快速入門
需求:查詢user表中所有的資料
-
建立模組,匯入座標
在建立好的模組中的 pom.xml 配置檔案中新增依賴的座標
<dependencies> <!--mybatis 依賴--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--mysql 驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> </dependencies>
-
編寫 MyBatis 核心配置檔案 -- > 替換連線資訊 解決硬編碼問題
在模組下的 resources 目錄下建立mybatis的配置檔案
mybatis-config.xml
,內容如下:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="com.itheima.pojo"/> </typeAliases> <!-- environments:配置資料庫連線環境資訊。可以配置多個environment,通過default屬性切換不同的environment --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--資料庫連線資訊--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> <environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--資料庫連線資訊--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments> <mappers> <!--載入sql對映檔案--> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
-
編寫 SQL 對映檔案 --> 統一管理sql語句,解決硬編碼問題
在模組的
resources
目錄下建立對映配置檔案UserMapper.xml
,內容如下:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="test"> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> </mapper>
-
編碼
-
建立 User類
public class User { private int id; private String username; private String password; private String gender; private String addr; //省略了 setter 和 getter }
-
編寫 MybatisDemo 測試類
public class MyBatisDemo { public static void main(String[] args) throws IOException { //1. 載入mybatis的核心配置檔案,獲取 SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 獲取SqlSession物件,用它來執行sql SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 執行sql List<User> users = sqlSession.selectList("test.selectAll"); //引數是一個字串,該字串必須是對映配置檔案的namespace.id System.out.println(users); //4. 釋放資源 sqlSession.close(); } }
-
解決SQL對映檔案的警告提示:
在入門案例對映配置檔案中存在報紅的情況。問題如下:
- 產生的原因:Idea和資料庫沒有建立連線,不識別表資訊。它並不影響程式的執行。
- 解決方式:在Idea中配置MySQL資料庫連線。
IDEA中配置MySQL資料庫連線
- 點選IDEA右邊框的
Database
,在展開的介面點選+
選擇Data Source
,再選擇MySQL
3 Mapper代理開發
3.1 Mapper代理開發概述
之前我們寫的程式碼是基本使用方式,它也存在硬編碼的問題,如下:
這裡呼叫 selectList()
方法傳遞的引數是對映配置檔案中的 namespace.id值。這樣寫也不便於後期的維護。如果使用 Mapper 代理方式(如下圖)則不存在硬編碼問題。
通過上面的描述可以看出 Mapper 代理方式的目的:
- 解決原生方式中的硬編碼
- 簡化後期執行SQL
3.2 使用Mapper代理要求
使用Mapper代理方式,必須滿足以下要求:
-
定義與SQL對映檔案同名的Mapper介面,並且將Mapper介面和SQL對映檔案放置在同一目錄下。如下圖:
-
設定SQL對映檔案的namespace屬性為Mapper介面全限定名
-
在 Mapper 介面中定義方法,方法名就是SQL對映檔案中sql語句的id,並保持引數型別和返回值型別一致
3.3 案例程式碼實現
-
在
com.itheima.mapper
包下建立 UserMapper介面,程式碼如下:public interface UserMapper { List<User> selectAll(); User selectById(int id); }
-
在
resources
下建立com/itheima/mapper
目錄,並在該目錄下建立 UserMapper.xml 對映配置檔案<!-- namespace:名稱空間。必須是對應介面的全限定名 --> <mapper namespace="com.itheima.mapper.UserMapper"> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> </mapper>
-
建立 MybatisDemo2 測試類,程式碼如下:
/** * Mybatis 代理開發 */ public class MyBatisDemo2 { public static void main(String[] args) throws IOException { //1. 載入mybatis的核心配置檔案,獲取 SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 獲取SqlSession物件,用它來執行sql SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 執行sql //3.1 獲取UserMapper介面的代理物件 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.selectAll(); System.out.println(users); //4. 釋放資源 sqlSession.close(); } }
注意:
如果Mapper介面名稱和SQL對映檔名稱相同,並在同一目錄下,則可以使用包掃描的方式簡化SQL對映檔案的載入。也就是將核心配置檔案的載入對映配置檔案的配置修改為
<mappers>
<!--載入sql對映檔案-->
<!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/>-->
<!--Mapper代理方式-->
<package name="com.itheima.mapper"/>
</mappers>
4 核心配置檔案
核心配置檔案中現有的配置之前已經給大家進行了解釋,而核心配置檔案中還可以配置很多內容。我們可以通過查詢官網看可以配置的內容
接下來我們先對裡面的一些配置進行講解。
4.1 多環境配置
在核心配置檔案的 environments
標籤中其實是可以配置多個 environment
,使用 id
給每段環境起名,在 environments
中使用 default='環境id'
來指定使用哪兒段配置。我們一般就配置一個 environment
即可。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--資料庫連線資訊-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--資料庫連線資訊-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>=
4.2 類型別名
在對映配置檔案中的 resultType
屬性需要配置資料封裝的型別(類的全限定名)。而每次這樣寫是特別麻煩的,Mybatis 提供了 類型別名
(typeAliases) 可以簡化這部分的書寫。
首先需要先在核心配置檔案中配置類型別名,也就意味著給pojo包下所有的類起了別名(別名就是類名),不區分大小寫。內容如下:
<typeAliases>
<!--name屬性的值是實體類所在包-->
<package name="com.itheima.pojo"/>
</typeAliases>
通過上述的配置,我們就可以簡化對映配置檔案中 resultType
屬性值的編寫
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="selectAll" resultType="user">
select * from tb_user;
</select>
</mapper>