1.什么是spring data jpa?
jpa(java persistence Api)和spring data是两个范畴的概念。作为一名javaEE工程师,基本都听说过hibernate框架,hibernate是一个orm框架,而jpa则是一种orm规范,jpa和hibernate的关系就像jdbc与jdbc驱动的关系,即jpa制定了orm规范,而hibernate是这些规范的实现,(事实上,是先有的hibernate后有的jpa),因此,jpa相当于是hibernate的一个子集。spring data是spring的一个子项目,致力于简化数据库访问,通过规范的方法名称来分析开发者的意图,进而减少数据库访问层的代码量,spring data不仅支持关系型数据库,也支持非关系型数据库,spring data jpa可以有效简化关系型数据库访问代码。
2.spring boot整合spring data jpa
1)创建数据库jpa
create database if not exists jpa;
2)创建springboot项目,添加MySQL和spring data jpa的依赖,代码如下
<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> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>
3)数据库配置
在application.properties中配置数据库基本信息以及jpa相关配置
1~4行是数据库基本信息配置,5~8行是JPA相关配置,第5行代表代表是否在控制台打印JPA执行过程生成的SQL,第6行代表JPA对应的数据库是MySQL,第7行代表项目在启动时更新数据库中的表,可选择的值有(create,create-drop,validate,no),第8行代表使用数据库方言是MySQL57Dialect
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql:///jpa?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.jpa.show-sql=true spring.jpa.database=mysql spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
4)编写实体类
创建一个book类
@Entity表是该类是一个实体类,@Table表示对应的表的名字,@Id表示该属性是一个主键,@GeneratedValue表示主键自动生成,strategy表示主键生成策略,@Column可以定制生成的字段的属性,nullable表示该字段非空,@Transient注解表示在生成数据库表的时候该字段自动被忽略,即不生成对应的字段
package springjpademo.demo.com.fqh.entity; import javax.persistence.*; @Entity @Table(name = "book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "name",nullable = false) private String name; @Column(name="author") private String author; @Column(name = "price") private Float price; @Transient private String description; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Float getPrice() { return price; } public void setPrice(Float price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
5)创建BookDao接口
创建Book'Dao接口,继承JpaRepository,第一个泛型是你需要操作的类,第二个泛型是你操作的表中的主键类型
package springjpademo.demo.com.fqh.repository; import org.springframework.data.jpa.repository.JpaRepository; import springjpademo.demo.com.fqh.entity.Book; public interface BookDao extends JpaRepository<Book,Integer> { }
6)创建bookService
package springjpademo.demo.com.fqh.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import springjpademo.demo.com.fqh.entity.Book; import springjpademo.demo.com.fqh.repository.BookDao; @Service public class BookService { @Autowired private BookDao bookDao; public void addBook(Book book){ bookDao.save(book); } }
7)创建bookController
package springjpademo.demo.com.fqh.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import springjpademo.demo.com.fqh.entity.Book; import springjpademo.demo.com.fqh.service.BookService; @RestController public class BookController { @Autowired private BookService bookService; @GetMapping("/save") public void save(){ Book book=new Book(); book.setName("java开发之战"); book.setAuthor("鲁迅"); book.setPrice(13f); book.setDescription("这是一本好书"); bookService.addBook(book); } }
8)运行springboot项目
运行项目,控制台打印SQL语句Hibernate: insert into book (author, name, price) values (?, ?, ?)
查看数据库自动创建表
3.JPQL
JPQL是一种面向对象表达式语言,可以将SQL语法和简单查询语义绑定在一起,使用这种语言编写的查询是可以移植的,可以被编译成所有主流的数据库服务器上的SQL,JPQL与原始SQL语句类似,并且完全面向对象,可以通过类名和属性访问,而不是表名和表的属性,类似于HQL,查询使用:id,:name这种方式来绑定参数,注意:这里的列名是属性的名称而不是数据库中列的名称。
select 实体别名.属性名, 实体别名.属性名 from 实体名 as 实体别名 where 实体别名.实体属性 op 比较值
在写语句的时候我们可能需要使用到参数,如果是位置参数使用“?” ,如果是参数则使用 “:XX “
使用@Query注解创建查询,将该注解贴在dao的方法上,然后提供一个需要的JPQL语句即可,如:
@Query("SELECT p FROM Person p WHERE name LIKE %?1%")
Person findByName(String name);
@Query("SELECT p FROM Person p WHERE name LIKE %:name%")
Person findByName(@Param("name") String name);
我们需要使用@Modifying注解来标识该方法执行的是更新或者删除操作,如:
@Modifying @Query("UPDATE Person p SET p.name = :name WHERE p.id = :id") void updatePersonName(@Param("id") Integer id, @Param("name") String name);