Spring Boot 3 -使用mysql
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Spring Boot構建的Web應用中,基於MYSQL資料庫的幾種資料庫連線方式進行介紹。
包括JDBC、JPA、MyBatis、多資料來源和事務。
Spring Boot的Web應用中使用Mysq資料庫,也充分展示Spring Boot的優勢(儘可能少的程式碼和配置)。資料訪問層我們將使用Spring Data JPA和Hibernate(JPA的實現之一)。
注意:如果你想JDBC和JPA可以一起使用,Spring Boot 是支援的,你只需要把JDBC和JPA的依賴都新增在pom.xml 中即可。無需其他特殊處理。
1、JPA
Spring Data Jpa 極大簡化了資料庫訪問層程式碼,只要3步,就能搞定一切
1. 新增pom.xml依賴
2. 配置資料庫連線
3. 編寫Entity類,依照JPA規範,定義實體
4. 編寫Repository介面,依靠SpringData規範,定義資料訪問介面(注意,只要介面,不需要任何實現)
5. 寫一小陀配置檔案 (Spring Scheme配置方式極大地簡化了配置方式)
1.Maven pom.xml檔案
要使用MySQL,需要引入對應的connector,因此,首先在pom檔案中新增如下依賴:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency></dependencies>
2.屬性配置檔案application.properties
在src/main/resources/application.properties中設定資料來源和jpa配置。
spring.datasource.url = jdbc:mysql://localhost:3306/testspring.datasource.username = rootspring.datasource.password = rootspring.datasource.driverClassName = com.mysql.jdbc.Driver# Specify the DBMSspring.jpa.database = MYSQL# Show or not log for each sql queryspring.jpa.show-sql = true# Hibernate ddl auto (create, create-drop, update)spring.jpa.hibernate.ddl-auto = update# Naming strategyspring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy# stripped before adding them to the entity manager)spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
全部的配置都在如上的檔案中了,不需要另外的XML配置和Java配置。
上文中的資料庫配置,你需要換成你的資料庫的地址和使用者名稱密碼。
hibernate的ddl-auto=update配置表名,資料庫的表和列會自動建立(根據Java實體的熟悉), 這裡 可以看到更多得hibernate配置。
如果希望通過Hibernate依靠Entity類自動建立資料庫和資料表,則還需要加上配置項——spring.jpa.hibernate.ddl-auto=create-drop
。
PS:在生產環境中不要使用create-drop,這樣會在程式啟動時先刪除舊的,再自動建立新的,最好使用update;還可以通過設定
spring.jpa.show-sql = true
來顯示自動建立表的SQL語句,通過
spring.jpa.database = MYSQL
指定具體的資料,如果不明確指定Spring boot會根據classpath中的依賴項自動配置。
在Spring專案中,如果資料比較簡單,我們可以考慮使用JdbcTemplate,而不是直接定義Datasource,配置jdbc的程式碼如下:
@Autowiredprivate JdbcTemplate jdbcTemplate;
只要定義了上面這個程式碼,Spring Boot會自動建立一個Datasource物件,然後再建立一個jdbctemplate物件來管理datasource,通過jdbctemplate操作資料庫可以減少大量模板程式碼。如果你對SpringBoot的原理感興趣,可以在org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration類中檢視其具體實現。
3.實體
我們本例是一個城市相關係統: 資料庫中應該具備以下領域物件(domain object) 建立一個City實體。User實體和Mysql資料庫的city表相對應。 首先在src\main\java\com\city\data\下建立包domain,然後再在這個包下建立相應的實體類package com.city.data.domain;import java.io.Serializable;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Table;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity@Table(name = "city")public class City implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private int cityId; @Column(nullable = false) private String name; @Column(nullable = false) private int provinceId; public City() { } public City( int cityId) { super(); this.cityId = cityId; } public int getCityId() { return cityId; } public void setCityId(int id) { this.cityId = id; } ...... }
4.實體的資料訪問層Dao
建立完實體類,還需要建立CityRepository介面,該介面繼承自Repository,這個介面放在src\main\java\com\city\data\service包中,具體程式碼如下:package com.city.data.service;/** *DAO層 */import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.repository.Repository;import com.city.data.domain.City;interface CityRepository extends Repository<City, Long> { City findByName(String name);}
我們都沒有寫一行SQL語句,也沒有在程式碼中涉及到資料庫連線、建立查詢等方面的內容。只有實體類上的各種註解表明我們在於資料庫做互動:@Entity,@Repository,@Id,@GeneratedValue,@ManyToOne,@ManyToMany以及@OneToMany,這些註解屬於Java Persistance API。我們通過Respository介面的子介面與資料庫互動,同時由Spring建立物件與資料庫表、資料庫表中的資料之間的對映關係。下面依次說明這些註解的含義和使用:
- @Entity,說明被這個註解修飾的類應該與一張資料庫表相對應,表的名稱可以由類名推斷,當然了,也可以明確配置,只要加上
@Table(name = "books")
即可。需要特別注意,每個Entity類都應該有一個protected訪問級別的無參建構函式,用於給Hibernate提供初始化的入口。 - @Id and @GeneratedValue:@Id註解修飾的屬性應該作為表中的主鍵處理、@GeneratedValue修飾的屬性應該由資料庫自動生成,而不需要明確指定。
- @ManyToOne, @ManyToMany表明具體的資料存放在其他表中,在這個例子裡,書和作者是多對一的關係,書和出版社是多對一的關係,因此book表中的author和publisher相當於資料表中的外來鍵;並且在Publisher中通過@OneToMany(mapped = "publisher")定義一個反向關聯(1——>n),表明book類中的publisher屬性與這裡的books形成對應關係。
- @Repository 用來表示訪問資料庫並操作資料的介面,同時它修飾的介面也可以被component scan機制探測到並註冊為bean,這樣就可以在其他模組中通過@Autowired織入。
5.業務邏輯層service
介面放在src\main\java\com\city\data\service包中,具體程式碼如下:package com.city.data.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Transactional;import org.springframework.util.Assert;import org.springframework.util.StringUtils;import com.city.data.domain.City;@Component("cityService")@Transactionalpublic class CityServiceImpl implements CityService { private final CityRepository cityRepository; @Autowired public CityServiceImpl(CityRepository cityRepository) { this.cityRepository = cityRepository; } //@Override public City getCity(String cityName) { Assert.notNull(cityName, "Name must not be null"); return this.cityRepository.findByName(cityName); }}
6.測試的控制器CityController
新建一個查詢控制器CityController,
介面放在src\main\java\com\city\data\web包中,具體程式碼如下:
package com.city.data.web;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import java.util.*;import com.city.data.service.CityService;import com.city.data.domain.City;;//原始格式//@Controller//json格式@RestControllerpublic class CityController { @Autowired private CityService cityService; @RequestMapping("/") @ResponseBody @Transactional(readOnly = true) public int getBeijing() { //return "helloWorld"; return this.cityService.getCity("beijing").getCityId(); } /** * @PathVariable是用來獲得請求url中的動態引數的 * @param name * @return */ @RequestMapping(value = "/{name}", method = RequestMethod.GET) public Map<String, Object> getCity( @PathVariable String name) { City city = this.cityService.getCity(name); Map<String, Object> response = new LinkedHashMap<>(); response.put("msg", "get city with name(" + name +")"); response.put("city", city); return response; }}
你可以使用瀏覽器訪問url http://127.0.0.1:8080
2、JDBC
JDBC 連線資料庫
1、屬性配置檔案(application.properties)
spring