SpringBoot_資料庫連線

IMchg發表於2020-12-25

看java連線資料庫的發展過程:
1.JDBC直連;
2.資料庫連線池;
3.QueryRunner;
4.JPA框架:MyBatis、Hibernate、Spring data jpa;
5.通用Mapper;

Java資料庫操作系列入門教程:JDBC基本使用、DBCP基本使用、Hibernate/Spring data jpa/MyBatis基本使用

https://blog.csdn.net/fightingXia/article/details/80715281
檢視連線的數量:
https://www.cnblogs.com/liuyuhangCastle/p/9595458.html

概念:
資料來源:datasource的概念、不同連線池對應的datasource類

https://blog.csdn.net/fightingXia/article/details/82555999

連線池:使用資料庫連線池的好處、直接用DriverManager獲取連線的壞處

https://blog.csdn.net/caidie_huang/article/details/52639567

一 使用JDBC連線資料庫

JAVA連線資料庫最基本的方式:直接用JDBC連線,過程包括:註冊驅動、獲取連線、建立statement、執行sql、獲取返回結果集

https://blog.csdn.net/qq_38449518/article/details/80501246

# 一 匯入maven依賴:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.11</version>
</dependency>
# 二 修改預設配置
無
# 三 建立實體類
public class User {
    private Long id;
    private String userNaame;

	// getter、setter略
}
# 四 Controller、Service、DAO
1.Controller
@Controller
public class MyController {
    @Autowired
    private MyService myService;

    @GetMapping("test/{id}")
    @ResponseBody
    public String queryNameById(@PathVariable Long id){
        try {
            return this.myService.queryNameById(id);
        } catch (Exception e) {
            e.printStackTrace();
            return "訪問錯誤";
        }
    }
}
2.Service
@Service
public class MyService {
    @Autowired
    private MyDAO myDAO;

    public String queryNameById(Long id) throws SQLException, ClassNotFoundException {
        return this.myDAO.queryNameById(id);
    }
}

3.DAO
@Repository
public class MyDAO {
    public String queryNameById(Long id) throws SQLException, ClassNotFoundException {
        String driver = "com.mysql.cj.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/newdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";
        String username="root";
        String password="123456";
        Class.forName(driver);
        Connection connection= DriverManager.getConnection(url,username,password);
        if(!connection.isClosed())
            System.out.println("connection success");
        Statement statement=connection.createStatement();
        String sql="SELECT username FROM user WHERE id="+id;
        ResultSet resultSet=statement.executeQuery(sql);
        String name=null;
        while(resultSet.next()){
            name=resultSet.getString("username");
        }
        resultSet.close();
        statement.close();
        connection.close();
        return name;
    }
}

二 使用資料庫連線池

使用資料庫連線池,過程還是和上面直接使用jdbc一樣,仍然需要獲取連線、建立statement、執行sql、獲取返回結果集,區別在於,這裡不是直接由DriverManager建立資料庫連線,而是從連線池中獲取連線,具體的連線建立和排程 由連線池控制。

連線池的使用方式:連線池建立後如何使用?還是用於獲取connection
https://www.cnblogs.com/diandianquanquan/p/10607021.html
使用連線池仍要手動關閉connection:
https://blog.csdn.net/zhangzeyuaaa/article/details/85019872

補充知識:
springboot中如何獲取properties中的配置資訊?

2.1 SpringBoot啟動器自動配置Hikari

由啟動器自動建立HikariDatasource物件注入Spring容器,並自動使用配置。

注意:springboot中啟動器的作用是建立業務情景下通用的Bean物件並註冊到Spring容器。jdbc starter會自動建立hikari資料來源,所以不需要也不能夠再手動註冊HikariDatasource,否則會報錯。只需要修改HikariDatasource的預設配置即可,而且springboot是自動讀取配置檔案的。

自動配置過程:
https://blog.csdn.net/u013089490/article/details/83584716
Hikari配置引數說明:
https://blog.csdn.net/lizhiqiang1217/article/details/90573759

# 一 匯入maven依賴:
SpringBoot2.0以後預設使用Hikari連線池,jdbc啟動器中包含了HikariDatasource的建立
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.11</version>
</dependency>
# 二 修改預設配置
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/newdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 123456
    hikari:
      minimum-idle: 5
      ...
# 三 建立實體類 同上
# 四 Controller、Service、DAO
1.Controller 同上
2.Service	 同上
3.DAO
注意:Hikari這裡也可以用HikariDataSource進行依賴注入,但是Druid連線池不能用DruidDataSource
@Repository
public class MyDAO {
    @Autowired
    DataSource dataSource;

    public String queryNameById(Long id) throws SQLException, ClassNotFoundException {
    	// 輸出dataSource的型別
        System.out.println(this.dataSource.getClass());
        Connection connection = this.dataSource.getConnection();
		... 同上
    }
}

2.2 SpringBoot手動配置Hikari

