# spring-data-jpa
**Repository Path**: iCopper/spring-data-jpa
## Basic Information
- **Project Name**: spring-data-jpa
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-11-10
- **Last Updated**: 2020-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## spring-data-jpa 的的使用
[官方文档地址](https://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#query-by-example)
### 1.1 spring-data-jpa 的简介
> Spring Data JPA是Spring基于Hibernate开发的一个JPA框架。如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更进一步,为我们做了 一个数据持久层框架几乎能做的任何事情。并且提供了基础的增删改查方法.
### 1.2 dependency
~~~
mysql
mysql-connector-java
5.1.40
org.springframework.boot
spring-boot-starter-data-jpa
~~~
### 1.3 yaml配置
~~~
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
#数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://106.13.190.211:3306/code?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=
#springboot 会优先使用tomacat连接池(前提是可用)
spring.datasource.tomcat.validation-query=select 1
#从连接池中取出的连接进行校验,若该连接失败,尝试取另外一个连接
spring.datasource.tomcat.test-on-borrow=true
#连接池空闲时,校验池中的连接,若校验失败,则从连接池中去除
spring.datasource.tomcat.test-while-idle=true
~~~
> 上面的tomcat连接池是解决mysql的"waitTimeout"的问题,当与mysql建立的连接超过"waitTimeout"所设置的时间后,mysql会自动将该连接关闭,但程序这边的连接池仍然认为该连接生效,因而会报错:"_**No operations allowed after connection closed**_"
>
>`spring.jpa.show-sql=true` : 显示sql语句
>
>`spring.jpa.hibernate.ddl-auto=none` : 通过实体类逆向创表操作,其值有以下几个选项:
>
> - none : 无操作
> - create :启动时删数据库中的表,然后创建,退出时不删除数据表
> - create-drop : 启动时删数据库中的表,然后创建,退出时删除数据表 如果表不存在报错
> - update :最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会
> - validate :项目启动表结构进行校验 如果不一致则报错
### 1.4 建立repository
~~~
public interface UserRepository extends JpaRepository {
/**
* 自定义接口
*/
// Page findUserByPage(User user);
//
// /**
// * 查询所有user
// */
// User findAllByUsername();
//
// /**
// * 性别查询
// */
// User findAllBySex();
//
// /**
// * 添加用户
// *
// * @return
// */
// @Override
// Integer save(User user);
}
~~~
> jpaRepository(TD,ID) 基本上涵盖了CRUD、排序和分页等操作,还可自定义接口查询.比如@Query("your sql")可执行复杂的查询条件
### 1.5 简略版的分层
~~~
public class TestController {
@Autowired
private UserRepository userRepository;
@RequestMapping(value = "/findUser", method = RequestMethod.POST)
public List findUserConditional(@RequestBody User args) {
List list = this.userRepository.findAll(Example.of(args));
// List result = new ArrayList<>();
// Collections.copy(result, list);
return list;
}
@RequestMapping(value = "/saveUsers", method = RequestMethod.POST)
@Transactional(rollbackFor = Exception.class)
public String saveUsers(@RequestBody String args) {
//JSONObject.parse 解析成数组
return "success";
}
@RequestMapping(value = "/saveUsers1", method = RequestMethod.POST)
@Transactional(rollbackFor = Exception.class) // 事务在这里起作用了,保证了原子性
public String saveUsers1(@RequestBody List args) {
args.stream().forEach(user -> this.userRepository.save(user));
return "success";
}
@RequestMapping(value = "/getUsersPage", method = RequestMethod.POST)
@Transactional(rollbackFor = Exception.class) // 事务在这里起作用了,保证了原子性
public Page getUsersPage(@RequestBody User args,
@RequestParam(required = false, defaultValue = "1", name = "currentPage") Integer currentPage, @RequestParam(required = false, defaultValue = "2", name = "pageSize") Integer pageSize
) {
Assert.isTrue(currentPage > 0, () -> "currentPage must be positive");
Assert.isTrue(pageSize > 0, () -> "pageSize must be positive");
// spring data jpa 分页是从第0条开始计算的
/**
* PageRequest.of的重构方法中有分页和排序的方法
*/
// return userRepository.findAll(PageRequest.of(currentPage - 1, pageSize));
//默认是ASC ,自定义排序方式
// return userRepository.findAll(PageRequest.of(currentPage - 1, pageSize, Sort.by("username")));
return userRepository.findAll(PageRequest.of(currentPage - 1, pageSize, Direction.DESC, "username"));
}
}
~~~
(待补充)