MySQL
區域性工作流程:
之所以說區域性,是因為還沒有全部弄通MySQL的工作流程_(:з」∠)_,此部分理解主要來源於 參考資料1
客戶端與MySQL進行連線的時候,雙方溝通的橋樑是connection,是一個物理概念,建立,銷燬connection需要消耗資源,並且其本身也佔用資源,所以不宜隨意建立與銷燬
客戶端與MySQL真正進行溝通是會發起一次次的會話,稱為session,每次會話包含一個或多個事務,會話是建立在connection的基礎上的
JDBC
基本介紹(摘錄自百度百科):
JDBC(Java DataBase Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關聯式資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC提供了一種基準,據此可以構建更高階的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式
JDBC 是個"低階"介面,也就是說,它用於直接呼叫 SQL 命令。在這方面它的功能極佳,並比其它的資料庫連線 API 易於使用,但它同時也被設計為一種基礎介面,在它之上可以建立高階介面和工具。高階介面是"對使用者友好的"介面,它使用的是一種更易理解和更為方便的 API,這種API在幕後被轉換為諸如 JDBC 這樣的低階介面。
在關聯式資料庫的"物件/關係"對映中,表中的每行對應於類的一個例項,而每列的值對應於該例項的一個屬性。於是,程式設計師可直接對 Java 物件進行操作;存取資料所需的 SQL 呼叫將在"掩蓋下"自動生成
通過JDBC可以建立與資料庫的connection,在此基礎上,我們可以將想要執行的SQL語句放入會話中,獲取想要的資料後,將資料對映到我們提前寫好的java物件中,進行下一步處理,並釋放connection
JDBC使用過程中一些基本名詞概念(個人理解):
1.connection:
在進行資料庫操作之前,需要與資料庫進行連線,此時我們用url,username,password等引數,獲取一個可以執行sql操作的connection,對應上文中MySQL的connection
2.statement:
statement是通過connection物件的createStatement方法建立的,用於傳送SQL語句
3.事務
因為JDBC預設把auto-commit開啟了,所以每個statement都是一個事務 關閉auto-commit時, 一個connection接下來執行的statement都是一個處於事務中,直到執行connection.commit(),事務才會關閉 事務結束後,我們還應當重新開啟auto-commit,如果不開啟,此connection被其他執行緒重複利用時,執行緒中的所有操作還是會變成一整個事務,而我們往往只在需要的時候進行事務操作,大多數時候下都是一條SQL一次事務
4.close
connection.close與statement.close()釋放資源,connection針對的是資料庫資源,而statement是資料表資源
連線池:
MySQL簡介中有說到,connection的建立也需要消耗資源,因此,用完即close的方式也不是很好的選擇,用一種合理的方式管理已經建立的連線,在保證執行緒安全(同時刻只有一個執行緒持有某個connection)的前提下,重複利用connection,現在已經有很多現成的執行緒池的庫,大體上的原理還是很容易理解的,有興趣可以瞭解一下
Mybatis(對jdbc的封裝)
配置檔案:
// src/main/resources/mybatis/mybatis.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> // environments標籤,用於存放不同的生存環境的配置,default屬性是在不指定環境的情況下預設使用id為“development”的環境配置 <environment id="development"> “development”環境下的配置 <transactionManager type="JDBC"/> // 事務管理器 <dataSource type="POOLED"> <property name="driver" value="${driver}"/>//用${}會讀取application.yml/application.property下對應的配置 <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> >可以用resource來讀取xml裡的sql語句對映,也可以用class讀取java的interface寫的sql語句對映 </mappers> </configuration> 複製程式碼
那麼問題來了,這個配置檔案是給誰用,怎麼用的呢?請看下面名詞解釋裡的1.SqlSeessionFactoryBuilder
名詞解釋:
1.SqlSeessionFactoryBuilder
SqlSessionFactoryBuilder顧名思義,是用來建造SqlSessionFactory的,在建造SqlSessionFactory的時候,我們要指定與哪個地址的哪個資料庫,用哪個使用者身份來進行連線,因此,上文中的配置檔案是在建造SqlSessionFactory時使用的
private static SqlSessionFactory getFactory() throws IOException { String resource = "mybatis/mybatis.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream,"development"); } 複製程式碼
可以用如上程式碼生成一個SqlSessionFactory,使用時我們指定了環境為“development”
2.SqlSessionFactory
有了Factory,我們就可以建造SqlSession了
public static SqlSession makeSqlSession() throws IOException{ return getFactory().openSession(true); } 複製程式碼
通過openSession()可以獲得SqlSession,並且可以新增一些引數來獲取不同的SqlSession,例如示例程式碼中的true,是用來改變sqlsession的auto-commit屬性的
3.SqlSession
SqlSession們之前說過,它與jdbc的connection很像,使用時可以這樣使用:
public Person getUser () throws Exception{ SqlSession sql = MySqlFactory.makeSqlSession(); Person p = new Person(); try { PersonMapper personMapper=sql.getMapper(PersonMapper.class);//PersonMapper在之前的配置檔案中註冊過方可使用,否則找不到,這很正常,你不提前告訴我在哪裡,現在想用了我去哪給你找 Person person=personMapper.getPersonById(1);//getPersonById有兩種寫法,可以用interface還可以用xml對映 //Person person = sql.selectOne("com.example.demo.mapper.PersonMapper.getPersonById" ,1); p=person; // p.id:1,p.name:小夥伴 System.out.println(p.getName()); // 小夥伴 }finally { sql.close(); } return p; } 複製程式碼
mybatis-spring-boot DEMO
mybatis有官方的spring包和spring-boot包,可以讓我們不用手動建立和銷燬SqlSession,也不用每寫一個mapper對映檔案就要改動配置檔案,可以用簡易的註解代替,使程式碼更加簡潔,讓我們可以專注於業務程式碼
示例demo
mybatis包版本:mybatis-spring-boot-starter 1.3.2目錄結構:
Controller:
Mapper:
User-Model:
User-SqlString
application.properties:
寫在最後
以上內容大部分為個人理解,總體上是想以一種說的過去的概念模型來描述jdbc和mybatis的原理,經過程式碼實踐感覺還算合理,但不能保證完全正確,如有錯誤希望大家能夠指正