1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        MyBatis 架構與原理

        共 16292字,需瀏覽 33分鐘

         ·

        2021-06-08 10:32

        來源:jianshu.com/p/15781ec742f2


        MyBatis功能架構設計

        功能架構講解:

        我們把Mybatis的功能架構分為三層:

        (1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。

        (2)數據處理層:負責具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。

        (3)基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數據處理層提供最基礎的支撐。

        框架架構

        框架架構講解:

        這張圖從上往下看。MyBatis的初始化,會從mybatis-config.xml配置文件,解析構造成Configuration這個類,就是圖中的紅框。

        (1)加載配置:配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入參數映射配置、執(zhí)行的SQL語句、結果映射配置),存儲在內存中。

        (2)SQL解析:當API接口層接收到調用請求時,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數據類型),Mybatis會根據SQL的ID找到對應的MappedStatement,然后根據傳入參數對象對MappedStatement進行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數。

        (3)SQL執(zhí)行:將最終得到的SQL和參數拿到數據庫進行執(zhí)行,得到操作數據庫的結果。

        (4)結果映射:將操作數據庫的結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基本數據類型,并將最終結果返回。

        MyBatis核心類

        1、SqlSessionFactoryBuilder

        每一個MyBatis的應用程序的入口是SqlSessionFactoryBuilder。

        它的作用是通過XML配置文件創(chuàng)建Configuration對象(當然也可以在程序中自行創(chuàng)建),然后通過build方法創(chuàng)建SqlSessionFactory對象。沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactoryBuilder,通常的做法是創(chuàng)建一個全局的對象就可以了。示例程序如下:

        private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
        private static SqlSessionFactory sqlSessionFactory;

        private static void init() throws IOException {
                String resource = "mybatis-config.xml";
                Reader reader = Resources.getResourceAsReader(resource);
                sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
                }
                org.apache.ibatis.session.Configuration 是mybatis初始化的核心。

        mybatis-config.xml中的配置,最后會解析xml成Configuration這個類。

        SqlSessionFactoryBuilder根據傳入的數據流(XML)生成Configuration對象,然后根據Configuration對象創(chuàng)建默認的SqlSessionFactory實例。

        2、SqlSessionFactory對象由SqlSessionFactoryBuilder創(chuàng)建:

        它的主要功能是創(chuàng)建SqlSession對象,和SqlSessionFactoryBuilder對象一樣,沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactory,通常的做法是創(chuàng)建一個全局的對象就可以了。SqlSessionFactory對象一個必要的屬性是Configuration對象,它是保存Mybatis全局配置的一個配置對象,通常由SqlSessionFactoryBuilder從XML配置文件創(chuàng)建。這里給出一個簡單的示例:

        <?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>
                <typeAlias type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />
                <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />
            </typeAliases>

            <!-- 配置環(huán)境變量 -->
            <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://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />
                        <property name="username" value="iMybatis" />
                        <property name="password" value="iMybatis" />
                    </dataSource>
                </environment>
            </environments>

            <!-- 配置mappers -->
            <mappers>
                <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />
            </mappers>

        </configuration>

        3、SqlSession

        SqlSession對象的主要功能是完成一次數據庫的訪問和結果的映射,它類似于數據庫的session概念,由于不是線程安全的,所以SqlSession對象的作用域需限制方法內。SqlSession的默認實現類是DefaultSqlSession,它有兩個必須配置的屬性:Configuration和Executor。Configuration前文已經描述這里不再多說。SqlSession對數據庫的操作都是通過Executor來完成的。

        SqlSession :默認創(chuàng)建DefaultSqlSession 并且開啟一級緩存,創(chuàng)建執(zhí)行器 、賦值。

        SqlSession有一個重要的方法getMapper,顧名思義,這個方式是用來獲取Mapper對象的。什么是Mapper對象?根據Mybatis的官方手冊,應用程序除了要初始并啟動Mybatis之外,還需要定義一些接口,接口里定義訪問數據庫的方法,存放接口的包路徑下需要放置同名的XML配置文件。

        SqlSession的getMapper方法是聯系應用程序和Mybatis紐帶,應用程序訪問getMapper時,Mybatis會根據傳入的接口類型和對應的XML配置文件生成一個代理對象,這個代理對象就叫Mapper對象。應用程序獲得Mapper對象后,就應該通過這個Mapper對象來訪問Mybatis的SqlSession對象,這樣就達到里插入到Mybatis流程的目的。

        SqlSession session= sqlSessionFactory.openSession();
                UserDao userDao = session.getMapper(UserDao.class);
                UserDto user = new UserDto();
                user.setUsername("iMybatis");
                List<UserDto> users = userDao.queryUsers(user);

            public interface UserDao {
            public List<UserDto> queryUsers(UserDto user) throws Exception;
                }

                <?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="org.iMybatis.abc.dao.UserDao">
                    <select id="queryUsers" parameterType="UserDto" resultType="UserDto"
                            useCache="false">

                        <![CDATA[
                select * from t_user t where t.username = #{username}
                ]]>
                    </select>
                </mapper>

        4、Executor

        Executor對象在創(chuàng)建Configuration對象的時候創(chuàng)建,并且緩存在Configuration對象里。Executor對象的主要功能是調用StatementHandler訪問數據庫,并將查詢結果存入緩存中(如果配置了緩存的話)。

        5、StatementHandler

        StatementHandler是真正訪問數據庫的地方,并調用ResultSetHandler處理查詢結果。

        6、ResultSetHandler

        處理查詢結果。

        MyBatis成員層次&職責

        1. SqlSession 作為MyBatis工作的主要頂層API,表示和數據庫交互的會話,完成必要數據庫增刪改查功能
        2. Executor MyBatis執(zhí)行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護
        3. StatementHandler 封裝了JDBC Statement操作,負責對JDBCstatement的操作,如設置參數、將Statement結果集轉換成List集合。
        4. ParameterHandler 負責對用戶傳遞的參數轉換成JDBC Statement 所需要的參數
        5. ResultSetHandler *負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合;
        6. TypeHandler 負責java數據類型和jdbc數據類型之間的映射和轉換
        7. MappedStatement MappedStatement維護了一條<select|update|delete|insert>節(jié)點的封
        8. SqlSource 負責根據用戶傳遞的parameterObject,動態(tài)地生成SQL語句,將信息封裝到BoundSql對象中,并返回
        9. BoundSql 表示動態(tài)生成的SQL語句以及相應的參數信息
        10. Configuration MyBatis所有的配置信息都維持在Configuration對象之中

        title: Mybatis架構與原理 date: 2021-05-23 tags: categories: 精進 permalink: Fight/Mybatis-architecture-and-principle author: 消失er from_url: jianshu.com/p/15781ec742f2 wechat_url:


        MyBatis功能架構設計

        功能架構講解:

        我們把Mybatis的功能架構分為三層:

        (1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。

        (2)數據處理層:負責具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。

        (3)基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數據處理層提供最基礎的支撐。

        框架架構

        框架架構講解:

        這張圖從上往下看。MyBatis的初始化,會從mybatis-config.xml配置文件,解析構造成Configuration這個類,就是圖中的紅框。

        (1)加載配置:配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入參數映射配置、執(zhí)行的SQL語句、結果映射配置),存儲在內存中。

        (2)SQL解析:當API接口層接收到調用請求時,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數據類型),Mybatis會根據SQL的ID找到對應的MappedStatement,然后根據傳入參數對象對MappedStatement進行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數。

        (3)SQL執(zhí)行:將最終得到的SQL和參數拿到數據庫進行執(zhí)行,得到操作數據庫的結果。

        (4)結果映射:將操作數據庫的結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基本數據類型,并將最終結果返回。

        MyBatis核心類

        1、SqlSessionFactoryBuilder

        每一個MyBatis的應用程序的入口是SqlSessionFactoryBuilder。

        它的作用是通過XML配置文件創(chuàng)建Configuration對象(當然也可以在程序中自行創(chuàng)建),然后通過build方法創(chuàng)建SqlSessionFactory對象。沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactoryBuilder,通常的做法是創(chuàng)建一個全局的對象就可以了。示例程序如下:

        private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
        private static SqlSessionFactory sqlSessionFactory;

        private static void init() throws IOException {
                String resource = "mybatis-config.xml";
                Reader reader = Resources.getResourceAsReader(resource);
                sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
                }
                org.apache.ibatis.session.Configuration 是mybatis初始化的核心。

        mybatis-config.xml中的配置,最后會解析xml成Configuration這個類。

        SqlSessionFactoryBuilder根據傳入的數據流(XML)生成Configuration對象,然后根據Configuration對象創(chuàng)建默認的SqlSessionFactory實例。

        2、SqlSessionFactory對象由SqlSessionFactoryBuilder創(chuàng)建:

        它的主要功能是創(chuàng)建SqlSession對象,和SqlSessionFactoryBuilder對象一樣,沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactory,通常的做法是創(chuàng)建一個全局的對象就可以了。SqlSessionFactory對象一個必要的屬性是Configuration對象,它是保存Mybatis全局配置的一個配置對象,通常由SqlSessionFactoryBuilder從XML配置文件創(chuàng)建。這里給出一個簡單的示例:

        <?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>
                <typeAlias type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />
                <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />
            </typeAliases>

            <!-- 配置環(huán)境變量 -->
            <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://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />
                        <property name="username" value="iMybatis" />
                        <property name="password" value="iMybatis" />
                    </dataSource>
                </environment>
            </environments>

            <!-- 配置mappers -->
            <mappers>
                <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />
            </mappers>

        </configuration>

        3、SqlSession

        SqlSession對象的主要功能是完成一次數據庫的訪問和結果的映射,它類似于數據庫的session概念,由于不是線程安全的,所以SqlSession對象的作用域需限制方法內。SqlSession的默認實現類是DefaultSqlSession,它有兩個必須配置的屬性:Configuration和Executor。Configuration前文已經描述這里不再多說。SqlSession對數據庫的操作都是通過Executor來完成的。

        SqlSession :默認創(chuàng)建DefaultSqlSession 并且開啟一級緩存,創(chuàng)建執(zhí)行器 、賦值。

        SqlSession有一個重要的方法getMapper,顧名思義,這個方式是用來獲取Mapper對象的。什么是Mapper對象?根據Mybatis的官方手冊,應用程序除了要初始并啟動Mybatis之外,還需要定義一些接口,接口里定義訪問數據庫的方法,存放接口的包路徑下需要放置同名的XML配置文件。

        SqlSession的getMapper方法是聯系應用程序和Mybatis紐帶,應用程序訪問getMapper時,Mybatis會根據傳入的接口類型和對應的XML配置文件生成一個代理對象,這個代理對象就叫Mapper對象。應用程序獲得Mapper對象后,就應該通過這個Mapper對象來訪問Mybatis的SqlSession對象,這樣就達到里插入到Mybatis流程的目的。

        SqlSession session= sqlSessionFactory.openSession();
                UserDao userDao = session.getMapper(UserDao.class);
                UserDto user = new UserDto();
                user.setUsername("iMybatis");
                List<UserDto> users = userDao.queryUsers(user);

            public interface UserDao {
            public List<UserDto> queryUsers(UserDto user) throws Exception;
                }

                <?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="org.iMybatis.abc.dao.UserDao">
                    <select id="queryUsers" parameterType="UserDto" resultType="UserDto"
                            useCache="false">

                        <![CDATA[
                select * from t_user t where t.username = #{username}
                ]]>
                    </select>
                </mapper>

        4、Executor

        Executor對象在創(chuàng)建Configuration對象的時候創(chuàng)建,并且緩存在Configuration對象里。Executor對象的主要功能是調用StatementHandler訪問數據庫,并將查詢結果存入緩存中(如果配置了緩存的話)。

        5、StatementHandler

        StatementHandler是真正訪問數據庫的地方,并調用ResultSetHandler處理查詢結果。

        6、ResultSetHandler

        處理查詢結果。

        MyBatis成員層次&職責

        1. SqlSession 作為MyBatis工作的主要頂層API,表示和數據庫交互的會話,完成必要數據庫增刪改查功能
        2. Executor MyBatis執(zhí)行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護
        3. StatementHandler 封裝了JDBC Statement操作,負責對JDBCstatement的操作,如設置參數、將Statement結果集轉換成List集合。
        4. ParameterHandler 負責對用戶傳遞的參數轉換成JDBC Statement 所需要的參數
        5. ResultSetHandler *負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合;
        6. TypeHandler 負責java數據類型和jdbc數據類型之間的映射和轉換
        7. MappedStatement MappedStatement維護了一條<select|update|delete|insert>節(jié)點的封
        8. SqlSource 負責根據用戶傳遞的parameterObject,動態(tài)地生成SQL語句,將信息封裝到BoundSql對象中,并返回
        9. BoundSql 表示動態(tài)生成的SQL語句以及相應的參數信息
        10. Configuration MyBatis所有的配置信息都維持在Configuration對象之中

        文章有幫助的話,在看,轉發(fā)吧。

        謝謝支持喲 (*^__^*)

        — 【 THE END 】—
        本公眾號全部博文已整理成一個目錄,請在公眾號里回復「m」獲取!

        最近面試BAT,整理一份面試資料Java面試BATJ通關手冊,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數據庫、數據結構等等。

        獲取方式:點“在看”,關注公眾號并回復 PDF 領取,更多內容陸續(xù)奉上。

        文章有幫助的話,在看,轉發(fā)吧。

        謝謝支持喲 (*^__^*)

        瀏覽 52
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91日逼| 中文字幕在线观看第二页 | 国产精品永久久久 | 美艳娇妻被黑人多ph文 | 淫色小视频 | 三级片www. | 久久国产成人午夜AV浪潮 | 疯狂做受xxxx高潮欧美日本 | 国产原创AV在线播放 | 黄色一级直播 |