1. 程式人生 > 實用技巧 >Mybatis 小談 (上篇)

Mybatis 小談 (上篇)

寫在前面:分享技術,共同進步,有不足請見諒,相關意見可評論告知 ~

程式設計路漫之遠兮,運架構體之帷幄;
勸君專注案前事,亦是杯酒敬蒼生;

目錄

概述

MyBatis 是一款優秀的持久層框架,避免了幾乎所有的JDBC 程式碼和手動設定引數以及獲取結果集的過程, 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 實體類 【Plain Old Java Objects,普通的 Java物件】對映成資料庫中的記錄。

MyBatis 是一個半自動化的ORM框架 (Object Relationship Mapping) -->物件關係對映

Mybatis官方文件 :

http://www.mybatis.org/mybatis-3/zh/index.html

GitHub :

https://github.com/mybatis/mybatis-3

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開始

  1. 新建一個普通的maven專案

  2. 刪除src目錄

  3. 匯入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&amp;useUnicode=true&amp;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 的快取

常見問題

  1. 配置檔案沒有註冊
  2. 繫結介面錯誤。
  3. 方法名不對
  4. 返回型別不對
  5. Maven匯出資源問題

注意 : 依賴的時候注意依賴版本與本地版本一致

七步曲

基於實戰中學習,學習快樂中成長
.
時間會回答成長,成長會回答夢想