Spring Boot中使用Spring Data JPA

8 篇文章 0 订阅
5 篇文章 0 订阅

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分层结构去写的。
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,在上文中有简绍。
Swagger界面
接下来我们就试一下吧。

增加用户

首先我们增加一个用户,用户主键是自增的,所有我们不需要传主键,点击,文档没有任何反应,因为我们返回了一个void,故而没有任何内容。
增加用户
使用数据库连接工具打开就可以。如果你没有数据库,或者数据库连接工具都可以在留言。我们添加的用户已经加上了。
增加用户
这里我们在添加一个用户,方便接下来的操作。

增加用户

查询用户

查询用户

更新用户

更新用户

删除用户

删除用户
至此user表的增删改查就彻底完成了。程序所做的事情就是增删改查,这是最简单的也是最重要的。

结语

如果你在本教程中有任何问题都可以留言,文章比较简单,之后会深入简绍,万丈高楼平地起,会使用了之后就便于深入了解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的天才女友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值