龙空技术网

Spring Boot整合Spring Data JPA进行CRUD和模糊查询

小闫同学是我 194

前言:

目前兄弟们对“springboot mybatis crud”可能比较关怀,大家都想要了解一些“springboot mybatis crud”的相关内容。那么小编也在网络上搜集了一些关于“springboot mybatis crud””的相关内容,希望你们能喜欢,兄弟们一起来学习一下吧!

1 简单介绍下JPA

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:

ORM映射元数据

JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

API

用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

查询语言

这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

2 新建Spring Boot工程和POM依赖以及配置文件

pom.xml

<dependencies>  <!-- JPA -->  <dependency>  <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySql driver --><dependency>  <groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!-- lombok --><dependency>  <groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 单元测试 --><dependency>  <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

application.properties

#classnamespring.datasource.driver-class-name=com.mysql.jdbc.Driver#urlspring.datasource.url=jdbc:mysql://localhost:3306/sp_jpa#usernamespring.datasource.username=root#passwordspring.datasource.password=12345#数据库类型spring.jpa.database=MySQL#是否自动生成spring.jpa.generate-ddl=true#每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新spring.jpa.hibernate.ddl-auto=update

工程结构:

3 实体类和DAO层

Student.java

/*** @author 17122*/@Entity@Data@Setter@Getter@Accessors(chain = true)public class Student {  @Id  @GeneratedValue//ID自动递增  private Long sId;  private String sName;  private Integer sAge;}

StudentDao.java

/*** @author 17122*/@Repository//JpaRepository < 实体类,主键类型 > public interface StudentDAO extends JpaRepository<Student,Long> {  //模糊查询  //nativeQuery = true 表示为原生SQL  @Query(value = "select s_id,s_name,s_age from student s where s.s_name like ?1 ", nativeQuery = true)  List<Student> findByFirstName(@Param("firstName") String firstName);}
4 Service层接口和实现类

StudentService.java

/*** @author 17122*/public interface StudentService {  //添加一个  int saveStudent(Student student);  //根据Sid查找  Student findStudentBySid(Long sId);  //查看全部  List<Student> findAllStudent();  //根据id修改  int updateStudentById(Student student);  //根据id删除  void deleteStudentById(Long sId);  //根据姓模糊查询  List<Student> findStudentByFirstName(String firstName);}

StudentServiceImpl.java

/*** @author 17122*/@Servicepublic class StudentServiceImpl implements StudentService {  @Autowired  private StudentDAO studentDAO;  @Override  public int saveStudent(Student student) {    Student save = studentDAO.save(student);    return ObjectUtils.isEmpty(save) ? 0 : 1;  }  @Override  public Student findStudentBySid(Long sId) {    return studentDAO.findById(sId).get();  }  @Override  public List<Student> findAllStudent() {    return studentDAO.findAll();  }@Overridepublic int updateStudentById(Student student) {  Student student1 = studentDAO.saveAndFlush(student);  return ObjectUtils.isEmpty(student1) ? 0 : 1;}@Overridepublic void deleteStudentById(Long sId) {  studentDAO.deleteById(sId);}@Overridepublic List<Student> findStudentByFirstName(String firstName) {  return studentDAO.findByFirstName(firstName+"%");}}
5 测试
@SpringBootTestclass SpJpaApplicationTests {  @Autowired  private StudentService studentService;  @Test  void saveStudent() {    Student student = new Student();    student.setSName("张三")      .setSAge(100);    studentService.saveStudent(student);  }  @Test  void findStudentById() {    Student student = studentService.findStudentBySid(1L);    System.out.println(student);  }  @Test  void findAllStudent() {    List<Student> students = studentService.findAllStudent();    System.out.println(students);  }  @Test  void updateStudent() {    Student student = new Student();    student.setSId(3L)      .setSName("张四")      .setSAge(10);    studentService.updateStudentById(student);  }  @Test  void deleteStudent() {    studentService.deleteStudentById(3L);  }  @Test  void findBySome(){    System.out.println(studentService.findStudentByFirstName("张"));  }}

可以发现,根据配置文件的spring.jpa.hibernate.ddl-auto=update我们不需要新建数据表,只需要新建数据库就可以了,我们测试下添加操作,然后刷新下数据库:

点开student看下

发现那段配置命令可以帮助我们新建数据表,规则是

数据表名称与实体类名称相同数据表字段将Java中的驼峰命名转化为了下换线命名

可是为什么又多了一张hibernate_sequence表呢?

我们可以点开看下

显然,它是用来表示将要插入下一条数据的ID的

接下来我们可以把每个方法都测试一遍,发现都是可以通过的

6 总结

用了一遍JPA,想说的只有一句话,持久层框架中还是我们中国人开源的Mybatis Plus最好用!

标签: #springboot mybatis crud