Spring Boot 2 + jpa + mysql例子
Spring Data框架为数据访问提供了一个通用的模型,无论访问哪种数据库,都可以使用同样的方式,主要有以下几个功能:
(1)提供数据与对象映射的抽象层,同一个对象,可以被映射为不同数据库的数据;
(2)根据数据存储接口的方法名,自动实现数据查询;
(3)为各个领域模型提供最基本的实现,例如增删改查功能;
(4)可在原有逻辑的基础上实现自定义数据库操作逻辑。
JPA是Spring Data框架的其中一个模块,全称为Java Persistence API,是一个持久层规范,Hibernate框架是JPA实现之一。
本文内容:
(1)项目构建
(2)数据访问层与业务层
(3)自定义数据存储逻辑
(4)方法名查询
(5)使用@Query注解
开发环境:IntelliJ IDEA 2019.2.2
Spring Boot版本:2.1.8
一、项目构建
1、新建一个名称为demo的Spring Boot项目。
2、pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
3、application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC
username: root
password:
4、打开Navicat for MySQL,在测试数据库testdb中创建表user
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`age` tinyint(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
5、实体类 User.java
package com.example.demo.entity; import javax.persistence.*; @Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}
二、数据访问层与业务层
数据访问层继承JpaRepository后会自动实现很多内置的方法,拥有基本的数据库CRUD操作。
1、数据访问层 UserRepository.java
package com.example.demo.repository; import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User,Integer>{ }
2、业务层 UserService.java
package com.example.demo.service; import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import java.util.List;
import java.util.Optional; @Service
public class UserService {
@Autowired
UserRepository userRepository; public void save(User user) {
userRepository.save(user);
} public Page<User> getUserPage(Pageable pageable) {
return userRepository.findAll(pageable);
} public List<User> getUsers(){
List<User> users = userRepository.findAll();
return users;
} public Optional<User> findById(Integer id) {
return userRepository.findById(id);
} public void deleteById(Integer id) {
userRepository.deleteById(id);
}
}
3、控制器 UserController.java
package com.example.demo; import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource;
import java.util.List;
import java.util.Optional; @RestController
public class UserController {
@Resource
UserService userService; @RequestMapping("/save")
public String save(){
for(int i=1;i<=20;i++){
User user = new User();
user.setName("a" + i);
user.setAge(i);
userService.save(user);
}
return "添加成功";
} @RequestMapping("/getUserPage")
public Page<User> getUserPage(Integer page, Integer size){
Sort sort = new Sort(Sort.Direction.ASC, "id");
Pageable pageable = PageRequest.of(page,size,sort);
Page<User> users = userService.getUserPage(pageable);
return users;
} @RequestMapping("/getUsers")
public List<User> getUsers(){
List<User> users = userService.getUsers();
return users;
} @RequestMapping("/findById")
public Optional<User> findById(Integer id){
Optional<User> user = userService.findById(id);
return user;
} @RequestMapping("/deleteById")
public String deleteById(Integer id){
userService.deleteById(id);
return "删除成功";
}
}
三、自定义数据存储逻辑
继承JpaRepository可以完成很多工作,但有时需要实现自定义数据存储逻辑。
使用例子:
1、新建一个接口 UserRepositoryCustom.java
package com.example.demo.repository;
import com.example.demo.entity.User;
import java.util.List;
public interface UserRepositoryCustom {
List<User> myQuery();
}
2、新建接口 UserRepositoryCustom的实现类UserRepositoryCustomImpl.java
package com.example.demo.repository.impl; import com.example.demo.entity.User;
import com.example.demo.repository.UserRepositoryCustom; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List; public class UserRepositoryImpl implements UserRepositoryCustom {
@PersistenceContext
private EntityManager em; public List<User> myQuery(){
//说明:下面这个User不是数据库表名,而是实体类名,并且区分大小写
Query q = em.createQuery("from User");
return q.getResultList();
}
}
3、修改原来的 UserRepository.java,同时继承JpaRepository和UserRepositoryCustom
package com.example.demo.repository; import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User,Integer>,UserRepositoryCustom { }
4、修改原来的 UserService.java,增加方法
public List<User> myQuery(){
return userRepository.myQuery();
}
5、修改原来的 UserController.java,代码略。
四、方法名查询
JpaRepository支持接口规范方法名查询,即如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现逻辑。
例如根据对象User的字段name进行查询,实现类似“from User where name=?”查询,直接在接口中写“List<User> name(String name);”,方法名也可写findByName,Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。另外还可以根据特定关键字实现条件查询,如下表所示:
| 关键字 | 例子 | 对应的SQL |
| IsNotNull | findByAgeNotNull | ... where x.age not null |
| Like | findByNameLike | ... where x.name like ?1 |
| NotLike | findByNameNotLike | ... where x.name not like ?1 |
| StartingWith | findByNameStartingWith | ... where x.name like ?1(parameter bound with appended %) |
| EndingWith | findByNameEndingWith | ... where x.name like ?1(parameter bound with prepended %) |
| Containing | findByNameContaining | ... where x.name like ?1(parameter bound wrapped in %) |
| OrderBy | findByAgeOrderByName | ... where x.age = ?1 order by x.name desc |
| Not | findByNameNot | ... where x.name <> ?1 |
| In | findByAgeIn | ... where x.age in ?1 |
| NotIn | findByAgeNotIn | ... where x.age not in ?1 |
| True | findByActiveTrue | ... where x.avtive = true |
| Flase | findByActiveFalse | ... where x.active = false |
| And | findByNameAndAge | ... where x.name = ?1 and x.age = ?2 |
| Or | findByNameOrAge | ... where x.name = ?1 or x.age = ?2 |
| Between | findBtAgeBetween | ... where x.age between ?1 and ?2 |
| LessThan | findByAgeLessThan | ... where x.age < ?1 |
| GreaterThan | findByAgeGreaterThan | ... where x.age > ?1 |
| After/Before | ... | ... |
| IsNull | findByAgeIsNull | ... where x.age is null |
使用例子:
1、修改原来的 UserRepository.java,增加方法
@RequestMapping("/id")
public List<User> id(Integer id){
List<User> users = userService.id(id);
return users;
}
@RequestMapping("/name")
public List<User> name(String name){
List<User> users = userService.name(name);
return users;
}
@RequestMapping("/age")
public List<User> age(Integer age){
List<User> users = userService.age(age);
return users;
}
@RequestMapping("/findByIdAndName")
public List<User> findByIdAndName(Integer id, String name){
List<User> users = userService.findByIdAndName(id, name);
return users;
}
@RequestMapping("/findByAgeBetween")
public List<User> findByAgeBetween(Integer startAge, Integer endAge){
List<User> users = userService.findByAgeBetween(startAge, endAge);
return users;
}
2、修改原来的 UserService.java,增加方法
public List<User> id(Integer id){
return userRepository.id(id);
}
public List<User> name(String name){
return userRepository.name(name);
}
public List<User> age(Integer age){
return userRepository.age(age);
}
public List<User> findByIdAndName(Integer id, String name){
return userRepository.findByIdAndName(id, name);
}
public List<User> findByAgeBetween(Integer startAge, Integer endAge){
return userRepository.findByAgeBetween(startAge, endAge);
}
3、修改原来的 UserController.java,代码略。
五、使用@Query注解
在方法中使用@Query注解,提供JPQL(Java Presistence Query Language)或SQL语句,同样可以实现查询功能。
使用例子:
1、修改原来的 UserRepository.java,增加方法
@Query("select u from User u where u.name = ?1")
List<User> findUserName(String name);
@Query(value = "select * from user u where u.name = ?1", nativeQuery = true)
List<User> findNativeByName(String name);
2、修改原来的 UserService.java,增加方法
public List<User> findUserName(String name){
return userRepository.findUserName(name);
}
public List<User> findNativeByName(String name){
return userRepository.findNativeByName(name);
}
3、修改原来的 UserController.java,代码略。
Spring Boot 2 + jpa + mysql例子的更多相关文章
- Spring boot通过JPA访问MySQL数据库
本文展示如何通过JPA访问MySQL数据库. JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据 ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- Spring Boot2 系列教程(二十四)Spring Boot 整合 Jpa
Spring Boot 中的数据持久化方案前面给大伙介绍了两种了,一个是 JdbcTemplate,还有一个 MyBatis,JdbcTemplate 配置简单,使用也简单,但是功能也非常有限,MyB ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- spring boot 系列之四:spring boot 整合JPA
上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...
- Spring Boot整合JPA、Redis和Swagger2
好久没有总结了,最近也一直在学习.今天就把spring boot与其它技术的整合做个小总结,主要是jpa.redis和swagger2.公司里有用到这些,整合起来也很简单. 首先,新建一个Spring ...
- (45). Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
大家在开发的时候,会喜欢jdbcTemplate操作数据库,有喜欢JPA操作数据库的,有喜欢MyBatis操作数据库的,对于这些我个人觉得哪个使用顺手就使用哪个就好了,并没有一定要使用哪个,个人在实际 ...
- Spring Boot 整合 JPA 使用多个数据源
介绍 JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的标准规范,Hibernate 是持久化规范的技术实现,而 Spring Data JPA 是在 ...
- Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
本文是 Spring Boot 整合数据持久化方案的最后一篇,主要和大伙来聊聊 Spring Boot 整合 Jpa 多数据源问题.在 Spring Boot 整合JbdcTemplate 多数据源. ...
随机推荐
- EggJS接口开发
需求 随着Nodejs的普及,前端开发的开发场景基本可以贯穿界面交互到数据存储,无缝实现全栈开发.最近在实现一个内部项目管理工具的时候,就尝试了一把接口和数据库开发. 什么是Egg.js Egg.js ...
- 如何提高 PHP 代码的质量?第三:端到端 / 集成测试
在本系列的最后一部分,是时候设置端到端 / 集成测试环境,并确保我们已经准备好检查我们工作的质量. 在本系列的前几部分中,我们建立了一个构建工具,一些静态代码分析器,并开始编写单元测试. 为了使我们的 ...
- Maven发布封装到中央仓库时候报错:no default secret key: No secret key
今天因为发布swagger-spring-boot-starter做一个问题的修复,然后碰到了下面这个问题,记录一下解决过程,帮助后续碰到类似问题的童鞋: *gpg: WARNING: "- ...
- Java 基础复习 基础数据类型与包装器类型
Java 基础 基础数据类型与包装器类型 基础数据类型 java 中包含哪些基础数据类型,默认值分别是多少? 基础数据类型 byte short int long double float char ...
- C#&.Net干货分享- 构建Spire-Office相关Helper操作Word、Excel、PDF等
先下载好如下的组件: 直接使用完整源码分享: namespace Frame.Office{ /// <summary> /// Spire_WordHelper /// ...
- java8的捕获多个异常的一个写法
这是按intellij idea的提示知道的, 可以写成 catch(xxxException | yyyException | zzzException e){ } 这样的形式,对几个不同的异常使用 ...
- Java Swing 图形界面开发
https://blog.csdn.net/xietansheng/article/details/72814492
- 【oracle】ORA-06550 字符串长度限制在范围
number(2)输入了100 就会导致异常
- java之工厂方法设计模式
工厂方法模式是设计模式中应用最广泛的模式.在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要.工厂方法模式就是解决这个问题,它通过面向对象的手法,将所要创建的具体对象创建工作延迟到了子 ...
- File Zilla server安装完报错could not load TLS libraries. aborting start of administration interface
问题描述: 系统:Windows2008R2x64 安装完filezillaserver以后出现这个问题 解决方法: 需要安装个系统补丁:Windows6.1-KB2533623-x64 安装完重启服 ...