亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

介紹 mybatis 執(zhí)行 SQL 的大致過程

derek_334892 / 3150人閱讀

摘要:本文通過方法來用執(zhí)行帶參數(shù)的命令,來介紹執(zhí)行的大致過程。三是返回值的類型。返回值的類型包括兩部分,一是返回結(jié)果本身的類型,二是返回結(jié)果的每個字段各是什么類型用于轉(zhuǎn)換。對象是一個很復(fù)雜的對象,涵蓋了執(zhí)行命令需要的所有東西。

本文通過 main() 方法來用 mybatis 執(zhí)行帶參數(shù)的 SQL 命令,來介紹 mybatis 執(zhí)行 SQL 的大致過程。

準(zhǔn)備數(shù)據(jù)庫

準(zhǔn)備一個 MySQL 數(shù)據(jù)庫,十分鐘內(nèi)快速運(yùn)行起一個 MySQL 的方法可以看這篇文章。

數(shù)據(jù)庫內(nèi)創(chuàng)建一張很簡單的表:

create database test;
use test;
create table t1(int id);
insert into t1 set id=11;
創(chuàng)建項(xiàng)目

首先創(chuàng)建一個空的 Maven 項(xiàng)目,加上下面的依賴關(guān)系:


  
  
    org.mybatis
    mybatis
    3.5.0
  
  
  
    org.apache.commons
    commons-dbcp2
    2.5.0
  
  
  
    mysql
    mysql-connector-java
    8.0.15
  
  
  
    ch.qos.logback
    logback-classic
    1.2.3
  
創(chuàng)建 main() 方法

在項(xiàng)目中隨便創(chuàng)建一個類,寫一個空的 main() 方法,確認(rèn)這個方法可以正常運(yùn)行。

接下來我們在 main() 方法中,一步一步完成這個使用 mybatis 執(zhí)行 SQL 命令的例子。

1. 初始化數(shù)據(jù)源

要連接數(shù)據(jù)庫,自然要先準(zhǔn)備好數(shù)據(jù)源對象,這里就不多做解釋了:

String url = "jdbc:mysql://localhost/test?serverTimezone=UTC";
String username = "root";
String password = "root123";

org.apache.commons.dbcp2.BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);

dataSource 變量就是準(zhǔn)備好的數(shù)據(jù)源對象。

2. 定義要執(zhí)行的 SQL 命令
SqlCommandType commandType = SqlCommandType.SELECT;
String commandId = "sql1";
String commandStatement = "select * from t1 where id=#{id}";

String parameterName = "id";
Class parameterType = Integer.class;
Object parameterValue = 11;

Class resultType = HashMap.class;
List resultPropertyMappings = Collections.emptyList();

這個定義分為三部分:

一是命令本身,包括命令的類型、ID、語句。在 mybatis 中,每條 SQL 命令都有唯一的 ID,因?yàn)樵?SqlSession 里面,執(zhí)行哪條 SQL 命令就是通過 ID 來指定的。

二是參數(shù),包括參數(shù)的名稱、類型、參數(shù)值。這個例子中只有一個參數(shù),參數(shù)名稱 id 和語句里面的 #{id} 名稱必須保持一致。

三是返回值的類型。返回值的類型包括兩部分,一是返回結(jié)果本身的類型,二是返回結(jié)果的每個字段各是什么類型(用于轉(zhuǎn)換)。這個例子當(dāng)中,我們簡單的將返回結(jié)果包裝為 Map 對象,所以里面的字段值就不去指定類型轉(zhuǎn)換了,即 resultPropertyMappings 變量是個空的 List。

上面這 8 個變量,會在組裝 mybatis 的 SQL 命令過程中用到。

3. 初始化 mybatis 配置

mybatis 的所有配置都在 org.apache.ibatis.session.Configuration 對象當(dāng)中。Configuration 對象是一個很復(fù)雜的對象,涵蓋了執(zhí)行 SQL 命令需要的所有東西。正常使用的情況下,我們要為它配置 XML 路徑、Mapper 所在的包、查詢結(jié)果的類型轉(zhuǎn)換等等。在本文的例子當(dāng)中,我們用不到 XML,所以只做最簡單的配置:

JdbcTransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("default", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);

可以看出,dataSource 變量是先放入 Environment 對象,然后再放入 Configuration 對象的。到這里,mybatis 的數(shù)據(jù)源就配置好了。接下來我們將之前定義的 SQL 命令加入 mybatis。

4. 構(gòu)建 MappedStatement

mybatis 當(dāng)中所有的 SQL 命令最終都是一個 MappedStatement 對象。但要構(gòu)建它可不簡單,我們要把前面定義的 SQL 命令三部分分別構(gòu)建相應(yīng)的對象,然后再組裝成 MappedStatement 對象。

