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

我们再来查询一下

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