成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Mybatis是如何工作的(一)

shiina / 2486人閱讀

摘要:本文目標(biāo)使用純框架獲取數(shù)據(jù)理清的工作過程。創(chuàng)建項目并運行首先創(chuàng)建項目,過程不再贅述。做的事情主要有三步從配置文件中生成從中獲取獲取對應(yīng)的,執(zhí)行。小結(jié)本文主要介紹了如何使用純操作數(shù)據(jù)庫,然后介紹了加載配置的過程。

本文目標(biāo):

使用純Mybatis框架獲取數(shù)據(jù);

理清Mybatis的工作過程。

創(chuàng)建項目并運行

首先創(chuàng)建maven項目,過程不再贅述。依賴如下:


    
      org.mybatis
      mybatis
      3.4.6
    
    
      mysql
      mysql-connector-java
      5.1.46
    
  

下面準(zhǔn)備一張表:

CREATE TABLE `clips` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT "主鍵",
  `content` varchar(256) NOT NULL DEFAULT "" COMMENT "內(nèi)容",
  `deleted` tinyint(1) NOT NULL DEFAULT "0" COMMENT "刪除標(biāo)識:0正常,1刪除",
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "創(chuàng)建時間",
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新時間",
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="clips";

添加一條數(shù)據(jù):

對應(yīng)的實體類:

public class ClipsEntity {
    private Integer id;
    private String content;
    private Integer deleted;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    
    // 省略getter和setter
}

DAO:

public interface ClipsDAO {
    ClipsEntity selectById(@Param("id") Integer id);
}

mapper文件:





  

Mybatis配置文件:




  
    
    
    
    
    
    
    
    
  
  
    
  
  
    
      
      
        
        
        
        
      
    
  
  
    
  

下面寫個測試:

public class Main {

    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        try {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession session = factory.openSession();
            ClipsDAO clipsDAO = session.getMapper(ClipsDAO.class);
            ClipsEntity clipsEntity = clipsDAO.selectById(1);
            System.out.println(clipsEntity);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

運行結(jié)果:

運行成功。
那么,在這個過程中,程序具體做了什么事呢?一步一步來看。
首先,我們用配置文件生成了一個InputStream;然后用InputStream生成了生成SqlSessionFactory;然后獲取Session;獲取對應(yīng)的mapper,執(zhí)行SQL獲取結(jié)果。Mybatis做的事情主要有三步:

從配置文件中生成SqlSessionFactory;

從SqlSessionFactory中獲取session;

獲取對應(yīng)的mapper,執(zhí)行SQL。

下面逐步看源碼。

加載mybatis配置,生成SqlSessionFactory
  // 首先調(diào)用的是這個方法:
  public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }
  // 然后是這個:
    public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
    // 根據(jù)參數(shù)獲取一個XMLConfigBuilder,這部分是重點
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }
  
  // 返回的build方法如下,可以看出實現(xiàn)是DefaultSqlSessionFactory
  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

注釋部分已經(jīng)很清楚了,下面重點看下XMLConfigBuilder,Mybatis通過這個類來解析mybatis對應(yīng)的配置。

  // 解析configuration節(jié)點下面的子節(jié)點,并返回最終的配置。
  public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

  private void parseConfiguration(XNode root) {
    try {
      //issue #117 read properties first
      // 加載properties節(jié)點下的屬性,
      propertiesElement(root.evalNode("properties"));
      // 加載settings節(jié)點下的屬性
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfs(settings);
      // 加載別名配置
      typeAliasesElement(root.evalNode("typeAliases"));
      // 加載插件配置
      pluginElement(root.evalNode("plugins"));
      // 加載objectFactory配置
      objectFactoryElement(root.evalNode("objectFactory"));
      // 加載objectWrapperFactory配置
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      // 加載reflectorFactory配置
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);
      // read it after objectFactory and objectWrapperFactory issue #631
      // 加載environment配置,這里會配置事務(wù)管理器
      environmentsElement(root.evalNode("environments"));
      // 加載databaseIdProvider配置
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      // 加載typeHandler是配置,自定義的typeHandler會在這注冊
      typeHandlerElement(root.evalNode("typeHandlers"));
      // 加載mapper配置
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }
  

至此,mybatis配置加載完成。

小結(jié)

本文主要介紹了如何使用純Mybatis操作數(shù)據(jù)庫,然后介紹了Mybatis加載配置的過程。內(nèi)容相對粗淺,深入分析在下文。

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

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

相關(guān)文章

  • 面試官都會問Mybatis面試題,你會這樣回答嗎?

    摘要:最終能和面試官聊的開心愉快投緣的叫面霸。能夠與很好的集成提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的字段關(guān)系映射提供對象關(guān)系映射標(biāo)簽,支持對象關(guān)系組件維護(hù)。使用可以有效的防止注入,提高系統(tǒng)安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面試,難還是不難?取決于面試者的底蘊(氣場+技能)、心態(tài)和認(rèn)知及溝通技巧。...

    seanHai 評論0 收藏0
  • Mybatis常見面試題

    摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個對象,每個對象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進(jìn)來的參數(shù)數(shù)據(jù) ${}對傳遞進(jìn)來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...

    liuchengxu 評論0 收藏0
  • 手撕面試官系列(二):開源框架面試題Spring+SpringMVC+MyBatis

    摘要:跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準(zhǔn)備充分,到底是因為技術(shù)原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準(zhǔn)備充分),到底是因為技...

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

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

    antyiwei 評論0 收藏0
  • Java深入-框架技巧

    摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現(xiàn)在軟件開發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當(dāng)初愛情萌芽的模樣…… Java 進(jìn)階面試問題列表 -...

    chengtao1633 評論0 收藏0

發(fā)表評論

0條評論

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