手動配置Hikari的方法:當不使用jdbc starter的情況下,即不自動建立並註冊;

注意:@Configuration表示是配置類,通過在包掃描中設定,可讓Spring掃描到該包,之後才是@Bean表示將方法的返回值建立Bean並且加入Spring容器。@Configuration和@Bean兩個註解要連著用。

手動配置過程:
https://www.cnblogs.com/hongdada/p/9360155.html
配置報錯:“jdbcUrl is required with driverClassName“:
https://blog.csdn.net/newbie_907486852/article/details/81391525
配置報錯:”dataSource or dataSourceClassName or jdbcUrl is required“
https://blog.csdn.net/hadues/article/details/102567458

一:匯入pom依賴
<dependency>
	<groupId>com.zaxxer</groupId>
	<artifactId>HikariCP</artifactId>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
二:修改預設配置
注意:手動配置Hikari時,用jdbc-url而不是url,否則會報錯;只有手動配置Hikari才會這樣,手動配置Druid還是用url;
另外,自動配置時連線池的具體配置有hikari字首,而手動配置沒有,這是因為,自動配置時是spring自己識別配置檔案所以要按固定規則配置,而手動配置時,其實加不加字首都可以,這裡只是存放值而已,需要自己再從配置檔案中讀值。
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://localhost:3306/newdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 123456
    minimum-idle: 5
    ...
三:建立並註冊Hikari配置類
注意:這裡註冊的返回值是介面DataSource,而不是實現類HikariDataSource,是多型
@Configuration
public class HikariConfig{
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource(){
        return new HikariDataSource();
    }
}

三:建立實體類:同上
四:Controller、Service、DAO
1.Controller	同上
2.Service		同上
3.DAO
@Repository
public class MyDAO {
    @Autowired
    private DataSource dataSource;

    public String queryNameById(Long id) throws SQLException, ClassNotFoundException {
        Connection connection = this.dataSource.getConnection();
		... 同上
    }
}

2.3 SpringBoot啟動器自動配置Druid

Druid自動手動三種配置方式:
https://www.cnblogs.com/yjq520/p/10779356.html
Druid資料來源獲取:
https://blog.csdn.net/zhu0836/article/details/84330666

一 引入maven依賴
不加jdbc啟動器能夠順利執行,可見druid啟動器中應該包含了jdbc配置
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.1.10</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.11</version>
</dependency>

二:修改預設配置
注意:這裡只是最基本的配置,druid有一個後臺管理頁面,完整配置方法見引用教程
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/newdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 123456
    druid:
      initial-size: 5
      ...
三:Controller、Service、DAO
1.Controller	同上
2.Service		同上
3.DAO
注意:這裡有兩種方式進行依賴注入獲取datasource;但是無論如何不能直接獲取DruidDataSource物件,不然會報錯;
兩種方式最後DataSource的型別都是com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper
第一種:和手動配置一樣,直接用DataSource來注入
public class MyDAO {
    @Autowired
    private DataSource datasource;

    public String queryNameById(Long id) throws SQLException, ClassNotFoundException {
        Connection connection = this.dataSource.getConnection();
		... 同上
    }
}
第二種:獲取DruidDataSourceAutoConfigure物件,再由該物件建立javax.sql.DataSource資料來源;
public class MyDAO {
    @Autowired
    private DruidDataSourceAutoConfigure druidDataSource;

    public String queryNameById(Long id) throws SQLException, ClassNotFoundException {
        DataSource dataSource = this.druidDataSource.dataSource();
        Connection connection = dataSource.getConnection();
		... 同上
    }
}

2.4 SpringBoot手動配置Druid

Druid手動配置兩種方式:
https://blog.csdn.net/mulinsen77/article/details/87778601

一:引入maven依賴
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.10</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.17</version>
</dependency>
二:配置引數
注意:以下為最基本的配置,Druid完整配置包含三大塊,具體配置見引用教程;
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/newdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 123456
    initial-size: 5
    ...
三:建立Druid配置類
注意:這裡註冊的返回值是DataSource介面,而不是實現類DruidDataSource型別;
@Configuration
public class DruidDBService {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
}
四:Controller、Service、DAO
1.Controller	同上
2.Service		同上
3.DAO
注意:手動配置時,注意注入值的並用DruidDatasource類來注入值,而是用Datasource介面,
否則會報錯。而注入的值,實際為DruidDataSource物件,從下面的輸出可知。
@Repository
public class MyDAO {
    @Autowired
    private DataSource  dataSource;

    public String queryNameById(Long id) throws SQLException, ClassNotFoundException {
    	// 從輸出可以看到,實際為 class com.alibaba.druid.pool.DruidDataSource
    	System.out.println(this.dataSource.getClass());
        Connection connection = this.dataSource.getConnection();
		... 同上
    }
}

三 使用QueryRunner

四 使用MyBatis

五 使用通用Mapper

相關文章