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
我们再来查询一下