IDEA Springboot + JPA + SpringData 資料庫操作
阿新 • • 發佈:2018-11-12
前言:談起操作資料庫,大致可以分為幾個階段:首先是JDBC階段,初學JDBC可能會使用原生的JDBC的API,再然後可能會使用資料庫連線池,比如:C3P0,DBCP,還有一些第三方工具,比如dbutils等,樓主認為JDBC是貫穿始終的,即使到了框架部分,也會對JDBC進行整合,此階段還是自己手寫SQL語句;下一個階段就是休眠,大家體會到了操作資料庫可以不用自己手動編寫SQL,呼叫Hibernate提供的API即可。今天給大家介紹的是操作資料庫的另一個模組JPA,即Java持久層的API,JPA如果與SpringData結合起來,會發出不一樣的“化學反應”,大家拭目以待〜
官方網站對 SpringData JPA的特點描述:( SpringData JPA)
一,JPA概述
1. Java永續性API(Java持久層API):用於物件持久化的API2.作用:使得應用程式以統一的方式訪問持久層
3。前言中提到了Hibernate,那麼JPA與Hibernate的關係是什麼關係呢:
1)JPA是Hibernate的一個抽象,就像JDBC和JDBC驅動的關係
2)JPA是一種ORM規範,是Hibernate功能的一個子集(既然JPA是規範,Hibernate對JPA進行了擴充套件,那麼說JPA是Hibernate的一個子集不為過)
3)Hibernate是JPA的一個實現
4。JPA包括三個方面的技術:
1)ORM對映元資料,支援XML和JDK註解兩種元資料的形式
2)JPA的API
3)查詢語言:JPQL
二、專案框架搭建
1.新建springboot專案
二,程式碼管理
1.建立Userinfo實體類
package cn.liumce.springbootjpa.entity;
import javax.persistence。*;
/ **
* @Entity:代表這個類是一個實體類
* @Table(name =“userinfos):這個註解代表對應表的名稱,userinfos就是利用jpa要生成的表名稱
* @id:表示此屬性是主鍵
* @GeneratedValue:表示的是主鍵生成策略,預設主鍵是自增長的,當然你也可以用uuid
* @Column:表明此屬性在資料庫中對應的欄位,如果實體中的屬性與資料庫的欄位一樣,可以省略不寫。
* /
@實體
@Table(name =“userinfos”)
公共類Userinfo {
@ID
@GeneratedValue
@Column(name =“id”)
private Integer id; //主鍵
@Column(name =“user_name”)
私有String使用者名稱; //使用者名稱
@Column(name =“user_pass”)
private String userpass; //密碼
public Integer getId(){
返回id;
}
public void setId(Integer id){
this.id = id;
}
public String getUsername(){
返回使用者名稱;
}
public void setUsername(String username){
this.username = username;
}
public String getUserpass(){
return userpass;
}
public void setUserpass(String userpass){
this.userpass = userpass;
}
}
2.控制器在包中建立³³ 的的IndexController類
package cn.liumce.springbootjpa.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//此註解預設返回JSON資料
@RestController
//返回頁面
// @控制器
公共類IndexController {
@RequestMapping( “索引”)
public String index(){
迴歸“你好世界”;
//返回“index”;
}
}
3.在庫包中建立UserinfoRepository類
package cn.liumce.springbootjpa.repository;
import cn.liumce.springbootjpa.entity.Userinfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
/ *
實現增刪改查
@Transactional開啟事務
@Modifying修改方法專用註解
@Query(“”)書寫JPAsql語句,其中Userinfo是實體類名,
為userpass和ID是實體類的屬性名,
?1代表是第一個引數?2是第二個引數。
* /
public interface UserinfoRepository擴充套件了JpaRepository <Userinfo,Integer> {
@Transactional
@Modifying
@Query(“apdate Userinfo u set u.userpass =?1其中u.id =?2”)
int updateById(String userpass,int id);
}
4.我的application.properties是這樣的:
#伺服器埠
server.port = 8080
spring.datasource.url = JDBC:MySQL的://127.0.0.1:3306 /分貝了useUnicode =真的characterEncoding = UTF-8
spring.datasource.username =根
spring.datasource.password = 1
spring.datasource.driver類名= com.mysql.jdbc.Driver
################################################## ######
### Java Persistence Api - Spring jpa的配置資訊
#其實這個hibernate.hbm2ddl.auto引數的作用主要用於:自動建立|更新|驗證資料庫表結構,有四個值
#create:每次載入hibernate時都會刪除上一次的生成的表,然後根據你的模型類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,
#這就是導致資料庫表資料丟失的一個重要原因。
#create-drop:每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
#UPDATE:最常用的屬性,第一次載入休眠時根據模型類會自動建立起表的結構(前提是先建立好資料庫),
#以後載入hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。
#要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。
#validate:每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。
#dialect主要是指定生成表名的儲存引擎為InneoDB
#show-sql是否打印出自動生產的SQL,方便除錯的時候檢視
################################################## ######
spring.jpa.properties.hibernate.hbm2dd1.auto =更新
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-SQL =真
#頁面預設字首目錄
spring.mvc.view.prefix = / WEB-INF /檢視/
#頁面預設字尾目錄
spring.mvc.view.suffix = .JSP
5.pom.xml檔案
<?xml version =“1.0”encoding =“UTF-8”?>
<project xmlns =“http://maven.apache.org/POM/4.0.0”xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation =“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
<modelVersion> 4.0.0 </ modelVersion>
<的groupId> cn.liumce </的groupId>
<artifactId的> springboot-JPA </ artifactId的>
<版本> 0.0.1-SNAPSHOT </版本>
<包裝>罐</包裝>
<名稱> springboot-JPA </名稱>
<description> Spring Boot的演示專案</ description>
<母體>
<的groupId> org.springframework.boot </的groupId>
<artifactId的>彈簧引導起動父</ artifactId的>
<版本> 1.5.14.RELEASE </版本>
<relativePath /> <! - 從儲存庫查詢父級 - >
</父>
<效能>
<project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding>
<project.reporting.outputEncoding> UTF-8 </project.reporting.outputEncoding>
<java.version> 1.8 </java.version>
</屬性>
<依賴性>
<依賴性>
<的groupId> org.springframework.boot </的groupId>
<artifactId的>彈簧引導起動資料JPA </ artifactId的>
</依賴性>
<依賴性>
<的groupId> org.springframework.boot </的groupId>
<artifactId的>彈簧引導起動的Web </ artifactId的>
</依賴性>
<依賴性>
<的groupId>的MySQL </的groupId>
<artifactId的> MySQL的聯結器的Java </ artifactId的>
<範圍>執行時</範圍>
</依賴性>
<依賴性>
<的groupId> org.springframework.boot </的groupId>
<artifactId的>彈簧引導起動測試</ artifactId的>
<範圍>測試</範圍>
</依賴性>
<! - servlet依賴包 - >
<依賴性>
<的groupId>的javax.servlet </的groupId>
<artifactId的>的javax.servlet-API </ artifactId的>
<範圍>提供</範圍>
</依賴性>
<! - JSTL(JSP標準標籤庫)JSP標準標籤庫 - >
<依賴性>
<的groupId>的javax.servlet </的groupId>
<artifactId的> JSTL </ artifactId的>
</依賴性>
<! - Tomcat的支援 - >
<依賴性>
<的groupId> org.springframework.boot </的groupId>
<artifactId的>彈簧引導起動的Tomcat </ artifactId的>
</依賴性>
<依賴性>
<的groupId> org.apache.tomcat.embed </的groupId>
<artifactId的> Tomcat的嵌入-碧玉</ artifactId的>
</依賴性>
</依賴>
<建立>
<外掛>
<外掛>
<的groupId> org.springframework.boot </的groupId>
<artifactId的>彈簧引導行家-外掛</ artifactId的>
</外掛>
</外掛>
</建造>
</專案>
6.如果你返回的是頁面,那麼在模組裡新增網路伺服器,更改路徑後在WEB-INF /觀點下建立的jsp介面。再到控制器類中修改,將註解@RestController改為@Controller。
注:這裡@RestController與@Controller的區別:
@RestController是一個結合@ResponseBody和@Controller的構造型註釋。
意思是:
@RestController註解相當於@ResponseBody + @Controller合在一起的作用。
1)如果只是使用@RestController註解Controller,則Controller中的方法無法返回jsp頁面,配置的檢視解析器InternalResourceViewResolver不起作用,返回的內容就是返回裡的內容。
例如:本來應該到的success.jsp頁面的,則其顯示成功。
2)如果需要返回到指定頁面,則需要用@Controller配合檢視解析器InternalResourceViewResolver才行。
3)如果需要返回JSON,XML或自定義mediaType的內容到頁面,則需要在對應的方法上加上@ResponseBody註解。
三,測試
1.找到UserinfoRepository類,如圖操作
2.在測試包生成的UserinfoRepositoryTest測試類中,做對資料庫的增刪改查測試。
package cn.liumce.springbootjpa.repository;
import cn.liumce.springbootjpa.entity.Userinfo;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.junit.Assert。*;
@RunWith(SpringRunner.class)
//例如你的主方法的應用程式是xxxApplication.java,classes就要等於xxxApplication.class
@SpringBootTest(classes = SpringBootApplication.class)
公共類UserinfoRepositoryTest {
/ **
*新增@Autowired
*自動注入UserinfpRespository
* /
@Autowired
private UserinfoRepository userinfoRepository;
/ **
*向資料庫中增加一條資料
* @Test代表這是一個測試方法
* /
@測試
public void save(){
//建立物件並例項化
Userinfo userinfo = new Userinfo();
userinfo.setUsername( “管理員”);
userinfo.setUserpass( “123456”);
//呼叫JPA中的儲存方法,向資料庫中增加一條資料,返回一個物件
Userinfo us = userinfoRepository.save(userinfo);
//斷言
Assert.assertEquals(us.getUsername(), “管理員”);
}
/ **
*刪除資料庫的一條資料
* /
@測試
public void delete(){
//呼叫刪除方法,根據ID刪除
userinfoRepository.delete(1);
}
/ **
*更新資料庫指定id資料
* /
@測試
public void update(){
userinfoRepository.updateById( “為admin123”,5);
}
@測試
public void select(){
//第一種查詢返回List集合
List <Userinfo> lists = userinfoRepository.findAll();
for(Userinfo us:lists){
的System.out.println( “>>>>>>>>>>>>>>>>>>第一種,使用者名稱是:” + us.getUsername());
}
//第二種查詢根據id查詢返回實體
Userinfo uinfo = userinfoRepository.findOne(5);
的System.out.println( “>>>>>>>>>>>>>>>>>>第二種,使用者名稱是:” + uinfo.getUsername());
}
}
3.執行判斷測試是否成功,可在資料表中檢視是否建立表,增加資料,控制檯中檢視是否更新資料,可檢視資料。