SpringBoot之使用jpa/hibernate
Springboot版本是2.1.3.RELEASE
1、依赖
List-1.1
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</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>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
2、项目整体结构
图2.1
bootstrap.yml内容如下,我们不需要手动创建数据库表,jpa/hiberate会自动会为我们创建的
server:
port: 9092
servlet:
context-path: /serviceB
spring:
application:
name: cat-service-b
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
password: ******
url: jdbc:mysql://pig-mysql:3306/cat?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true
database: mysql
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
show-sql: true
properties:
hibernate:
format_sql: true
physical-strategy的值为org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy,那么当实体的属性为驼峰结构时,对应到数据库表的字段上,会用"_"隔开。
3、代码详解
List-3.1 BaseEntity的内容,所有的实体都要继承这个类
import lombok.Data;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.util.Date;
@Data
@MappedSuperclass
public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
/** 创建人 */
@CreatedBy
protected String creator;
/** 创建时间 */
@CreatedDate
protected Date createDate;
/** 更新时间,默认是当前时间 */
@LastModifiedDate
protected Date updateDate = new Date();
/** 状态 0 表示删除, 1表示可操作 */
protected Integer status = 1;
public BaseEntity() {
if (null == this.id && null == this.createDate) {
this.createDate = new Date();
}
}
}
List-3.2 User的内容
import lombok.Data;
import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import javax.persistence.Entity;
import javax.persistence.Table;
@Data
@ToString
@Entity
@Table(name = "cat_user")
@SQLDelete(sql = "update cat_user set status = 0 where id = ?")
@Where(clause = "status <> 0")
public class User extends BaseEntity{
private String name;
private Integer age;
}
List-3.3 UserRepository的内容
import com.mjduan.project.catserviceb.entity.User;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Integer> {
}
List-3.4 UserController的内容
import com.mjduan.project.catserviceb.entity.User;
import com.mjduan.project.catserviceb.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@Slf4j
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping(value = www.dasheng178.com"/queryUser/{id}")
public User queryUser(@PathVariable(value = "id") Integer id) {
log.info("查询用户,id={}", id);
Optional<User> optionalUser = userRepository.findById(id);
User user = optionalUser.isPresent() ? optionalUser.get() : null;
log.info("返回,{}", user);
return user;
}
@GetMapping(value = "/saveUser/{name}")
public User saveUser(@PathVariable(www.fengshen157.com/ value = "name") String name) {
log.info("新增用户,name={}", name);
User user = new User();
user.setAge(20);
user.setName(name);
User save = userRepository.save(user);
log.info("返回,{}", save);
return save;
}
}
4、验证
在浏览器地址栏中输入
List-4.1
#保存name为Tom的用户
http://localhost:9092/serviceB/saveUser/Tom
#查询Id为1的用户
http://localhost:9092/serviceB/queryUser/1
一些思考:
自动创建表结构,我们不需要手动去创建,我们修改实体的时候,系统会自动更新数据库中的表结构。
所有实体都继承BaseEntity,那么每个实体对应的数据库表,在创建日期、更新日期等共有属性都同一了,这样在一定程度上便于代码理解和系统维护。
5、Reference
Springboot配置mysql连接的部分配置参考:https://github.com/pristinecore/springbootsample/blob/master/springbootsample/src/main/resources/database.properties
格式化SQL输出的参考:https://www.yongshiyule178.com stackoverflow.com/questions/25720396/how-to-set-hibernate-format-sql-in-spring-boot
SpringBoot之使用jpa/hibernate的更多相关文章
- springboot 集成 jpa/hibernate
pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- SpringBoot + Jpa(Hibernate) 架构基本配置
1.基于springboot-1.4.0.RELEASE版本测试 2.springBoot + Hibernate + Druid + Mysql + servlet(jsp) 一.maven的pom ...
- javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful
一.介绍 1.springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之间 ...
- 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用
问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...
- [读书笔记] 四、SpringBoot中使用JPA 进行快速CRUD操作
通过Spring提供的JPA Hibernate实现,进行快速CRUD操作的一个栗子~. 视图用到了SpringBoot推荐的thymeleaf来解析,数据库使用的Mysql,代码详细我会贴在下面文章 ...
- SpringBoot整合StringData JPA
目录 SpringBoot整合StringData JPA application.yml User.class UserRepository.java UserController SpringBo ...
- SpringBoot整合SpringData JPA入门到入坟
首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...
- Spring Boot + Jpa(Hibernate) 架构基本配置
本文转载自:https://blog.csdn.net/javahighness/article/details/53055149 1.基于springboot-1.4.0.RELEASE版本测试 2 ...
- Springboot spring data jpa 多数据源的配置01
Springboot spring data jpa 多数据源的配置 (说明:这只是引入了多个数据源,他们各自管理各自的事务,并没有实现统一的事务控制) 例: user数据库 global 数据库 ...
随机推荐
- OpenGL(1)-环境搭建
写在前面 工作几年,开始沉心做技术,对自己的知识进行梳理. OpenGL是由khronos组织制定并维护的规范,并不是API. OpenGL在3.2之前采用的是立即渲染模式(固定渲染管线),3.2之后 ...
- 木马分析出现python语言,360的安全人员不禁感叹还有这种操作?
几年前,敲诈者木马还是一个默默无闻的木马种类.然而,由于其极强的破坏力和直接且丰厚的财富回报,敲诈者木马这几年已经一跃成为曝光率最高的木马类型——甚至超越了盗号木马.远控木马.网购木马这传统三强.与此 ...
- Netty源码分析第3章(客户端接入流程)---->第4节: NioSocketChannel注册到selector
Netty源码分析第三章: 客户端接入流程 第四节: NioSocketChannel注册到selector 我们回到最初的NioMessageUnsafe的read()方法: public void ...
- Flink 部署文档
Flink 部署文档 1 先决条件 2 下载 Flink 二进制文件 3 配置 Flink 3.1 flink-conf.yaml 3.2 slaves 4 将配置好的 Flink 分发到其他节点 5 ...
- go vendor 安装失败的原因分析
安装之前的配置 export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 1 2 安装 通常,我们查到的安装方法一般是下面这种 go get -u gi ...
- spring-session实现分布式集群session的共享(转)
原文: https://www.cnblogs.com/youzhibing/p/7348337.html HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保 ...
- fetch err : "Body not allowed for GET or HEAD requests"
在使用 fetch 的时候 报了 "Body not allowed for GET or HEAD requests" 这个错. 代码如下: 一番google , 找到答案了. ...
- Daily Scrum7 11.11
今日任务: 徐钧鸿:结束了SQL和Affairs的移植,修改了连接池,学习C#和java的正则表达式并且完成相关的移植 张艺:个人阅读作业 黄可嵩:完成高亮显示的移植,进一步移植搜索代码 徐方宇:继续 ...
- SQL语句联表查询
Natural join:字段名和数据类型相同字段进行等值连接: inner join:与join相同,把符合条件的元组选出来,创建视图时用的即是inner join: left join:左表全选出 ...
- Beat(2/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(2/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 做了点商家数据表格 接下来的计划 做 ...