国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上)

這篇具有很好參考價值的文章主要介紹了自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??前言
本篇博文是學習過程中的筆記和對于MyBatis底層機制的分析思路,希望能夠給您帶來幫助??

??個人主頁:晨犀主頁
??個人簡介:大家好,我是晨犀,希望我的文章可以幫助到大家,您的滿意是我的動力????

??歡迎大家:這里是CSDN,我總結(jié)知識的地方,歡迎來到我的博客,感謝大家的觀看??
如果文章有什么需要改進的地方還請大佬不吝賜教 先在次感謝啦??

自己實現(xiàn)MyBatis 底層機制[上]

MyBatis 整體架構(gòu)分析

Mybatis 核心框架示意圖

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

核心框架示意圖的解讀

  1. mybatis 的核心配置文件
    mybatis-config.xml: 進行全局配置,全局只能有一個這樣的配置文件
    XxxMapper.xml 配置多個SQL,可以有多個XxxMappe.xml 配置文件
  2. 通過mybatis-config.xml 配置文件得到SqlSessionFactory
  3. 通過SqlSessionFactory 得到SqlSession,用SqlSession 就可以操作數(shù)據(jù)了
  4. SqlSession 底層是Executor(執(zhí)行器), 有兩個重要的實現(xiàn)類基本執(zhí)行器和帶緩存功能的執(zhí)行器, 有很多方法

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

  1. MappedStatement 是通過XxxMapper.xml 中定義, 生成的statement 對象
  2. 參數(shù)輸入執(zhí)行并輸出結(jié)果集, 無需手動判斷參數(shù)類型和參數(shù)下標位置, 且自動將結(jié)果集映射為Java 對象

搭建MyBatis 底層機制開發(fā)環(huán)境

1、創(chuàng)建Maven 項目nlc-mybatis

前面快速入門有創(chuàng)建步驟,這里不在描述。

2、修改nlc-mybatis\pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.nlc</groupId>
    <artifactId>nlc-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--定義編譯器 / source / target 版本即可-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <java.version>1.8</java.version>
    </properties>
    <!--引入必要的依賴-->
    <dependencies>
        <!--引入dom4j-->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <!--引入mysql依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <!--lombok-簡化entity/javabean/pojo開發(fā) -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
        </dependency>
        <!--junit依賴-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

3、創(chuàng)建數(shù)據(jù)庫和表

CREATE DATABASE `nlc_mybatis`;
USE `nlc_mybatis`;
CREATE TABLE `monster` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `age` INT NOT NULL,
    `birthday` DATE DEFAULT NULL,
    `email` VARCHAR(255) NOT NULL,
    `gender` TINYINT NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `salary` DOUBLE NOT NULL,
    PRIMARY KEY (`id`)
) CHARSET=utf8
INSERT INTO `monster` VALUES(NULL, 200, '2000-11-11', 'nmw@sohu.com', 1,'牛魔王', 8888.88)

4、到此: 項目開發(fā)環(huán)境搭建完成

Nlc-Mybatis 的設計思路

Mybatis 的底層實現(xiàn)設計

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

1. 傳統(tǒng)方式操作數(shù)據(jù)庫
  1. 得到Session對象

  2. 調(diào)用Executor的方法完成操作

  3. Executor的連接是從Configuration獲取的

2.MyBatis操作數(shù)據(jù)庫的方式分析
  1. 得到Session
  2. 不用直接調(diào)用Executor的方法完成操作
  3. 通過MapperProxy獲取Mapper對象
  4. 調(diào)用Mapper的方法,完成數(shù)據(jù)庫的操作
  5. Mapper最終還是動態(tài)代理方式,使用Executor的方法完成操作
  6. MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數(shù)和獲取結(jié)果集的工作。

自己實現(xiàn)MyBatis 底層機制

實現(xiàn)任務階段1- 完成讀取配置文件,得到數(shù)據(jù)庫連接

通過配置文件,獲取數(shù)據(jù)庫連接。

分析示意圖

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

代碼實現(xiàn)
  1. 創(chuàng)建nlc-mybatis\src\main\resources\nlc_config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<database>
    <!--配置連接數(shù)據(jù)庫的信息-->
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <!--配置連接mysql-url
                1. jdbc:mysql 協(xié)議
                2. 127.0.0.1:3306 : 指定連接mysql的ip+port
                3. mybatis: 連接的DB
                4. useSSL=true 表示使用安全連接
                5. &amp; 表示 & 防止解析錯誤
                6. useUnicode=true : 使用unicode 作用是防止編碼錯誤
                7. characterEncoding=UTF-8 指定使用utf-8, 防止中文亂碼
                8. 不要背,直接使用即可
        -->
    <property name="url" value="jdbc:mysql://localhost:3306/nlc_mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</database>
  1. 創(chuàng)建nlc-mybatis\sqlsession\NlcConfiguration.java
