# 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")); } } ~~~ (待补充)