Mybatis框架介紹及使用

Mybatis框架介紹及使用

一、什麼是Mybatis

1 、mybatis就是一個封裝來jdbc的持久層框架,它和hibernate都屬於ORM框架,可是具體的說,hibernate是一個徹底的orm框架,而mybatis是一個不徹底的orm框架;
2 、Mybatis讓程序員只關注sql自己,而不須要去關注如鏈接的建立、statement的建立等操做。
三、 Mybatis會將輸入參數、輸出結果進行映射。java

二、Mybatis的框架原理

這裏寫圖片描述

2.1分析結論

一、mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了數據源、事務等信息;映射文件配置了SQL執行相關的 信息。
二、mybatis經過讀取配置文件信息(全局配置文件和映射文件),構造出SqlSessionFactory,即會話工廠。
三、經過SqlSessionFactory,能夠建立SqlSession即會話。Mybatis是經過SqlSession來操做數據庫的。
四、SqlSession自己不能直接操做數據庫,它是經過底層的Executor執行器接口來操做數據庫的。Executor接口有兩個實現類,一個是普通執行器,一個是緩存執行器(默認)。
五、Executor執行器要處理的SQL信息是封裝到一個底層對象MappedStatement中。該對象包括:SQL語句、輸入參數映射信息、輸出結果集映射信息。其中輸入參數和輸出結果的映射類型包括java的簡單類型、HashMap集合對象、POJO對象類型。git

三、入門程序

3.1需求

對訂單商品案例中的用戶表進行增刪改查操做
一、根據用戶ID查詢用戶信息
二、根據用戶名稱模糊查詢用戶列表
三、添加用戶程序員

3.2 環境準備

Jdk:1.7
Ide:eclipse indigo
Mybatis:3.2.7
數據庫:MySQL 5Xgithub

3.3下載mybatis

mybaits的代碼由github.com管理,下載地址:https://github.com/mybatis/mybatis-3/releases
這裏寫圖片描述web

3.4 數據庫腳本初始化
3.5 工程搭建

這裏寫圖片描述

3.6 代碼實現

一 建立 PO 類
這裏寫圖片描述
二 建立全局配置文件
在config目錄下,建立SqlMapConfig.xml文件,該名稱不是固定不變的。
這裏寫圖片描述
需求開發(根據用戶ID查詢用戶信息)
三 映射文件
在config目錄下,建立User.xml(這種命名規範是由ibatis遺留下來)
這裏寫圖片描述
四 在全局配置文件中加載映射文件
這裏寫圖片描述
五 測試
這裏寫圖片描述spring

四、開發方式

4.1 Mybatis開發dao的方式(即開發dao接口和dao實現類)

需求:根據用戶ID查詢用戶信息sql

一 Dao接口
這裏寫圖片描述
二 Dao實現類
SqlSessionFactory,它的生命週期,應該是應用範圍,全局範圍只有一個工廠,使用單例模式來實現這個功能。與spring集成以後,由spring來對其進行單例管理。
SqlSession,它內部含有一塊數據區域,存在線程不安全的問題,因此應該將sqlsession聲明到方法內部。數據庫

public class UserDaoImpl implements UserDao {

    // 依賴注入
    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User findUserById(int id) throws Exception {
        // 建立SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 調用SqlSession的增刪改查方法
        // 第一個參數:表示statement的惟一標示
        User user = sqlSession.selectOne("test.findUserById", id);
        System.out.println(user);
        // 關閉資源
        sqlSession.close();
        return sqlSession.selectOne("test.findUserById", 1);
    }

    @Override
    public List<User> findUsersByName(String name) {
        // 建立SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 調用SqlSession的增刪改查方法
        // 第一個參數:表示statement的惟一標示
        List<User> list = sqlSession.selectOne("test.findUsersByName", name);
        System.out.println(list);
        // 關閉資源
        sqlSession.close();
        return list;
    }

    @Override
    public void insertUser(User user) {
        // 建立SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 調用SqlSession的增刪改查方法
        // 第一個參數:表示statement的惟一標示
        sqlSession.insert("test.insertUser", user);

        System.out.println(user.getId());
        // 提交事務
        sqlSession.commit();
        // 關閉資源
        sqlSession.close();
    }

}

三 測試
這裏寫圖片描述緩存

4.2 Mapper代理的開發方式(即開發mapper接口(至關於dao接口))

Mapper代理的開發規範安全

一、mapper接口的全限定名要和mapper映射文件的namespace值一致。
二、mapper接口的方法名稱要和mapper映射文件的statement的id一致。
三、mapper接口的方法參數類型要和mapper映射文件的statement的parameterType的值一致,並且它的參數是一個。
四、mapper接口的方法返回值類型要和mapper映射文件的statement的resultType的值一致。

一 Mapper接口
這裏寫圖片描述
二 Mapper映射文件
在config下建立mapper目錄而後建立UserMapper.xml(這是mybatis的命名規範,固然,也不是必須是這個名稱)
這裏寫圖片描述
三 加載映射文件
這裏寫圖片描述
四 測試
這裏寫圖片描述

五、mybatis 整合Spring

一、數據源信息交給spring管理
二、SqlSessionFactory交給spring進行單例管理
三、由spring來管理原始dao的實現類或者mapper代理的代理類。

5.1 需求

使用原始dao方式和mapper代理方式實現如下功能:
根據用戶ID查詢商品信息

5.2 工程搭建

Mysql的驅動包
Mybatis的核心包和依賴包
Mybatis和spring的整合包
Spring的包
dbcp數據庫鏈接池包
這裏寫圖片描述

5.3 具體整合

一 Mybatis
在config下,建立mybatis目錄,而後建立SqlMapConfig.xml
這裏寫圖片描述
將db.properties和log4j.properties拷貝到config目錄下。
二 Spring
在config下,建立spring目錄,而後建立applicationContext.xml
這裏寫圖片描述

5.4 整合代碼
5.4.1 原始dao開發方式

一 映射文件
在config/mybatis下建立sqlmap,而後建立User.xml
這裏寫圖片描述
二 Dao代碼
Dao接口
這裏寫圖片描述
Dao實現類
這裏寫圖片描述
三 配置UserDao實現類
在applicationContext.xml中配置UserDao實現類
這裏寫圖片描述
四 測試
這裏寫圖片描述

5.4.2 Mapper代理開發方式

一 映射文件
將映射文件放到UserMapper接口的同包下
這裏寫圖片描述
二 Mapper接口
這裏寫圖片描述
三 配置mapper代理類
單個mapper代理類配置
這裏寫圖片描述
批量設置mapper代理類
這裏寫圖片描述
四 測試
這裏寫圖片描述