Java 資料庫連線的那些事

一隻小夥伴發表於2018-07-27

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

目錄結構:

Java 資料庫連線的那些事

Controller:

Java 資料庫連線的那些事

Mapper:

Java 資料庫連線的那些事

User-Model:

Java 資料庫連線的那些事

User-SqlString

Java 資料庫連線的那些事

application.properties:

Java 資料庫連線的那些事

寫在最後

以上內容大部分為個人理解,總體上是想以一種說的過去的概念模型來描述jdbc和mybatis的原理,經過程式碼實踐感覺還算合理,但不能保證完全正確,如有錯誤希望大家能夠指正

參考資料

  1. MySQL中例項,資料庫關係簡介
  2. MySql資料庫連線池專題
  3. jdbc原始碼詳解(二):獲取connection
  4. MySQL AutoCommit帶來的問題
  5. jdbc百度百科
  6. mybatis3官方文件

相關文章