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 多数据源. ...
随机推荐
- WebAPI + log4net日志 存入数据库
1.首先选择你的项目 打开net管理控制台 输入 install-package log4net 进行安装 也可以 在net包 搜索 log4net 2.安装完之后 在Models文件夹 创建一个L ...
- docker安装redis 5.0.7并挂载外部配置和数据
环境 CentOS Linux release 7.7.1908 (Core) 拉取redis 5.0.7 镜像 docker pull redis:5.0.7 创建挂载目录 mkdir -p /ho ...
- Bash脚本编程之字符串处理
简介 其实这里说得字符串处理,对应的是bash官网中的[Shell Parameter Expansion],不过直接去看这部分内容实在是太难以理解了.就按照马哥所说的字符串处理会比较好理解,平常使用 ...
- CentOS7下部署java+tomcat+mysql项目及遇到的坑
CentOS 7 下安装部署java+tomcat+mysql 前置:CentOS7安装:https://jingyan.baidu.com/article/b7001fe1d1d8380e7382d ...
- fastjson又被发现漏洞,这次危害可能会导致服务瘫痪
0x00 漏洞背景 2019年9月5日,fastjson在commit 995845170527221ca0293cf290e33a7d6cb52bf7上提交了旨在修复当字符串中包含\\x转义字符时可 ...
- Spring基础——AOP通知
spring(AOP通知) 切面 切面是封装通用业务逻辑的组件,可以作用到其他组件上.是spring组件中的某个方法.无返回类型.参数类型与通知类型有关.一个切面 开启数据库 关闭数据库 开启事务 检 ...
- jQuery总结02_jq的dom操作+属性操作
一:JQuery知识点 *:JQuery的dom操作 *:获取节点.给节点添加内容 *:动态创建dom节点 比如动态创建表格等,在js里面进行完成. *删除节点 这里面的删除就是将其放在了一个地方,并 ...
- JS---DOM---元素创建的不同方式---三种方式,5个案例
元素创建-----为了提高用户的体验 元素创建的三种方式: 1. document.write("标签的代码及内容"); 2. 对象.innerHTML="标签及代码 ...
- 在服务器的tomcat中部署手机apk项目,浏览器或手机下载不能根据URL下载和安装apk文件
Android的APK包不能下载或安装,需在tomcat的web.xml加入 <mime-mapping> <extension>apk</extensio ...
- centos_redis 安装脚本
#!/bin/bash # change to root echo "start to install build env..." sudo yum groupinstall &q ...