Mybatis 小談 (上篇)
寫在前面:分享技術,共同進步,有不足請見諒,相關意見可評論告知 ~
程式設計路漫之遠兮,運架構體之帷幄;
勸君專注案前事,亦是杯酒敬蒼生;
目錄
概述
MyBatis 是一款優秀的持久層框架,避免了幾乎所有的JDBC 程式碼和手動設定引數以及獲取結果集的過程, 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 實體類 【Plain Old Java Objects,普通的 Java物件】對映成資料庫中的記錄。
MyBatis 是一個半自動化的ORM框架 (Object Relationship Mapping) -->物件關係對映
Mybatis官方文件 :
GitHub :
Maven 倉庫
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency>
持久化
持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。即把資料(如記憶體中的物件)儲存到可永久儲存的儲存裝置中(如磁碟)。持久化的主要應用是將記憶體中的物件儲存在資料庫中,或者儲存在磁碟檔案中、XML資料檔案中等等。
注意:JDBC就是一種持久化機制。檔案IO也是一種持久化機制。
原因:
①記憶體斷電後資料丟失
②記憶體過於昂貴。
持久層
其他層: Dao層,Service層,Controller層….
- 完成持久化工作的程式碼塊
- 層界限十分明顯。
完成持久化工作的程式碼塊 . ----> dao層 【DAO (Data Access Object) 資料訪問物件】
MyBatis的優點
本質:Mybatis就是幫助我們將資料存入資料庫中 , 和從資料庫中取資料 .
傳統的jdbc操作 , 有很多重複程式碼塊 .比如 : 資料取出時的封裝 , 資料庫的建立連線等等... , 通過框架可以減少重複程式碼,提高開發效率 .
①小巧簡單,沒有任何第三方依賴
②靈活:sql寫在xml裡,提供xml標籤,支援編寫動態sql便於統一管理和優化。解除sql與程式程式碼的耦合,提高了可維護性
③通過提供DAO層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。
搭建環境
搭建資料庫
架構設計器
新建專案
maven開始
-
新建一個普通的maven專案
-
刪除src目錄
-
匯入maven依賴
效果示意圖
在Idea 中連線資料庫
連線成功圖示如下
其中測試連線資料庫失敗的原因之一(時區問題)
show variables like'%time_zone';
set global time_zone = '+8:00';
【Idea 相關配置】
編寫mybatis的核心配置檔案
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatistwo?useSSL=true&useUnicode=true&characterEncoding=UTF-8""/>
<property name="username" value="root"/>
<property name="password" value="${}"/>
</dataSource>
其中:
mybatistwo 為資料庫名
編寫mybatis工具類
核心程式碼
提升sqlSessionFactory
作用域
private static SqlSessionFactory sqlSessionFactory;
下為程式碼塊 ,使用 Mybatis 第一步: 獲取sqlessionFactory 物件
static{
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
獲得取SqlSession 例項,SqlSession 完全包含了面向資料庫執行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
主要程式碼編寫
實體類
get,set 方法有參,空參構造,String等
Dao介面
public interface UserDao {
List<User> getUserList();
}
可以體現 Mybatis 的優越性
Mapper配置檔案
介面實現類由原來的UserDaoImpl轉變為一個 Mapper配置檔案.
<?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">
<!--namespace=繫結一個對應的Dao/Mapper介面-->
<mapper namespace="com.lzh.dao.UserDao">
<select id="getUserList" resultType="com.lzh.pojo.User">
select * from mybatistwo.user
</select>
</mapper>
namespace=繫結一個對應的Dao/Mapper介面
其他拓展
【對映檔案配置】(拓展)
建立 User.xml
檔案
<mapper namespace="user">
<select id="findUserById" parameterType="int" resultType="com.lzh.model.User">
SELECT * FROM user WHERE id = #{a}
</select>
[id]:statement的id,要求在名稱空間內唯一
[parameterType]:入參的java型別
[resultType]:查詢出的單條結果集對應的java型別
[#{}]: 表示一個佔位符?
[#{id}]:表示該佔位符待接收引數的名稱為id。
注意:如果引數為簡單型別時,#{}裡面的引數名稱可以是任意定義
【配置載入對映檔案】(拓展)
測試
注意: test目錄與src 目錄結構一一對應
junit 測試
@Test
public void test(){
//第一步:獲得SqlSession物件
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//關閉SqlSession
sqlSession.close();
}
常見異常解析(關鍵)
①異常一 未繫結異常
org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.
解決:mybatis-config.xml
中優化配置
②異常二資源過濾問題
<!--在build中配置resources,來防止我們資源匯出失敗的問題-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
③異常三jdk版本不相容問題
Error:java: 不再支援源選項 5。請使用 6 或更高版本。
解法:在pom.xml
配置檔案加上如下程式碼
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
④異常四 編碼問題
case1:
1 位元組的 UTF-8 序列的位元組 1 無效。
case2:
org.xml.sax.SAXParseException:
元素內容必須由格式正確的字元資料或標記組成,的錯誤問題
解法:
(1)配置檔案不能有中文註釋
(2)在 mybatis-config.xml
,樣式如下圖
useSSL=true ----> useSSL=false
characterEncoding=UTF-8 --> characterEncoding=UTF8
(3)clean Maven 的快取
常見問題
- 配置檔案沒有註冊
- 繫結介面錯誤。
- 方法名不對
- 返回型別不對
- Maven匯出資源問題
注意 : 依賴的時候注意依賴版本與本地版本一致
七步曲
基於實戰中學習,學習快樂中成長
.
時間會回答成長,成長會回答夢想