jpa是springboot爲我們提供的簡單數據庫操作類,讓我們可以很簡單的操作數據庫,而且封裝了基本的方法
目標:使用jpa對數據進行操作
新建一個項目,這裏我取名jpa
添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 數據庫依賴 -->
<dependency>
<groupId>com.myjar</groupId>
<artifactId>oracle</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
spring-boot-starter-data-jpa:jpa依賴 druid:這個是阿里巴巴提供的數據庫操作類 oracle:這個是oracle數據庫自帶的驅動包,不知道爲什麼我在maven倉庫找不到oracle的驅動包,就從數據庫安裝的地方拷貝到了本地倉庫
修改配置文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
username: xxx
password: xxx
#最大活躍數
maxActive: 20
#初始化數量
initialSize: 1
#最大連接等待超時時間
maxWait: 60000
#打開PSCache,並且指定每個連接PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
#通過connectionProperties屬性來打開mergeSql功能;慢SQL記錄
#connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
#配置監控統計攔截的filters,去掉後監控界面sql將無法統計,'wall'用於防火牆
filters: stat, wall, log4j
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
我這裏採用oracle數據庫,需要按照oracle數據庫
創建一個java文件,代碼如下
package org.spring.boot.jpa.jpa;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
@Table(name = "member")
@Entity
public class Member implements Serializable {
@Id
private long id;
@Column(name = "uname")
private String uname;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@Table:數據庫表名,如果和類名一樣可以忽略
@Column(name = "uname"):字段對應的數據庫字段名,如果字段名字和數據庫字段名字一樣可以忽略,比如上面的id和password
@Entity,jpa註解
這裏需要創建對於的表,我這裏採用的別的項目的已經創建好的表
創建一個jpa接口,代碼如下
package org.spring.boot.jpa.jpa;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.io.Serializable;
public interface JpaMember extends
JpaRepository<Member, Long>,
JpaSpecificationExecutor<Member>,
Serializable {
}
第一個泛型,實體類,第二個泛型,表的主鍵的類型
需要注意的是第一個泛型實體類必須要有@Entity註解
修改啓動文件,直接在裏面增加一個接口,代碼如下
package org.spring.boot.jpa.jpa;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class JpaApplication {
public static void main(String[] args) {
SpringApplication.run(JpaApplication.class, args);
}
@Autowired
private JpaMember mJpaMember;
@RequestMapping(value = "/test",method = RequestMethod.GET)
public Object sa(){
return mJpaMember.findAll();
}
}
啓動項目測試一下
可以看到我們把表裏的數據都查出來了
findAll是JpaRepository提供的方法,查詢表裏所有的數據,我們來看一下源碼
List<T> findAll();//查詢所有的數據 List<T> findAll(Sort var1);//查詢所有的數據,參數是排序 List<T> findAllById(Iterable<ID> var1);//通過給定的id查詢數據 <S extends T> List<S> saveAll(Iterable<S> var1);//保存給定的列表數據並返回,他返回的意義是如果有是根據序列生成,比如id自增長,會將數據的id封裝到對應的實體類 void flush();//執行緩存與數據庫同步 <S extends T> S saveAndFlush(S var1);//同上 void deleteAllInBatch();//刪除所有數據 T getOne(ID var1);//根據id查詢單條數據 <S extends T> List<S> findAll(Example<S> var1);//根據給定的Example條件查詢數據 <S extends T> List<S> findAll(Example<S> var1, Sort var2);//同上,可以排序
jpa也支持自定義sql,修改JpaMember的代碼,修改以後如下所示
package org.spring.boot.jpa.jpa;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.io.Serializable;
import java.util.List;
public interface JpaMember extends
JpaRepository<Member, Long>,
JpaSpecificationExecutor<Member>,
Serializable {
@Query(value = "select * from member where id=?1",nativeQuery = true)
List<Member> myselect(Long id);
@Modifying
@Query(value = "update member set nickname=?1 where id=?2",nativeQuery = true)
void mydelete(String nickname,Long id);
}
我們修改一下實體類,把暱稱加上
private String nickname;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
我們修改啓動文件添加2接口來操作,代碼如下
package org.spring.boot.jpa.jpa;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class JpaApplication {
public static void main(String[] args) {
SpringApplication.run(JpaApplication.class, args);
}
@Autowired
private JpaMember mJpaMember;
@RequestMapping(value = "/test",method = RequestMethod.GET)
public Object sa(){
return mJpaMember.findAll();
}
@RequestMapping(value = "/delete",method = RequestMethod.GET)
public void delete(){
mJpaMember.mydelete("測試",1536665727928L);
}
@RequestMapping(value = "/select",method = RequestMethod.GET)
public Object select(){
return mJpaMember.myselect(1536665727928L);
}
}
我們調用一下查詢接口,可以看到用戶暱稱是
用戶139****9543
我們來調用一下修改接口
報了個錯,爲什麼呢?從提示上看出是一個事物異常,因爲我們這裏對數據進行了修改,需要開啓事物(update方法名和接口寫成delete了,不過這個不影響)
把接口修改一下,添加上事物
@RequestMapping(value = "/delete",method = RequestMethod.GET)
@Transactional
public void delete(){
mJpaMember.mydelete("測試",1536665727928L);
}
執行了,但什麼都沒有,因爲我們返回的void
我們再來查詢一下
可以看到我們已經修改成功了
o(*≧▽≦)ツ┏━┓
o(*≧▽≦)ツ┏━┓
o(*≧▽≦)ツ┏━┓
源碼地址:https://gitee.com/ww2510095/springboot_learning
我們再來查詢一下