摘要:本文目標(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
摘要:最終能和面試官聊的開心愉快投緣的叫面霸。能夠與很好的集成提供映射標(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)知及溝通技巧。...
摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個對象,每個對象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進(jìn)來的參數(shù)數(shù)據(jù) ${}對傳遞進(jìn)來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...
摘要:跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準(zhǔn)備充分,到底是因為技術(shù)原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準(zhǔn)備充分),到底是因為技...
摘要:前言嗨,小伙伴們,這篇博文將帶大家手寫,讓大家對的核心原理以及工作流程有更加深刻的理解。模塊顧名思義,就是框架配置類,用于解析配置文件加載相關(guān)環(huán)境。配置模塊這里的對框架的配置使用了簡單的,主要原因還是簡單易懂然后節(jié)省時間。 前言 (????)??嗨,小伙伴們,這篇博文將帶大家手寫mybatis,讓大家對mybaits的核心原理以及工作流程有更加深刻的理解。在上篇Spring-Mybat...
摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現(xiàn)在軟件開發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當(dāng)初愛情萌芽的模樣…… Java 進(jìn)階面試問題列表 -...
閱讀 1471·2021-09-30 09:57
閱讀 1480·2021-09-09 09:33
閱讀 2246·2021-09-04 16:40
閱讀 1811·2021-09-01 10:50
閱讀 3257·2021-09-01 10:31
閱讀 2549·2019-08-30 15:56
閱讀 2980·2019-08-30 15:44
閱讀 3484·2019-08-29 17:29