2. JDBC介紹(了解)
2.1 介紹
通過Mybatis的快速入門,我們明白了,通過Mybatis可以很方便的進(jìn)行數(shù)據(jù)庫的訪問操作。但是大家要明白,其實(shí)java語言操作數(shù)據(jù)庫呢,只能通過一種方式:使用sun公司提供的 JDBC 規(guī)范。
Mybatis框架,就是對原始的JDBC程序的封裝。
那到底什么是JDBC呢,接下來,我們就來介紹一下。
JDBC: ( Java DataBase Connectivity ),就是使用Java語言操作關(guān)系型數(shù)據(jù)庫的一套API。
本質(zhì):
sun公司官方定義的一套操作所有關(guān)系型數(shù)據(jù)庫的規(guī)范,即接口。
各個(gè)數(shù)據(jù)庫廠商去實(shí)現(xiàn)這套接口,提供數(shù)據(jù)庫驅(qū)動jar包。
我們可以使用這套接口(JDBC)編程,真正執(zhí)行的代碼是驅(qū)動jar包中的實(shí)現(xiàn)類。
2.2 代碼
下面我們看看原始的JDBC程序是如何操作數(shù)據(jù)庫的。操作步驟如下:
- 注冊驅(qū)動
- 獲取連接對象
- 執(zhí)行SQL語句,返回執(zhí)行結(jié)果
- 處理執(zhí)行結(jié)果
- 釋放資源
在pom.xml文件中已引入MySQL驅(qū)動依賴,我們直接編寫JDBC代碼即可
JDBC具體代碼實(shí)現(xiàn):
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JdbcTest {
@Test
public void testJdbc() throws Exception {
//1. 注冊驅(qū)動
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 獲取數(shù)據(jù)庫連接
String url="jdbc:mysql://127.0.0.1:3306/mybatis";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 執(zhí)行SQL
Statement statement = connection.createStatement(); //操作SQL的對象
String sql="select id,name,age,gender,phone from user";
ResultSet rs = statement.executeQuery(sql);//SQL查詢結(jié)果會封裝在ResultSet對象中
List<User> userList = new ArrayList<>();//集合對象(用于存儲User對象)
//4. 處理SQL執(zhí)行結(jié)果
while (rs.next()){
//取出一行記錄中id、name、age、gender、phone下的數(shù)據(jù)
int id = rs.getInt("id");
String name = rs.getString("name");
short age = rs.getShort("age");
short gender = rs.getShort("gender");
String phone = rs.getString("phone");
//把一行記錄中的數(shù)據(jù),封裝到User對象中
User user = new User(id,name,age,gender,phone);
userList.add(user);//User對象添加到集合
}
//5. 釋放資源
statement.close();
connection.close();
rs.close();
//遍歷集合
for (User user : userList) {
System.out.println(user);
}
}
}
DriverManager(類):數(shù)據(jù)庫驅(qū)動管理類。
作用:
注冊驅(qū)動
創(chuàng)建java代碼和數(shù)據(jù)庫之間的連接,即獲取Connection對象
Connection(接口):建立數(shù)據(jù)庫連接的對象
- 作用:用于建立java程序和數(shù)據(jù)庫之間的連接
Statement(接口): 數(shù)據(jù)庫操作對象(執(zhí)行SQL語句的對象)。
- 作用:用于向數(shù)據(jù)庫發(fā)送sql語句
ResultSet(接口):結(jié)果集對象(一張?zhí)摂M表)
- 作用:sql查詢語句的執(zhí)行結(jié)果會封裝在ResultSet中
通過上述代碼,我們看到直接基于JDBC程序來操作數(shù)據(jù)庫,代碼實(shí)現(xiàn)非常繁瑣,所以在項(xiàng)目開發(fā)中,我們很少使用。 在項(xiàng)目開發(fā)中,通常會使用Mybatis這類的高級技術(shù)來操作數(shù)據(jù)庫,從而簡化數(shù)據(jù)庫操作、提高開發(fā)效率。
2.3 問題分析
原始的JDBC程序,存在以下幾點(diǎn)問題:
- 數(shù)據(jù)庫鏈接的四要素(驅(qū)動、鏈接、用戶名、密碼)全部硬編碼在java代碼中
- 查詢結(jié)果的解析及封裝非常繁瑣
- 每一次查詢數(shù)據(jù)庫都需要獲取連接,操作完畢后釋放連接, 資源浪費(fèi), 性能降低
2.4 技術(shù)對比
分析了JDBC的缺點(diǎn)之后,我們再來看一下在mybatis中,是如何解決這些問題的:
-
數(shù)據(jù)庫連接四要素(驅(qū)動、鏈接、用戶名、密碼),都配置在springboot默認(rèn)的配置文件 application.properties中
-
查詢結(jié)果的解析及封裝,由mybatis自動完成映射封裝,我們無需關(guān)注
-
在mybatis中使用了數(shù)據(jù)庫連接池技術(shù),從而避免了頻繁的創(chuàng)建連接、銷毀連接而帶來的資源浪費(fèi)。
使用SpringBoot+Mybatis的方式操作數(shù)據(jù)庫,能夠提升開發(fā)效率、降低資源浪費(fèi)
而對于Mybatis來說,我們在開發(fā)持久層程序操作數(shù)據(jù)庫時(shí),需要重點(diǎn)關(guān)注以下兩個(gè)方面:
-
application.properties
#驅(qū)動類名稱 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #數(shù)據(jù)庫連接的url spring.datasource.url=jdbc:mysql://localhost:3306/mybatis #連接數(shù)據(jù)庫的用戶名 spring.datasource.username=root #連接數(shù)據(jù)庫的密碼 spring.datasource.password=1234
-
Mapper接口(編寫SQL語句)
@Mapper public interface UserMapper { @Select("select id, name, age, gender, phone from user") public List<User> list(); }
3. 數(shù)據(jù)庫連接池
在前面我們所講解的mybatis中,使用了數(shù)據(jù)庫連接池技術(shù),避免頻繁的創(chuàng)建連接、銷毀連接而帶來的資源浪費(fèi)。
下面我們就具體的了解下數(shù)據(jù)庫連接池。
3.1 介紹
沒有使用數(shù)據(jù)庫連接池:
- 客戶端執(zhí)行SQL語句:要先創(chuàng)建一個(gè)新的連接對象,然后執(zhí)行SQL語句,SQL語句執(zhí)行后又需要關(guān)閉連接對象從而釋放資源,每次執(zhí)行SQL時(shí)都需要創(chuàng)建連接、銷毀鏈接,這種頻繁的重復(fù)創(chuàng)建銷毀的過程是比較耗費(fèi)計(jì)算機(jī)的性能。
數(shù)據(jù)庫連接池是個(gè)容器,負(fù)責(zé)分配、管理數(shù)據(jù)庫連接(Connection)
- 程序在啟動時(shí),會在數(shù)據(jù)庫連接池(容器)中,創(chuàng)建一定數(shù)量的Connection對象
允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè)
- 客戶端在執(zhí)行SQL時(shí),先從連接池中獲取一個(gè)Connection對象,然后在執(zhí)行SQL語句,SQL語句執(zhí)行完之后,釋放Connection時(shí)就會把Connection對象歸還給連接池(Connection對象可以復(fù)用)
釋放空閑時(shí)間超過最大空閑時(shí)間的連接,來避免因?yàn)闆]有釋放連接而引起的數(shù)據(jù)庫連接遺漏
- 客戶端獲取到Connection對象了,但是Connection對象并沒有去訪問數(shù)據(jù)庫(處于空閑),數(shù)據(jù)庫連接池發(fā)現(xiàn)Connection對象的空閑時(shí)間 > 連接池中預(yù)設(shè)的最大空閑時(shí)間,此時(shí)數(shù)據(jù)庫連接池就會自動釋放掉這個(gè)連接對象
數(shù)據(jù)庫連接池的好處:
- 資源重用
- 提升系統(tǒng)響應(yīng)速度
- 避免數(shù)據(jù)庫連接遺漏
3.2 產(chǎn)品
要怎么樣實(shí)現(xiàn)數(shù)據(jù)庫連接池呢?
-
官方(sun)提供了數(shù)據(jù)庫連接池標(biāo)準(zhǔn)(javax.sql.DataSource接口)
-
功能:獲取連接
public Connection getConnection() throws SQLException;
-
第三方組織必須按照DataSource接口實(shí)現(xiàn)
-
常見的數(shù)據(jù)庫連接池:
- C3P0
- DBCP
- Druid
- Hikari (springboot默認(rèn))
現(xiàn)在使用更多的是:Hikari、Druid (性能更優(yōu)越)
- Hikari(追光者) [默認(rèn)的連接池]
-
Druid(德魯伊)
-
Druid連接池是阿里巴巴開源的數(shù)據(jù)庫連接池項(xiàng)目
-
功能強(qiáng)大,性能優(yōu)秀,是Java語言最好的數(shù)據(jù)庫連接池之一
-
?
如果我們想把默認(rèn)的數(shù)據(jù)庫連接池切換為Druid數(shù)據(jù)庫連接池,只需要完成以下兩步操作即可:
參考官方地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
- 在pom.xml文件中引入依賴
<dependency>
<!-- Druid連接池依賴 -->
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
- 在application.properties中引入數(shù)據(jù)庫連接配置
方式1:
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.druid.username=root
spring.datasource.druid.password=1234
方式2:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234
4. lombok
4.1 介紹
Lombok是一個(gè)實(shí)用的Java類庫,可以通過簡單的注解來簡化和消除一些必須有但顯得很臃腫的Java代碼。
通過注解的形式自動生成構(gòu)造器、getter/setter、equals、hashcode、toString等方法,并可以自動化生成日志變量,簡化java開發(fā)、提高效率。
注解 | 作用 |
---|---|
@Getter/@Setter | 為所有的屬性提供get/set方法 |
@ToString | 會給類自動生成易閱讀的 toString 方法 |
@EqualsAndHashCode | 根據(jù)類所擁有的非靜態(tài)字段自動重寫 equals 方法和 hashCode 方法 |
@Data | 提供了更綜合的生成代碼功能(@Getter + @Setter + @ToString + @EqualsAndHashCode) |
@NoArgsConstructor | 為實(shí)體類生成無參的構(gòu)造器方法 |
@AllArgsConstructor | 為實(shí)體類生成除了static修飾的字段之外帶有各參數(shù)的構(gòu)造器方法。 |
4.2 使用
第1步:在pom.xml文件中引入依賴
<!-- 在springboot的父工程中,已經(jīng)集成了lombok并指定了版本號,故當(dāng)前引入依賴時(shí)不需要指定version -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
第2步:在實(shí)體類上添加注解
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
在實(shí)體類上添加了@Data注解,那么這個(gè)類在編譯時(shí)期,就會生成getter/setter、equals、hashcode、toString等方法。
說明:@Data注解中不包含全參構(gòu)造方法,通常在實(shí)體類上,還會添加上:全參構(gòu)造、無參構(gòu)造
import lombok.Data;
@Data //getter方法、setter方法、toString方法、hashCode方法、equals方法
@NoArgsConstructor //無參構(gòu)造
@AllArgsConstructor//全參構(gòu)造
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
Lombok的注意事項(xiàng):文章來源:http://www.zghlxwxcb.cn/news/detail-794183.html
- Lombok會在編譯時(shí),會自動生成對應(yīng)的java代碼
- 在使用lombok時(shí),還需要安裝一個(gè)lombok的插件(新版本的IDEA中自帶)
文章來源地址http://www.zghlxwxcb.cn/news/detail-794183.html
到了這里,關(guān)于【JaveWeb教程】(25) JDBC、數(shù)據(jù)庫連接池、Lombok 詳細(xì)代碼示例講解(最全面)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!