国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Mybatis是如何工作的(一)

shiina / 2478人閱讀

摘要:本文目標使用純框架獲取數據理清的工作過程。創建項目并運行首先創建項目,過程不再贅述。做的事情主要有三步從配置文件中生成從中獲取獲取對應的,執行。小結本文主要介紹了如何使用純操作數據庫,然后介紹了加載配置的過程。

本文目標:

使用純Mybatis框架獲取數據;

理清Mybatis的工作過程。

創建項目并運行

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


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

下面準備一張表:

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

添加一條數據:

對應的實體類:

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);
        }
    }
}

運行結果:

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

從配置文件中生成SqlSessionFactory;

從SqlSessionFactory中獲取session;

獲取對應的mapper,執行SQL。

下面逐步看源碼。

加載mybatis配置,生成SqlSessionFactory
  // 首先調用的是這個方法:
  public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }
  // 然后是這個:
    public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
    // 根據參數獲取一個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方法如下,可以看出實現是DefaultSqlSessionFactory
  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

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

  // 解析configuration節點下面的子節點,并返回最終的配置。
  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節點下的屬性,
      propertiesElement(root.evalNode("properties"));
      // 加載settings節點下的屬性
      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配置,這里會配置事務管理器
      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配置加載完成。

小結

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72905.html

相關文章

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

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

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

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

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

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

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

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

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

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

    chengtao1633 評論0 收藏0

發表評論

0條評論

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