我們在上一篇搭建了一個簡單的springboot應用,這一篇將介紹使用spring-data-jpa操作數據庫。
新建一個MySQL數據庫,這里數據庫名為springboot,建立user_info數據表,作為我們示例操作的表對象。
user_info信息如下:
DROP TABLE IF EXISTS `user_info`;CREATE TABLE `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ------------------------------ Records of user_info-- ----------------------------INSERT INTO `user_info` VALUES ('1', 'Java之音', '12345');INSERT INTO `user_info` VALUES ('2', '張無忌', '123');數據庫及表創建成功後,回到我們的工程中
第零步,首先引入MySQL及jpa的maven依賴包:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
第一步,在yml配置文件中配置數據庫連接信息:
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: 1011 jpa: show-sql: true
第二步,創建一個實體類,對應數據表實體映射:
package com.javazhiyin;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;/*** Created by 57783 on 2018/7/4.*/@Entitypublic class UserInfo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String username; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public UserInfo(){ }}第三步,創建一個Repository類,繼承JpaRepository類:
package com.javazhiyin;import org.springframework.data.jpa.repository.JpaRepository;/*** Created by 57783 on 2018/7/4.*/public interface UserInfoRepository extends JpaRepository<UserInfo,Integer>{}這裡繼承了JpaRepository類,其封裝了一些對數據庫操作的基本方法,我們通過源碼查看一下JpaRepository有哪些方法:
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package org.springframework.data.repository;import java.util.Optional;@NoRepositoryBeanpublic interface CrudRepository<T, ID> extends Repository<T, ID> { <S extends T> S save(S var1); <S extends T> Iterable<S> saveAll(Iterable<S> var1); Optional<T> findById(ID var1); boolean existsById(ID var1); Iterable<T> findAll(); Iterable<T> findAllById(Iterable<ID> var1); long count(); void deleteById(ID var1); void delete(T var1); void deleteAll(Iterable<? extends T> var1); void deleteAll();}第四步,新建一個Controller,實現對數據庫的增刪改查操作:
package com.javazhiyin;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;/*** Created by 57783 on 2018/7/4.*/@RestControllerpublic class UserInfoController { @Autowired private UserInfoRepository userInfoRepository; /** * 查* @return */ @GetMapping(value = "/list") public List<UserInfo> getUserList(){ return userInfoRepository.findAll(); } /** * 增* @param username * @param password * @return */ @PostMapping(value = "/addUser") public UserInfo addUser(@RequestParam("username") String username, @RequestParam("password") String password){ UserInfo user = new UserInfo(); user.setUsername(username); user.setPassword(password); return userInfoRepository.save(user); } /** * 改* @param id * @param username * @param password * @return */ @PutMapping(value = "updUser/{id}") public UserInfo updUser(@PathVariable("id") Integer id, @RequestParam("username") String username, @RequestParam("password") String password){ UserInfo user = new UserInfo(); user.setId(id); user.setUsername(username); user.setPassword(password); return userInfoRepository.save(user); } /** * 刪* @param id */ @DeleteMapping(value = "delUser/{id}") public void delUser(@PathVariable("id") Integer id){ UserInfo user = new UserInfo(); user.setId(id); userInfoRepository.delete(user); }}測試上述代碼,這裡我們使用postman測試,非常方便:
查詢測試:
新增測試:
修改測試:
刪除測試:
我們可以看到可以全部測試通過,springboot使用spring-data-jpa進行增刪改查的操作確實挺方便的。
幾個問題:
1、對象實體映射類中的註解@GeneratedValue的概念及用法?
JPA要求每一個實體Entity,必須有且只有一個主鍵,而@GeneratedValue註解會為一個實體生成一個唯一標識的主鍵。
JPA提供了四種主鍵生成策略,被定義在枚舉類GenerationType中,分別為:
GenerationType.TABLE
使用一個特定的數據庫表格來保存主鍵,持久化引擎通過關係數據庫的一張特定的表格來生成主鍵。這種策略的好處是不依賴於外部環境和數據庫的具體實現,在不同數據庫間可以很容易的進行移植。但由於其不能充分利用數據庫的特性,所以不會優先使用。
GenerationType.SEQUENCE
在某些數據庫中不支持主鍵自增長,比如Oracle。其提供了一種叫做”序列(sequence)”的機制生成主鍵。此時,GenerationType.SEQUENCE就可以作為主鍵生成策略。該策略的不足之處正好與TABLE相反,由於只有部分數據庫(Oracle,PostgreSQL,DB2)支持序列對象,所以該策略一般不應用於其他數據庫。
GenerationType.IDENTITY
主鍵自增長策略,數據庫在插入數據時,會自動給主鍵賦值,比如MYSQL可以在創建表時聲明”auto_increment” 來指定主鍵自增長。該策略在大部分數據庫中都提供了支持(指定方法或關鍵字可能不同),但還是有少數數據庫不支持,所以可移植性略差。
GenerationType.AUTO
把主鍵生成策略交給持久化引擎(persistence engine),持久化引擎會根據數據庫在以上三種主鍵生成策略中選擇其中一種。此種主鍵生成策略比較常用,由於JPA默認的生成策略就是GenerationType.AUTO,所以使用此種策略時可以顯式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue。
2、Spring Data JPA提供了哪些接口,可以實現哪些功能?
本文可運行的源碼:https://github.com/javazhiyin/springboot/tree/master/bootdemo_01
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。