public class NlcConfiguration {

    //屬性-類的加載器
    private static ClassLoader loader =
            ClassLoader.getSystemClassLoader();

    //讀取xml文件信息,并處理
    public Connection build(String resource) {

        Connection connection = null;

        try {
            //加載配置nlc_mybatis.xml 獲取到對應的InputStream
            InputStream stream =  loader.getResourceAsStream(resource);
            SAXReader reader = new SAXReader();
            Document document = reader.read(stream);
            //獲取到nlc_mybatis.xml 的根元素 <database>
            Element root = document.getRootElement();
            System.out.println("root=" + root);
            //解析root元素,返回Connection 
            connection = evalDataSource(root);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    //方法會解析nlc_config.xml 信息,并返回Connection
    //eval: 評估/解析
    private Connection evalDataSource(Element node) {
        if (!"database".equals(node.getName())) {
            throw new RuntimeException("root 節(jié)點應該是<database>");
        }
        //連接DB的必要參數(shù)
        String driverClassName = null;
        String url = null;
        String username = null;
        String password = null;

        //遍歷node下的子節(jié)點,獲取屬性值
        for (Object item : node.elements("property")) {
            Element i = (Element) item;//i 就是 對應property節(jié)點
            String name = i.attributeValue("name");
            String value = i.attributeValue("value");

            //判斷是否得到name 和 value
            if (name == null || value == null) {
                throw new RuntimeException("property 節(jié)點沒有設置name或者value屬性");
            }
            switch (name) {
                case "url":
                    url = value;
                    break;
                case "username":
                    username = value;
                    break;
                case "driverClassName":
                    driverClassName = value;
                    break;
                case "password":
                    password = value;
                    break;
                default:
                    throw new RuntimeException("屬性名沒有匹配到...");
            }
        }

        Connection connection = null;

        try {
            //要求JVM查找并加載指定的類到內(nèi)存中,此時將"com.mysql.jdbc.Driver" 當做參數(shù)傳入,
            // 就是告訴JVM,去"com.mysql.jdbc"這個路徑下找Driver類,將其加載到內(nèi)存中。
            Class.forName(driverClassName);
            connection = DriverManager.getConnection(url,username,password);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return connection; //返回Connection
    }

}
完成測試
  1. 編寫nlc-mybatis\src\test\java\com\nlc\test\NlcMybatisTest.java
public class NlcMyBatisTest {

    @Test
    public void build() {
        NlcConfiguration nlcConfiguration = new NlcConfiguration();
        Connection connection = nlcConfiguration.build("nlc_mybatis.xml");
        System.out.println("connection--" + connection);
    }
}
測試效果

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

實現(xiàn)任務階段2- 編寫執(zhí)行器,輸入SQL 語句,完成操作

說明:通過實現(xiàn)執(zhí)行器機制,對數(shù)據(jù)表操作。

分析示意圖

說明:我們把對數(shù)據(jù)庫的操作,會封裝到一套Executor 機制中,程序具有更好的擴展性,結(jié)構(gòu)更加清晰.

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

代碼實現(xiàn)

  1. 創(chuàng)建nlc-mybatis\src\main\java\com\nlc\entity\Monster.java

如果使用@Data注解需要全參構(gòu)造器可以添加@AllArgsConstructor,但是無參構(gòu)造器必須要顯示調(diào)用,否則會被全參構(gòu)造器覆蓋。

/**
 * Monster 和 monster表有映射關系
 * @Getter 就會給所有屬性 生成對應的getter
 * @Setter 就會給所有屬性 生成對應的setter
 * @ToString 生成 toString...
 * @NoArgsConstructor 生成無參構(gòu)造器
 * @AllArgsConstructor 生成要給全參構(gòu)造器
 * @Data 會生成上面除全參構(gòu)造器的所有注解
 * 如何選擇主要還是看自己需要
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Monster {

    private Integer id;
    private Integer age;
    private String name;
    private String email;
    private Date birthday;
    private double salary;
    private Integer gender;

}
  1. 創(chuàng)建nlc-mybatis\src\main\java\com\nlc\nlcmybatis\sqlsession\Executor.java
public interface Executor {
    //泛型方法
    public <T> T query(String statement, Object parameter);
}
  1. 創(chuàng)建nlc-mybatis\src\main\java\com\nlc\nlcmybatis\sqlsession\NlcExecutor.java
public class NlcExecutor implements Executor {

    //屬性
    private NlcConfiguration nlcConfiguration =
            new NlcConfiguration();

    // 根據(jù) sql 查找結(jié)果
    @Override
    public <T> T query(String sql, Object parameter) {
        //得到連接Connection
        Connection connection = getConnection();
        //查詢返回的結(jié)果集
        ResultSet set = null;
        PreparedStatement pre = null;

        try {
            pre = connection.prepareStatement(sql);
            //設置參數(shù), 如果參數(shù)多, 可以使用數(shù)組處理.
            pre.setString(1, parameter.toString());
            set = pre.executeQuery();
            //把set數(shù)據(jù)封裝到對象-monster
            //說明: 這里做了簡化處理
            //認為返回的結(jié)果就是一個monster記錄
            //完善的寫法是一套反射機制.
            Monster monster = new Monster();

            //遍歷結(jié)果集, 把數(shù)據(jù)封裝到monster對象
            while (set.next()) {
                monster.setId(set.getInt("id"));
                monster.setName(set.getString("name"));
                monster.setEmail(set.getString("email"));
                monster.setAge(set.getInt("age"));
                monster.setGender(set.getInt("gender"));
                monster.setBirthday(set.getDate("birthday"));
                monster.setSalary(set.getDouble("salary"));
            }
            return (T) monster;

        } catch (Exception throwables) {
            throwables.printStackTrace();
        } finally {
            try {
                if (set != null) {
                    set.close();
                }
                if (pre != null) {
                    pre.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        }

        return null;
    }
    
     //編寫方法,通過NlcConfiguration對象,返回連接
    private Connection getConnection() {
        Connection connection =   nlcConfiguration.build("nlc_mybatis.xml");
        return connection;
    }
}

完成測試

  1. 修改nlc-mybatis\src\test\java\com\nlc\test\NlcMybatisTest.java , 增加測試方法
@Test
    public void query() {
        Executor executor = new NlcExecutor();
        Monster monster =
                executor.query("select * from monster where id=?", 1);
        System.out.println("monster-- " + monster);
    }
  1. 測試效果

自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上),手寫機制,MyBatis,mybatis,筆記

??總結(jié)

  1. 了解底層的機制可以幫助我們更好的學習,閱讀優(yōu)秀的源碼可以增長我們的功力。
  2. 適當?shù)膁ebug可以解決我們的疑惑,底層是一個非常龐大的集成,把握主干就可以了。
  3. 過于追根究底只會影響自己的心緒,會耗費大量時間精力。
  4. 如果自己感興趣的話,可以多研究一下,會發(fā)現(xiàn)其中的樂趣,點到即止。

文章到這里就結(jié)束了,如果有什么疑問的地方請指出,諸大佬們一起來評論區(qū)一起討論??
希望能和諸大佬們一起努力,今后我們一起觀看感謝您的閱讀??
如果幫助到您不妨3連支持一下,創(chuàng)造不易您們的支持是我的動力??文章來源地址http://www.zghlxwxcb.cn/news/detail-615484.html

到了這里,關于自己實現(xiàn)MyBatis 底層機制--抽絲剝繭(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 自己實現(xiàn) SpringMVC 底層機制 系列之-實現(xiàn)任務階段 6-完成控制器方法獲取參數(shù)-@RequestParam

    自己實現(xiàn) SpringMVC 底層機制 系列之-實現(xiàn)任務階段 6-完成控制器方法獲取參數(shù)-@RequestParam

    ??前言 自己實現(xiàn) SpringMVC 底層機制 系列之-實現(xiàn)任務階段 6-完成控制器方法獲取參數(shù)-@RequestParam ??個人主頁:塵覺主頁 ??個人簡介:大家好,我是塵覺,希望我的文章可以幫助到大家,您的滿意是我的動力???? 在csdn獲獎榮譽: ??csdn城市之星2名 ???? ???? ???

    2024年02月11日
    瀏覽(22)
  • 深入實現(xiàn) MyBatis 底層機制的任務階段4 - 開發(fā) Mapper 接口和 Mapper.xml

    深入實現(xiàn) MyBatis 底層機制的任務階段4 - 開發(fā) Mapper 接口和 Mapper.xml

    ??前言 在我們的自定義 MyBatis 底層機制實現(xiàn)過程中,我們已經(jīng)深入研究了多個任務階段,包括配置文件的讀取、數(shù)據(jù)庫連接的建立、執(zhí)行器的編寫,以及 SqlSession 的封裝。每個任務階段都為我們揭示了 MyBatis 內(nèi)部工作原理的一部分,為構(gòu)建完整的底層框架打下了堅實的基礎

    2024年02月09日
    瀏覽(22)
  • 實現(xiàn)SpringMVC底層機制(二)

    實現(xiàn)SpringMVC底層機制(二)

    1.修改SunWebApplicationContext.java 2.修改SunDispatcherServlet.java 1.需求分析 2.編寫Monster.java 3.自定義Service注解 4.編寫Service接口MonsterService.java 5.編寫Service實現(xiàn)類MonsterServiceImpl.java 6.修改SunWebApplicationContext.java的executeInstance方法,增加對Service注解的掃描 7.debug測試 1.自定義Autowired注解 2

    2024年04月27日
    瀏覽(17)
  • 實現(xiàn)SpringMVC底層機制(三)

    實現(xiàn)SpringMVC底層機制(三)

    1.將方法的httpservletrequest和httpservletresponse參數(shù)封裝到參數(shù)數(shù)組進行反射調(diào)用 1.修改SunDispatcherServlet.java的executeDispatch方法 2.debug測試 2.封裝http請求參數(shù) 1.需求分析 2.自定義注解RequestsParam 3.修改MonsterService接口,添加方法 4.修改MonsterServiceImpl.java添加方法 5.修改SunDispatcherServlet.

    2024年04月28日
    瀏覽(24)
  • Spring系列五:手動實現(xiàn)Spring底層機制

    Spring系列五:手動實現(xiàn)Spring底層機制

    上文中, 我們學習到了 Spring系列四:AOP切面編程 接下來我們學習, 手動實現(xiàn)Spring底層機制 ● java的類加載器 3 種 Bootstrap類加載器---------------------對應路徑jrelib Ext類加載器------------------------------對應路徑jrelibext App類加載器-----------------------------對應路徑classpath ●classpath 類路

    2024年02月12日
    瀏覽(14)
  • 手動開發(fā)-實現(xiàn)SpringMVC底層機制--小試牛刀

    手動開發(fā)-實現(xiàn)SpringMVC底層機制--小試牛刀

    在這里說的底層機制的實現(xiàn)主要是指:前端控制器、Controller、Service注入容器、對象自動裝配、控制器方法獲取參數(shù)、視圖解析、返回json數(shù)據(jù)。 前端控制器就是核心控制器。在這里我們可以設計一個Servlet來充當核心控制器: LingDispatcherServlet.java .這個控制器的作用主要是接收

    2024年02月08日
    瀏覽(20)
  • 【Spring】手動實現(xiàn)Spring底層機制-問題的引出

    【Spring】手動實現(xiàn)Spring底層機制-問題的引出

    ??歡迎來到@邊境矢夢°的csdn博文?? ??本文主要梳理手動實現(xiàn)Spring底層機制-問題的引出??? ??我是邊境矢夢°,一個正在為秋招和算法競賽做準備的學生?? ??喜歡的朋友可以關注一下 ?????? ,下次更新不迷路?? Ps: 月亮越亮說明知識點越重要 (重要性或者難度越大)??

    2024年02月09日
    瀏覽(22)
  • 【Redis進階】一文搞懂Redisson的看門狗機制底層實現(xiàn)

    看門狗機制是Redission提供的一種自動延期機制,這個機制使得 Redission提供的分布式鎖是可以自動續(xù)期的 。 看門狗機制提供的默認超時時間是30*1000毫秒,也就是30秒 如果一個線程獲取鎖后,運行程序到釋放鎖所花費的時間大于鎖自動釋放時間(也就是看門狗機制提供的超時時

    2024年02月16日
    瀏覽(86)
  • 精華推薦 |【Redis技術探索】「底層架構(gòu)原理」幫你徹底搞定Sentinel的實現(xiàn)原理運作機制

    精華推薦 |【Redis技術探索】「底層架構(gòu)原理」幫你徹底搞定Sentinel的實現(xiàn)原理運作機制

    最美好的生活方式是和一群志同道合的人,一起奔跑在理想的路上,回頭有一路的故事,低頭有堅定的腳步,抬頭有清晰的遠方! ??? Sentinel出現(xiàn)的前提背景 在前面Redis技術系列的章節(jié)中,我們介紹了相關Redis持久化機制和Redis主從架構(gòu)的探究。兩者的相輔相成實現(xiàn)了Redis的

    2023年04月09日
    瀏覽(55)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包