spring data jpa
springboot配上spring data jpa就是一条龙服务到家,快速开发,专注业务,完美契合。还有lombok
- pom
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
</dependency>
三件套:mysql连接、jpa、jpa高级querydsl
-
数据库表
-
实体类
实体类和数据库表保持字段一致,数据库中使用user_name,实体类使用userName。
package com.speed.fast.dal.dataobject;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name = "s_exam")
@DynamicInsert
@DynamicUpdate
@Data
public class Exam{
private String examName;
private Integer isOpened;
private Integer sustainTime;
private String examDesc;
@Id
@GeneratedValue
private Long id;
private Integer isDeleted;
@Version
private Integer version;
private Date addTime;
private Date updateTime;
}
- 写方法
package com.speed.fast.dal.repository;
/**
* @author :QiuShi
* @Date :2020/11/23 下午5:47
* @Version 1.0
*/
import com.speed.fast.dal.dataobject.Exam;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ExamRepository extends JpaRepository<Exam,Long> {
Exam findById(Long id);
Exam findFirstById(Long id);
}
- 调用方法
package com.speed;
/**
* @author :QiuShi
* @Date :2020/11/23 下午6:20
* @Version 1.0
*/
import com.speed.fast.Application;
import com.speed.fast.dal.dataobject.Exam;
import com.speed.fast.dal.repository.ExamRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class})
public class test {
@Resource
ExamRepository examRepository;
@Test
public void getTest(){
Exam byId = examRepository.findById(Long.valueOf(1));
System.out.println(byId);
Exam v = examRepository.findFirstById(Long.valueOf(1));
System.out.println(v);
}
}
没了,就是这么简单。
只要原因吗?因为jpa会根据方法的名字来自动生成sql语句,我们只需要按照方法定义的规则即可,方法都以findBy开头为查询条件,多个参数通过And或者Or,那么标准是啥呢?
1、只有首字母小写
你可以findByUserNameAndPassWordAndMail…,只有首字母小写。
2、By后面的是条件,比如用户名,findByUserName,可能会问?那如何知道查谁(哪个表)呢?当然是实现的时候传递进去的。继承的时候指定了对应的实体(实体上就注解了表名),以及id的类型(jpa必须有id)
public interface ExamRepository extends JpaRepository<Exam,Long> {
3、返回值就是你期待的值,有一个你就返回对象,有多个,你就返回list,当然一个你返回list没问题,那么多个你返回一个呢?会报错,所以为了避免出现这样的情况,可以使用集合来接收单个返回值的,再判断结果集。
基础的CRUD
添加:save
自带的save,你都不需要在接口上写这个方法。
查询:findBy
直接使用方法名构造就好了,简单不简单,强大的查询功能。
删除:delete
同样默认的,需要传入id值,或者实体对象
修改:save
修改是先查询再修改,把查询和添加组合起来就好了。
这样设计是非常合理的,毕竟不能乱改,确认一下比较好。