一、引言
- 什么是SpringDataJPA?
Spring Data JPA能干什么
可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
首先我们需要清楚的是Spring Data是一个开源框架,在这个框架中Spring Data JPA只是这个框架中的一个模块,所以名称才叫Spring Data JPA。如果单独使用JPA开发,你会发现这个代码量和使用JDBC开发一样有点烦人,所以Spring Data JPA的出现就是为了简化JPA的写法,让你只需要编写一个接口继承一个类就能实现CRUD操作了。 - JPA/Hibernate关系?
JPA是一种规范,而Hibernate是它的一种实现。除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实现而不必改动太多代码。
二、Demo实现
(1) 依赖引入,这里使用 druid 数据源
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
(2)包结构如下
(3)配置
server:
port: 9090
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3308/user_test?useUnicode=true&useSSL=false&characterEncoding=UTF-8
#配置监控统计拦截的 filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat, wall
#最大活跃数
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
jpa:
# Specify the DBMS
database: MySQL
# Show or not log for each sql query
show-sql: true
format_sql: true
hibernate:
# Hibernate ddl auto (create, create-drop, update)
ddl-auto: update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy #org.hibernate.cfg.DefaultNamingStrategy]
naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
dialect: org.hibernate.dialect.MySQL5Dialect
(3)配置
repository接口层
public interface UserDao extends
JpaRepository<User,Long>,
JpaSpecificationExecutor<User>,
Serializable {
}
service层
/**
* @author liyao
* @createTime 2018/8/13
* @description
*/
@Service
@Transactional
public class UserService {
@Autowired
private UserDao userDao;
/**
* 保存数据
* @param user
*/
public User save(User user){
return userDao.save(user);
}
/**
* 删除数据
* @param id
* @return
*/
public List<User> delete(Long id){
userDao.deleteById(id);
return userDao.findAll();
}
/**
* 查询数据
* @return
*/
public List<User> list(){
return userDao.findAll();
}
}
controller层
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 查询用户列表
* @return
*/
@GetMapping(value = "/list")
public List<User> list(){
return userService.list();
}
/**
* 添加、更新用户的方法
* @param entity
* @return
*/
@GetMapping(value = "/save")
public User save(User entity){
return userService.save(entity);
}
/**
* 删除用户
* @param id
* @return
*/
@GetMapping(value = "/delete")
public List<User> delete(Long id){
userService.delete(id);
return userService.list();
}
}
(4)测试
1、新增2、查询
3、删除id=2