Spring Data JPA需要的依赖,SpringBoot已经将其他需要的依赖引入了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
一.配置文件
# 通用数据源配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
# Hikari 数据源专用配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
# JPA 相关配置
# 将默认的存储引擎切换为 InnoDB
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
# 打印出执行的 SQL 语句信息
spring.jpa.show-sql=true
# create每次运行程序都会删除表再新建(慎用)
# create-drop每次程序结束会清空表
# update只会更新表不会删除数据
# validate验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值
# none不会创建表
spring.jpa.hibernate.ddl-auto=update
# spring.jpa.open-in-view=true
# 数据排版
spring.jackson.serialization.indent-output=true
二.实体类
package com.xx.entity;
import lombok.Data;
import javax.persistence.*;
@Data// lombok插件生成get/set方法
@Entity
@Table(name = "tb_customer")// 自动生成表的表名,如果不写将用类名作为表名
//@Proxy(lazy = false)// 关闭懒加载
public class Customer {
/**
* @Id:声名主键
* @GeneratedValue:主键生成策略
* GenerationType.IDENTITY:主键自增(MySql)
* GenerationType.SEQUENCE:序列(Oracle)
* GenerationType.TABLE:由Jpa提供的一种机制,通过表的形式完成主键自增
* GenerationType.AUTO:由程序自动选择主键生成策略
* @Column:配置属性和字段的映射关系
* name:数据库表中字段的名称
* length:字段长度
* columnDefinition:字段的数据类型
* unique:是否唯一
* nullable:是否允许为空
* insertable:是否允许插入
* updatetable:是否允许更新
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cust_id", columnDefinition = "int", length = 32)
private Integer custId;// 客户Id
@Column(name = "cust_name", nullable = false)
private String custName;// 客户名称
@Column(name = "cust_source")
private String custSource;// 客户来源
@Column(name = "cust_level")
private String custLevel;// 客户级别
@Column(name = "cust_instury")
private String custInstury;// 客户所属行业
@Column(name = "cust_phone")
private String custPhone;// 客户联系方式
@Column(name = "cust_address")
private String custAddress;// 客户地址
@Column(name = "cust_birthday", columnDefinition = "date")
private String birthday;
@Column(name = "cust_createTime", columnDefinition = "datetime")
private String createTime;
}
三.SQL语句书写
①直接继承JpaRepository和JpaSpecificationExecutor接口,JPA默认有一些已经有的方法,很MyBatis逆向工程差不多,直接调用就可以使用了,底层由Hibernate实现(JpaSpecificationExecutor接口用起来比较麻烦)
package com.xx.dao;
import com.xx.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* JpaRepository:封装了简单的CRUD操作
* JpaSpecificationExecutor:封装了复杂查询(分页)
* T:操作的实体类
* ID:实体类主键的类型
*/
public interface CustomerDao extends JpaRepository<Customer, Integer>, JpaSpecificationExecutor<Customer> {
}
②书写JPQL语句,类似于简化版的Sql语句
package com.xx.dao;
import com.xx.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* JpaRepository:封装了简单的CRUD操作
* JpaSpecificationExecutor:封装了复杂查询(分页)
* T:操作的实体类
* ID:实体类主键的类型
*/
public interface CustomerDao extends JpaRepository<Customer, Integer>, JpaSpecificationExecutor<Customer> {
// 这里的1,2代表的是占位符的位置
// @Query(value = "from Customer where custName = :name and custInstury = :instury")
@Query(value = "from Customer where custName = ?1 and custInstury = ?2")
Customer getCustomerByNameAndInstury(String name, String instury);
@Query(value = "from Customer where custName like %?1%")
List<Customer> getCustomerListByNameLike(String name);
}
③按照JPA要求的命名规则,不写JPQL也是可以的
package com.xx.dao;
import com.xx.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* JpaRepository:封装了简单的CRUD操作
* JpaSpecificationExecutor:封装了复杂查询(分页)
* T:操作的实体类
* ID:实体类主键的类型
*/
public interface CustomerDao extends JpaRepository<Customer, Integer>, JpaSpecificationExecutor<Customer> {
// findBy+对象属性的名称:使用这样的命名规则可以不用写jpql查询语句
Customer findByCustName(String name);
// findBy+对象属性的名称+关键字:模糊查询
Customer findByCustNameLike(String name);
// findBy+对象属性的名称+and/or+对象属性的名称:多条件查询
Customer findByCustNameAndCustInstury(String name, String instury);
}