springboot-jpa

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();
    }

}

啓動項目測試一下

可以看到我們把表裏的數據都查出來了

findAllJpaRepository提供的方法,查詢表裏所有的數據,我們來看一下源碼

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

我們再來查詢一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章