1. 程式人生 > >Spring Boot 3 -使用mysql

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織入。
      我們可以新增自定義的介面函式,JPA會提供對應的SQL查詢,例如,在本例中的CityRepository中可以增加findByName(String name)函式,JPA會自動建立對應的SQL查詢——根據name查詢城市,這種將方法名轉換為SQL語句的機制十分方便且功能強大,例如你可以增加類似findByNameIgnoringCase(String name)這種複雜查詢。


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