Spring Data JPA入门

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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值