springboot干货——(七)springboot整合Spring Data JPA

xiaoxiao2021-02-28  9

前言

Spring Data JPA对大家来说相对比较陌生,尤其是在一些传统互联网行业工作的人。一方面现在mybatis整合Spring和SpringMVC如火如荼,遮盖住了Spring Data的锋芒,另一方面不少公司的管理层为了项目稳定不太喜欢用不熟悉的工具,就这样Spring Data变得有些悲剧,不过用过Spring Data的人一定会深深的爱上他的,因为他真的实在是太方便了,尤其是在Spring整合中。下面我们就来详细介绍一下Spring Boot整合Spring Data JPA。

优点:

1.自动通过代码创建数据库;

2.部分常用的sql语句不需要自己编写,大大提高了开发效率;

正文

接口继承关系图

依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version> </dependency>

项目结构图

Application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username = root spring.datasource.password = XXXXXXX spring.datasource.driver-class-name = com.mysql.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update logging.file=/log/springBootTest.log server.port=8090 注意,如果通过jpa在数据库中建表,将jpa.hibernate,ddl-auto改为create,建完表之后,要改为update,要不然每次重启工程会删除表并新建。 spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。 create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

Bean

package com.gwd.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.*; //@Table(name="User")//用来绑定表名,如果表名与bean名称本身一致,那么可以不用 @Entity public class User { @Id @GeneratedValue private Integer id; @Column(nullable=false) private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } } Dao package com.gwd.dao; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import com.gwd.domain.User; public interface StuMapper extends JpaRepository<User, Integer>{ @Query("select u from User u where id =?1") List<User> findUserById(Integer id); } 这块需要注意:spring data jpa 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等,

简单条件查询

按照 Spring Data的规范,查询方法以 find | read | get开头, 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写 

例如:定义一个 Entity实体类 class User         private StringfirstName;         private StringlastName;  使用And条件连接时,应这样写: findByLastNameAndFirstName(String lastName,String firstName); 条件的属性名称与个数要与参数的位置与个数一一对应 

KeywordSampleJPQL snippetAndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2Is,EqualsfindByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2LessThanfindByAgeLessThan… where x.age < ?1LessThanEqualfindByAgeLessThanEqual… where x.age ⇐ ?1GreaterThanfindByAgeGreaterThan… where x.age > ?1GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1AfterfindByStartDateAfter… where x.startDate > ?1BeforefindByStartDateBefore… where x.startDate < ?1IsNullfindByAgeIsNull… where x.age is nullIsNotNull,NotNullfindByAge(Is)NotNull… where x.age not nullLikefindByFirstnameLike… where x.firstname like ?1NotLikefindByFirstnameNotLike… where x.firstname not like ?1StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname descNotfindByLastnameNot… where x.lastname <> ?1InfindByAgeIn(Collection ages)… where x.age in ?1NotInfindByAgeNotIn(Collection age)… where x.age not in ?1TRUEfindByActiveTrue()… where x.active = trueFALSEfindByActiveFalse()… where x.active = falseIgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

分页查询

分页查询在实际使用中非常普遍了,spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable,当查询中有多个参数的时候Pageable建议做为最后一个参数传入 StuServiceImpl public Page<User> queryPage(int page, int size, Sort id) { Sort sort = new Sort(Direction.DESC, "id"); Pageable pageable = new PageRequest(page, size, sort); Page<User> findALL = stuMapper.findALL(pageable); return findALL; } Controller @RequestMapping("/getPage") public void testPage() { Sort sort = new Sort(Direction.DESC, "id"); Page<User> page = stuService.queryPage(1, 2, sort); System.out.println("当前总记录数"+page.getTotalElements()); System.out.println("当前页面的记录数"+page.getNumberOfElements()); System.out.println("总页数"+page.getTotalPages()); System.out.println("当前页面的List"+page.getContent()); System.out.println("当前页码"+(page.getNumber()+1)); }
转载请注明原文地址: https://www.6miu.com/read-450206.html

最新回复(0)