MyBatis入門精講 -附手寫Mybatis源碼

MyBatis

前言-關於MyBatis

MyBatis的介紹

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis,實質上Mybatisibatis進行一些改進。

MyBatis是一個優秀的持久層框架,它對jdbc操作數據庫的過程進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等繁雜的過程。

MyBatis通過xml 或註解的方式將要執行的各種statement配置起來,並通過java對象和statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射爲 java 對象並 返回。

MyBatis採用 ORM 思想解決了實體和數據庫映射的問題,對 jdbc進行了封裝,屏蔽了 jdbc api 底層訪問細節,使我 們不用與 jdbc api 打交道,就可以完成對數據庫的持久化操作

1、MyBatis入門

1、jdbc編程的基本操作回顧

1. 加載驅動
2. 獲取連接
3. 定義sql語句
4. 預處理statement
5. 執行sql語句,獲取結果集
6. 遍歷結果集
7. 釋放資源
    public static void main(String[] args) {    
        Connection connection = null;    
        PreparedStatement preparedStatement = null;    
        ResultSet resultSet = null;    
        try {     
            //加載數據庫驅動     
            Class.forName("com.mysql.jdbc.Driver");     
            // 通過驅動管理類獲取數據庫鏈接
            connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","ro ot", "root");
            //定義 sql 語句 ?表示佔位符
            String sql = "select * from user where username = ?";
            //獲取預處理 
            statement preparedStatement = connection.prepareStatement(sql); 
            //設置參數,第一個參數爲 sql 語句中參數的序號(從 1 開始),第二個參數爲設置的 參數值
            preparedStatement.setString(1, "王五");
            //向數據庫發出 sql 執行查詢,查詢出結果集
            resultSet =  preparedStatement.executeQuery(); 
            //遍歷查詢結果集
            while(resultSet.next()){
                System.out.println(resultSet.getString("id")+"   "+resultSet.getString("username"));
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            }
            finally{     
            //釋放資源
                if(resultSet!=null){
                    try{resultSet.close();}catch (SQLException e) {e.printStackTrace();}
                }
                if(preparedStatement!=null){
                    try{preparedStatement.close();}catch (SQLException e) {e.printStackTrace();}
                }     
                if(connection!=null){
                    try{connection.close();}catch (SQLException e) {e.printStackTrace();}
                }    
            }
        }

原始jdbc操作的問題:

	 1、數據庫連接創建、釋放頻繁造成系統資源浪費,影響系統性能。
	 2、Sql 語句在代碼中較爲固定,造成代碼不易維護,進行維護時需要修改源碼。
	 3、使用 preparedStatement 向佔位符傳遞參數時,參數可能不固定,有時需要寫判斷條件,費時費力。 
	 4、對結果集的封裝不夠靈活,維護時極爲不便。

2、引入MyBatis

1、創建maven工程並引入MyBatis所需要jar包的座標

在這裏插入圖片描述
設置項目目錄及項目名後,點擊next,來到如下頁面
在這裏插入圖片描述在這裏插入圖片描述
到這裏說明maven項目構建成功了

在pom.xml文件中寫入如下配置

<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
    </dependency>

在這裏插入圖片描述

2、創建並配置MyBatis主配置文件

1、在Resource目錄下創建 SqlMapConfig.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">

2、在 SqlMapConfig.xml文件中配置環境參數

<configuration >
    <!--配置環境-->
    <environments default="mysql">
        <!--配置mysql的環境 -->
        <environment id="mysql">
            <!--配置事務的類型-->
            <transactionManager type="JDBC"/>
            <!--配置數據源(連接池)-->
            <dataSource type="POOLED">
                <!--配置數據庫的4個基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb1?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

3、創建數據庫實體類以及Dao接口

1、創建數據庫實體類User,在這裏要求成員變量名和數據庫的列名一致
在這裏插入圖片描述

2、創建Dao層的接口IUserDao,在接口中聲明一個方法,findAll();

package ldyy.dao;

import ldyy.dao.domain.User;
import java.util.List;

public interface IUserDao {

    /**
     * 查詢所有操作
     * @return User集合
     */
    List<User> findAll();
}

注意 接口所在的包爲main下的Java目錄

4、創建映射文件IUserDao.xml及補全SqlMapConfig.xml文件

1、在Resource目錄下創建於Java目錄相同的目錄結構,並在dao目錄下創建IUserDao.xml文件
在這裏插入圖片描述
2、在IUserDao.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">

3、根據我們編寫的接口配置xml文件

 <mapper namespace="ldyy.dao.IUserDao">
    <!--配置查詢所有-->
    <select id="findAll" resultType="ldyy.dao.domain.User">
        select * from user;
    </select>
</mapper>

在這裏插入圖片描述4、補全SqlMapConfig.xml配置文件

<mappers>
        <!--註解-->
        <mapper class="ldyy/dao/IUserDao"/>
        <!--xml-->
        <mapper resource="ldyy/dao/IUserDao.xml"/>
</mappers>

在mappers標籤中編寫映射文件的地址
在這裏插入圖片描述#### 5、編寫測試類

    public static void main(String[] args) throws Exception{
        //1 讀取配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2 創建SqlSessionFactory工廠
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        //3 使用工廠生產SqlSession對象
        SqlSession session = factory.openSession();
        //4 使用SqlSession創建Dao接口的代理對象
        IUserDao dao = session.getMapper(IUserDao.class);
        //5 使用代理對象執行方法
        List<User> users = dao.findAll();
        //打印結果
        for (User user : users) {
            System.out.println(user);
        }
        //6 釋放資源
        session.close();
        is.close();
    }

打印結果
如果出現如下異常,請註釋掉上文的註解的方式,因爲我們還沒書寫註解。
在這裏插入圖片描述在這裏插入圖片描述

3、MyBatis執行流程及原理分析

1、MyBatis執行流程與原jdbc操作對比
在這裏插入圖片描述2、MyBatis執行流程分析
在這裏插入圖片描述

3、自定義MyBatis分析及源碼

此部分參考 黑馬57期MyBatis講解
在這裏插入圖片描述自定義MyBatis源碼

鏈接:https://pan.baidu.com/s/13jOR79to-dvMb8JC2MOaQg
提取碼:ylm5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章