1. 程式人生 > >IDEA Springboot + JPA + SpringData 資料庫操作

IDEA Springboot + JPA + SpringData 資料庫操作

前言:談起操作資料庫,大致可以分為幾個階段:首先是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):用於物件持久化的API


2.作用:使得應用程式以統一的方式訪問持久層


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.執行判斷測試是否成功,可在資料表中檢視是否建立表,增加資料,控制檯中檢視是否更新資料,可檢視資料。