前言
SpringData是spring一个开源的ORM框架,用于简化数据库访问,Spring Data JPA则是该框架的一个模块。JPA的全称是Java Persistence API(java持久化api)是一种Java对象持久化的接口规范。本文记录Springboot集成Jpa并实现基础CRUD功能。
一、开发环境
jdk1.8+maven3+IDEA+mysql
二、添加POM依赖
代码如下(示例):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.honey</groupId>
<artifactId>honey</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>JpaAndSpringboot</name>
<description>restful project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--引入JPA依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--阿里巴巴数据库连接池,专为监控而生 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<!-- 阿里巴巴fastjson,解析json视图 -->
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>fastjson</artifactId>-->
<!-- <version>1.2.15</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--消除模板代码 getter、setter、构造器、toString()、equals()-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三 、application.yml配置文件
server:
servlet:
context-path: /honey #访问项目名
port: 8890 #端口号
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/ionia?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource #阿里巴巴数据库连接池
#jpa正向工程
jpa:
hibernate:
ddl-auto: update
show-sql: true #显示SQL
open-in-view: false
四、bo类,service接口,impl实现层,dao层
1. bo类
这里并没有显式生成set get,因为引入了@Data注解( lombok依赖 ),可以帮我们自动生成set get toString等方法,调用的时候可以看到是存在set get方法的。
package com.honey.demo.bo;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "users")
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "lid", nullable = false)
private int lid;
@Column(name = "username")
private String username;
@Column(name = "name")
private String name;
@Column(name = "password")
private String password;
......//省略部分代码
@Column(name = "age")
private Integer age;
}
2. service接口
package com.honey.demo.service;
import com.honey.demo.bo.Users;
import java.util.Iterator;
public interface UserService {
/** 删除 */
public void delete(int id);
/** 增加*/
public void insert(Users user);
/** 更新*/
public int update(Users user);
/** 查询单个*/
public Users selectById(int id);
/** 查询全部列表*/
public Iterator<Users> selectAll(int pageNum, int pageSize);
//自定义SQL,根据id修改name
public int updateById(String name,String id);
//自定义SQL,根据username查询用户
public Users findUser(String username);
}
3. service.Impl实现类
package com.honey.demo.service.impl;
import com.honey.demo.bo.Users;
import com.honey.demo.dao.UserRepository;
import com.honey.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Iterator;
import java.util.Optional;
@Transactional
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
/**
* 删除
*
* @param id
*/
@Override
public void delete(int id) {
userRepository.deleteById(id);
}
/**
* 增加
*
* @param user
*/
@Override
public void insert(Users user) {
userRepository.save(user);
}
/**
* 更新
*
* @param user
*/
@Override
public int update(Users user) {
userRepository.save(user);
return 1;
}
/**
* 查询单个
*
* @param id
*/
@Override
public Users selectById(int id) {
Optional<Users> optional = userRepository.findById(id);
Users user = optional.get();
return user;
}
/**
* 查询全部列表,并做分页
* @param pageNum 开始页数
* @param pageSize 每页显示的数据条数
*/
@Override
public Iterator<Users> selectAll(int pageNum, int pageSize) {
//将参数传给这个方法就可以实现物理分页了,非常简单。
Sort sort = Sort.by(Sort.Direction.ASC, "lid");
Pageable pageable = PageRequest.of(pageNum, pageSize, sort);
Page<Users> users = userRepository.findAll(pageable);
Iterator<Users> userIterator = users.iterator();
return userIterator;
}
@Override
public int updateById(String name, String id) {
return userRepository.updateById(name,id);
}
@Override
public Users findUser(String username) {
return userRepository.findUser(username);
}
}
4. dao类(继承JpaRepository接口)
这里是自定义了两个额外的业务方法,包括自定义SQL的编写和传参方式
package com.honey.demo.dao;
import com.honey.demo.bo.Users;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
//@Repository
public interface UserRepository extends JpaRepository<Users,Integer> {
//自定义repository 手写SQL,占位符传值形式
@Query(value = "update users set name=?1 where lid=?2",nativeQuery = true)
@Modifying
int updateById(String name,String id);
//SPEL表达式,hql语法
@Query("from Users u where u.username=:username")
Users findUser(@Param("username")String username);// 参数username 映射到数据库字段username
}
5、controller调用
package com.honey.demo.controller;
import com.honey.demo.bo.Userrole;
import com.honey.demo.bo.Users;
import com.honey.demo.service.RoleService;
import com.honey.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
//删除用户
@RequestMapping(method = RequestMethod.GET,value = "/del/{id}")
public void delete(@PathVariable("id")int id){
userService.delete(id);
}
//新增用户
@RequestMapping(method = RequestMethod.POST,value = "/insert")
public void insert(Users user){
userService.insert(user);
}
//修改用户
@RequestMapping(method = RequestMethod.POST,value = "/update/{id}")
public void update(@RequestParam Users user){
userService.update(user);
}
//查询用户
@RequestMapping(method = RequestMethod.GET,value = "/select/{id}")
public Users select(@PathVariable("id")int id){
return userService.selectById(id);
}
//分页查询用户
@RequestMapping(method = RequestMethod.GET,value = "/selectAll/{pageNum}/{pageSize}")
public List<Users> selectAll(@PathVariable("pageNum") int pageNum, @PathVariable("pageSize") int pageSize){
Iterator<Users> userIterator = userService.selectAll(pageNum, pageSize);
List<Users> list = new ArrayList<>();
while(userIterator.hasNext()){
list.add(userIterator.next());
}
return list;
}
//根据ID修改Name
@RequestMapping(method = RequestMethod.GET,value = "/updateName/{id}/{name}")
public void updateNameById(@PathVariable("id")String id,@PathVariable("name")String name ){
userService.updateById(name,id);
}
//根据username查询用户
@RequestMapping(method = RequestMethod.GET,value = "/findUser/{username}")
public Users findUserByUName(@PathVariable("username")String name){
return userService.findUser(name);
}
//查询角色
@RequestMapping(method = RequestMethod.GET,value = "/selRole/{id}")
public Userrole selectRole(@PathVariable("id")int id){
return roleService.selectById(id);
}
}
五、结构目录
测试结果
使用浏览器请求分页查询,成功返回结果。
也可以用Postman根据进行请求,方便添加多个参数及多种请求方式
点击Send按钮,可以看到数据库成功新加一条记录
注意:使用lombok必须为IDEA安装 lombok插件。