// 1. 構(gòu)建 SqlSource 對象
SqlSource sqlSource = new SqlSourceBuilder(
    configuration
).parse(
    commandStatement, parameterType, null
);

// 2. 構(gòu)建 ResultMap 對象
String resultMapId = commandId + "-Inline";
ResultMap resultMap = new ResultMap.Builder(
    configuration, resultMapId, resultType, resultPropertyMappings, null
).build();

// 3. 構(gòu)建 ParameterMap 對象
ParameterMap parameterMap = new ParameterMap.Builder(
    configuration, commandId, null,
    Collections.singletonList(
        new ParameterMapping.Builder(
            configuration, parameterName, Integer.class
        ).build()
    )
).build();

// 4. 將 SqlSource 對象、 ResultMap 對象和 ParameterMap 對象
//    組合成最終的 MappedStatement 對象
MappedStatement mappedStatement = new MappedStatement.Builder(
    configuration, commandId, sqlSource, commandType
).resultMaps(
    Collections.singletonList(resultMap)
).parameterMap(
    parameterMap
).build();

看得出,因?yàn)闃?gòu)建起來很復(fù)雜,所以 mybatis 定義了大量 Builder 類來用。

5. 將 MappedStatement 加入 mybatis
configuration.addMappedStatement(mappedStatement);

所有的 MappedStatement 都要放入 Configuration

6. 初始化 SqlSession 并執(zhí)行 SQL 命令

這一步相信熟悉 mybatis 的同學(xué)都會用,就不多解釋了。

SqlSessionFactory sqlSessionFactory = new DefaultSqlSessionFactory(configuration);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
List result = sqlSession.selectList(commandId, parameterValue);

System.out.println(result);

上面這六個片段依次加入 main() 方法,即可完整執(zhí)行。這就是 mybatis 執(zhí)行 SQL 命令的基本套路。

有的同學(xué)就會問,那我在 XML 里面定義的 SQL 語句是怎么解析執(zhí)行的呢?mybatis 有個叫 org.apache.ibatis.scripting.LanguageDriver 的接口類,負(fù)責(zé)將 XML 或其他語言的動態(tài) SQL 模板解析為最終的 SQL 語句,然后交給 SqlSourceBuilder 生成 SqlSource 對象。具體可以看看源碼。相信理解了本文之后再去看 mybatis 的源碼,會對它的執(zhí)行機(jī)制有更清晰的了解。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/73955.html

相關(guān)文章

  • Mybatis系列】從源碼角度理解Mybatis$和#作用

    摘要:原因就是傳入的和原有的單引號,正好組成了,而后面恒等于,所以等于對這個庫執(zhí)行了查所有的操作。類比的執(zhí)行流程和原有的我們使用的方法就是。可以理解為就是用來解析定制的符號的語句。后續(xù)的流程,就和正常的流程一致了。 前言 在JDBC中,主要使用的是兩種語句,一種是支持參數(shù)化和預(yù)編譯的PrepareStatement,能夠支持原生的Sql,也支持設(shè)置占位符的方式,參數(shù)化輸入的參數(shù),防止Sql注...

    yanwei 評論0 收藏0
  • MyBatis Generator:Mybatis代碼生成器

    摘要:一的官方資料官方文檔源碼二介紹大致的意思是可以幫助所有版本的和以上版本的生成代碼。其中目前最新的版本可以使用。指定生成一系列對象的環(huán)境。定義了生成的注釋形式。與生成的實(shí)體相關(guān)。生成接口和類以達(dá)到輕易使用生成的模型和映射文件的目的。 一:MyBatis Generator的官方資料 MyBatis Generator官方文檔github源碼:MyBatis Generator (MBG)...

    SimonMa 評論0 收藏0
  • 教你手寫Mybatis框架

    摘要:前言嗨,小伙伴們,這篇博文將帶大家手寫,讓大家對的核心原理以及工作流程有更加深刻的理解。模塊顧名思義,就是框架配置類,用于解析配置文件加載相關(guān)環(huán)境。配置模塊這里的對框架的配置使用了簡單的,主要原因還是簡單易懂然后節(jié)省時間。 前言 (????)??嗨,小伙伴們,這篇博文將帶大家手寫mybatis,讓大家對mybaits的核心原理以及工作流程有更加深刻的理解。在上篇Spring-Mybat...

    antyiwei 評論0 收藏0
  • MyBatis-Plus初步

    摘要:是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在應(yīng)用方面,是最好的,關(guān)系數(shù)據(jù)庫管理系統(tǒng)應(yīng)用軟件。是一種關(guān)系數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。 本章主要是對MyBatis-Plus的初步介紹,包括一些背景知識、環(huán)境搭建、初步使用等知識和例子。對于背景知識,主要包含對MyBatis-Plus的特性介紹、為什么使用MyB...

    娣辯孩 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<