Spring Data JPA简介
首先介绍一下Spring Data JPA,这里简单的介绍一下,了解一下即可,毕竟不知道冰箱的制冷和每小时耗电也不影响我们的使用,不过面试的话另说。
JPA是ORM(对象关系持久化)的一种规范,可以说是一个接口。ORM就是将数据库中的表映射到Java中的实体类上,操作实体类就可反馈在数据库中。
Spring Data JPA是将JPA进行了简化的框架,底层是Hibernate的JPA实现。
Spring Data JPA的优势
1.简单(这一点足以秒杀一切)
2.易用(Spring家族产品,在主流Spring的各种框架下都可以完美的使用)
3.以上两点就够了
Spring Data JPA 使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
这里我引入了Spring data JPA 和 mysql连接需要的依赖。
此时我们去启动的话,就只报错,因为引入了数据连接工具,就需要配置对应的数据库连接信息。
application.properties配置文件配置
#datasource
spirng.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
#jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
配置如上。DataSource配置数据库的连接驱动、数据库地址以及用户名和密码。
spring.jpa.hibernate.ddl-auto 是配置每次启动ddl对数据库的操作。一共有四个属性。
1.create 每次会重新创建,会把之前的数据库和数据删除
2.create-drop 和1一样,但是应用关闭之后会把表删除
3.update 更新,启动的时候在原来的基础上修改数据表,插入数据(推荐也是常用)
4.validate 只会验证数据表结构
spring.jpa.show-sql控制台是否输入sql语句
这里我们简单的试一下,创建一个User表。为了方便操作,减少机械式代码,我引入了lombok库。
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
Java的分层结构
接下来的例子,就是按这个Java分层结构去写的。
创建实体类
创建User实体类。这个User类就是数据库User表映射到Java中的类。也可以说User类就是Java中的User表。也就是java中的model/entity层。
package com.zuiuxi.plan.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.DynamicUpdate;
import lombok.Data;
/**
*@author lv.gui
*@date 创建时间:2021年9月21日 下午11:01:54
*@description
*/
@Data
@Entity
@DynamicUpdate
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "age")
private Integer age;
@Column(name = "birth")
private Date birth;
}
之后我们查看启动项目,我们就会查看到如下图所示的数据表信息。user表创建成功了。这里我们线布局纠结这些注解的意思。
启动控制台有如下信息
2021-09-22 08:45:56.987 INFO 19016 — [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-09-22 08:45:57.026 INFO 19016 — [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.32.Final
2021-09-22 08:45:57.291 INFO 19016 — [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-09-22 08:45:57.435 INFO 19016 — [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting…
2021-09-22 08:45:58.471 INFO 19016 — [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2021-09-22 08:45:58.496 INFO 19016 — [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL57Dialect
Hibernate: create table user (id bigint not null auto_increment, age integer, birth datetime(6), name varchar(255), primary key (id)) engine=InnoDB
hibernate初始化的信息,和创建user的sql语句,因为我们在application.properties中设置spring.jpa.show-sql=true 就会显示对应执行的sql语句。
创建Repository
repository就是操作实体model/entity层的,在Java中dao层和repository层。
@Repository加在对应的class上便于注入,被注解的类就是一个操作数据表的dao。
package com.zuiuxi.plan.repository;
import org.springframework.data.repository.CrudRepository;
import com.zuiuxi.plan.entity.User;
/**
*@author lv.gui
* @param <User>
*@date 创建时间:2021年9月22日 下午11:46:26
*@description
*/
@Repository
public interface UserRepository extends CrudRepository<User,Long>{
}
这里我集成了Swagger构建的项目,便于调试。
SpringBoot集成Swagger2文档构建Rest服务
创建dto
package com.zuiuxi.plan.dto;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*@author lv.gui
*@date 创建时间:2021年9月23日 上午12:02:34
*@description
*/
@Data
@ApiModel("用户的dto")
public class UserDto {
@ApiModelProperty(value = "用户id")
private Long id;
@ApiModelProperty(value = "用户姓名")
private String name;
@ApiModelProperty(value = "用户年龄")
private Integer age;
@ApiModelProperty(value = "用户生日")
private Date birth;
}
创建对应的Service和接口,对用户进行增删改查
用户操作接口
这里共定义了四个方法,增删改查。
package com.zuiuxi.plan.service;
import java.util.List;
import com.zuiuxi.plan.dto.UserDto;
/**
*@author lv.gui
*@date 创建时间:2021年9月23日 上午12:01:39
*@description 用户操作接口
*/
public interface IUserService {
/**
* 增加一个用户
*
* @param dto 用户
*/
void addUser(UserDto dto);
/**
* 删除用户
*
* @param id
*/
void deleteUser(Long id);
/**
* 编辑用户
*
* @param dto 用户
*/
void updateUser(UserDto user);
/**
* 查找用户
*/
List<UserDto> findAllUser();
}
User接口实现类
package com.zuiuxi.plan.service.Impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zuiuxi.plan.dto.UserDto;
import com.zuiuxi.plan.entity.User;
import com.zuiuxi.plan.repository.UserRepository;
import com.zuiuxi.plan.service.IUserService;
/**
*@author lv-gui
*@date 2021-09-23 09:43
*@description 用户操作接口实现类
**/
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserRepository userRepository;
@Override
public void addUser(UserDto dto) {
User user = new User();
user.setAge(dto.getAge());
user.setBirth(dto.getBirth());
user.setName(dto.getName());
userRepository.save(user);
}
@Override
public void deleteUser(Long id) {
Optional<User> user = userRepository.findById(id);
if(user.isPresent()) {
userRepository.deleteById(id);
}
}
@Override
public List<UserDto> findAllUser() {
List<UserDto> userDtoList = new ArrayList<UserDto>();
Iterable<User> userList = userRepository.findAll();
for(User user : userList) {
UserDto userDto = new UserDto();
userDto.setAge(user.getAge());
userDto.setBirth(user.getBirth());
userDto.setId(user.getId());
userDto.setName(user.getName());
userDtoList.add(userDto);
}
return userDtoList;
}
@Override
public void updateUser(UserDto dto) {
Optional<User> userOpt = userRepository.findById(dto.getId());
if(userOpt.isPresent()) {
User user = userOpt.get();
user.setAge(dto.getAge());
user.setBirth(dto.getBirth());
user.setName(dto.getName());
userRepository.save(user);
}
}
}
创建controller
package com.zuiuxi.plan.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.zuiuxi.plan.dto.UserDto;
import com.zuiuxi.plan.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
/**
*@author lv.gui
*@date 创建时间:2021年9月23日 上午12:00:50
*@description
*/
@RequestMapping("/user")
@Api(tags = "用户的api")
@RestController
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
@ApiOperation(value = "增加用户", httpMethod = "POST")
public void addUser(@RequestBody UserDto dto) {
userService.addUser(dto);
}
@RequestMapping(value = "/deleteUser", method = RequestMethod.GET)
@ApiOperation(value = "删除用户", httpMethod = "GET")
@ApiImplicitParam(name = "id",value = "用户表主键",required = true,dataType = "Long")
public void deleteUser(@RequestParam(value = "id") Long id) {
userService.deleteUser(id);
}
@RequestMapping(value = "/findAllUser", method = RequestMethod.GET)
@ApiOperation(value = "查询所有用户", httpMethod = "GET")
public List<UserDto> findAllUser() {
return userService.findAllUser();
}
@RequestMapping(value = "/updateUser", method = RequestMethod.POST)
@ApiOperation(value = "更新用户", httpMethod = "POST")
public void updateUser(@RequestBody UserDto dto) {
userService.updateUser(dto);
}
}
整体架构
调试
打开Swagger界面 http://localhost:8080/doc.html#/home,注意这里要集成Swagger2,在上文中有简绍。
接下来我们就试一下吧。
增加用户
首先我们增加一个用户,用户主键是自增的,所有我们不需要传主键,点击,文档没有任何反应,因为我们返回了一个void,故而没有任何内容。
使用数据库连接工具打开就可以。如果你没有数据库,或者数据库连接工具都可以在留言。我们添加的用户已经加上了。
这里我们在添加一个用户,方便接下来的操作。
查询用户
更新用户
删除用户
至此user表的增删改查就彻底完成了。程序所做的事情就是增删改查,这是最简单的也是最重要的。
结语
如果你在本教程中有任何问题都可以留言,文章比较简单,之后会深入简绍,万丈高楼平地起,会使用了之后就便于深入了解。