文档章节

SpringBoot之使用jpa/hibernate

克虏伯
 克虏伯
发布于 02/16 18:13
字数 673
阅读 15
收藏 0

    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 = "/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(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

    

    一些思考:

  1. 自动创建表结构,我们不需要手动去创建,我们修改实体的时候,系统会自动更新数据库中的表结构。
  2. 所有实体都继承BaseEntity,那么每个实体对应的数据库表,在创建日期、更新日期等共有属性都同一了,这样在一定程度上便于代码理解和系统维护。

5、Reference

  1. Springboot配置mysql连接的部分配置参考:https://github.com/pristinecore/springbootsample/blob/master/springbootsample/src/main/resources/database.properties
  2. 格式化SQL输出的参考:https://stackoverflow.com/questions/25720396/how-to-set-hibernate-format-sql-in-spring-boot

© 著作权归作者所有

共有 人打赏支持
克虏伯

克虏伯

粉丝 19
博文 372
码字总数 126395
作品 0
渝北
程序员
私信 提问
springboot 是如何帮我们省去web.xml配置的

概述 最开始使用原生的springmvc时,总是免不了有如下xml配置 但是,切换到springboot之后,web.xml之类的繁琐的配置基本上都不见了。出于好奇研究了下springboot究竟帮我们做了什么,我们可...

端吉
2018/06/23
0
0
springboot从入门到精通教程分享, 深度掌握Springboot实践技术教程

深度掌握Springboot实践技术教程,共22个课时,需要的可回复邮箱。 课程简介 day1 01springboot简介-曾经开发中的问题 02springboot解决的问题-优势以及弊端 03springboot环境准备 04spring...

小小倾听
2018/12/06
0
0
SpringBoot使用Jsp

本文是简单总结一下SpringBoot使用Jsp的Demo。 前言 在早期做项目的时候,JSP是我们经常使用的java服务器页面,其实就是一个简化servlet的设计,在本文开始之前,回顾一下jsp的几大对象,如图...

dalaoyang
2018/08/13
0
0
springboot(一)入门篇

今天来整理下springboot,开发工具使用eclipse(后期会再做个idea的).主要实现的功能是 1.通过数据库的查询返回前端数据. 第二步:新建entity 第三步:新建UserMapper(需要在application.propert...

zhuyuansj
2017/10/06
0
0
springboot学习(二)——springmvc配置使用

以下内容,如有问题,烦请指出,谢谢 上一篇讲解了springboot的helloworld部分,这一篇开始讲解如何使用springboot进行实际的应用开发,基本上寻着spring应用的路子来讲,从springmvc以及web...

嘻哈开发者
2018/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3.系统和内存架构

在设计程序或并发系统时,需要考虑不同的系统和内存架构风格。 支持并发的计算机系统体系结构 1972年,迈克尔弗林(Michael Flynn)给出了用于分类不同风格计算机系统体系结构的分类法。 该分类...

Eappo_Geng
24分钟前
4
0
今天的学习

1,getimagesize:获得目标图像的大小 2,image_type_to_extension:获得目标文件的后缀信息 3,imagealphablending:设定目标图像混色的模式 4,imagechar:水平的画出一个字符 5,imagecharup...

墨冥
27分钟前
1
0
Java线程中yield与join方法的区别

长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。...

飓风2000
51分钟前
4
0
Python的 is 和 == 弄懂了吗?

在Python中一切都是对象。 Python中对象包含的三个基本要素,分别是: id(身份标识) type(数据类型) value(值) 对象之间比较是否相等可以用 == ,也可以用 is 。 is 和 == 都是对对象进行比较...

上海小胖
51分钟前
2
0
angularJS 路由加载js controller 未定义 解决方案

说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案。 路由 $routeProvider 异步加载js 路由的基本用法,请查看官方文档,下面实例只说明,懒加载...

DrChenXX
59分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部