本篇博客源码地址:https://github.com/DragonWatcher/ease-run

概述

Hibernate与JPA

本篇博客中的web项目选用Hibernate作为持久层框架。在Spring Boot中,我们需要了解另一个概念:JPA

上一句话可能有些歧义,并不是说JPA就是Spring Boot中的概念。而是Java Persistence Api,中文译名为:Java持久层Api。

JPA是一个基于ORM(或叫O/R mapping ,对象关系映射)的标准规范,在这个规范中,JPA只定义标准规则,不提供实现。

目前,JPA的主要实现有Hibernate,EclipseLink,OpenJPA等。

由于Hibernate在数据访问解决技术领域的霸主地位,所以JPA标准基本由Hibernate主导。

SpringBoot这支自动步枪

spring框架中提供Spring Data JPA作为开发者应用Hibernate框架的接口工具。我们的Spring Boot则提供了一款全自动的“自动依赖模块”:spring-boot-starter-data-jpa

在start.spring.io页面中的依赖搜索框中去搜索jpa,即可获得与jpa相关的全套服务。

快速实现数据操作

Pom依赖结构

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

说明:mysql-connector-java提供了mysql驱动等类库,此处必须引入此依赖,否则将会提示:

Cannot load driver class: com.mysql.jdbc.Driver等错误信息。

配置数据源信息

官方配置信息可以参考:Appendix A. Common application properties

应用案例如下:

#mysql
spring.datasource.url=jdbc:mysql://localhost:3306/ease-run?useunicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

上述配置信息保存在springboot的application.properties配置文件中。其中url信息的末尾追加了编码等参数,是为了解决中文数据的查询问题(目前只注意到了查询的时候在通过Hibernate的HQL进行数据查询时,即便传入的参数是正常的中文字符,且数据库中也有对应的中文数据,在返回时也会为null的情况,修改删除等操作一定也会出现类似问题)。

spring.jpa.hibernate.naming-strategy是定义HibernateO/R映射字段的命名策略,spring.jpa.properties.hibernate.dialect为Hibernate的数据库方言。另外还有一些其他jpa配置信息,篇幅有限,可查阅jpa(hibernate)架构基本配置相关。

添加启动类注解

@EnableJpaRepositories

创建实体类

为了避免频繁书写部分注解,我们可以通过继承的方式来书写实体类:

基类:

import java.io.Serializable;import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;@MappedSuperclass
public class BaseEntity implements Serializable{@Id@GeneratedValue(strategy = GenerationType.AUTO)protected Long id;@Column(name = "name")protected String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

子类:

import javax.persistence.Entity;
import javax.persistence.Table;@Entity
@Table(name = "yyh_user")
public class User extends BaseEntity{
}

上述两个类中,注解@MappedSuperclass和@Entity是必须的。

其中,@MappedSuperclass标识基类,这个基类不会以一个实体记录的形式映射到数据库中,但继承它的子类在映射数据库的时候会自动扫描该基类实体的映射属性,不论是自动建表、添加记录、查询等操作,都可以虽子类中的属性一同映射到数据库中。@Entity标识一个实体类,任何Hibernate映射对象都要有这个注解。

使用方式:

1.@MappedSuperclass注解使用在一个实体类父类上,来标识这个父类。

2.@MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但它所拥有的属性能够映射到其子类所在的表中。

3.@MappedSuperclass标识的类不能再有@Entity和@Table注解。

定义数据库操作接口

package com.mht.dao.repository;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;import com.mht.dao.entity.User;@Repository
public interface UserRepository extends JpaRepository<User, Integer>{public User findById(Long id);public User save(User user);@Query(value = "SELECT u FROM User u WHERE name=:name")public User findName(@Param("name") String name);}

数据库操作接口继承自JpaRepository泛型类,在继承之时,即获得了其赐予开发者的神之力量:

我们可以直接调用这些方法,进行数据库操作,同时我们也可以通过自定义HQL来完成符合个性的其他操作,如:

@Query(value = "SELECT u FROM User u WHERE u.name=:name")
public User findName(@Param("name") String name);

这段代码中,通过@Query注解,完成了HQL的书写,其中“:name”与下方的@Param注解中参数保持一致。

注意:在HQL中的表名应该是ORM映射的类名,而且HQL与传统的SQL语句有一些出入,比如“*”的意义不尽相同等等。

如果不习惯使用HQL,也可以使用SQL语句:

@Query(value = "SELECT * FROM yyh_user WHERE name=?", nativeQuery = true)
public User findName(String name);

上述方法,在执行时亲测依然奏效,nativeQuery为true代表使用SQL语言。

完成Controller与Service实现

在Service中添加依赖对象:

@Autowired
private UserRepository userRpy;

controller类似,在此不再赘述。

启动项目

Hibernate会自动将实体类映射到数据库中,为我们建立相关的数据库表,它会根据@Table、@Column、@Id、@GeneratedValue(strategy = GenerationType.AUTO)等注解实现数据库表的自动匹配。省去了大量建表的工作。

hibernate_sequence表是@GeneratedValue注解完成的id生成策略,GenerationType.AUTO代表自动生成,前提是id属性必须是int或者long类型的属性,如果是String类型的id,那么添加此注解于id之上,会立即报错。因此,如果是针对于String类型的id,则不需要为id添加@GeneratedValue(strategy = GenerationType.AUTO)注解。

请求测试

分别通过get和post来完成数据的请求和数据的保存。

GET请求:

POST数据推送:

先来看一下数据库

推送数据:

数据库:

GET再查询:

以上就是springboot对hibernate框架的整合使用,如果喜欢,还望评论三言两语!:-)

SpringBoot————JPA快速使用相关推荐

  1. 补习系列(19)-springboot JPA + PostGreSQL

    目录 SpringBoot 整合 PostGreSQL 一.PostGreSQL简介 二.关于 SpringDataJPA 三.整合 PostGreSQL A. 依赖包 B. 配置文件 C. 模型定义 ...

  2. 基于 SpringBoot + jpa + Erupt 后台框架开发的综合签到打卡系统【100010425】

    基于 SpringBoot + jpa + Erupt 后台框架开发的综合签到打卡系统 一 .项目背景及需求分析 用户在可靠验证下实现简化身份确认 在已有用户数据库基础上 传统校验方式: 直接选择 = ...

  3. 解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题)

    解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题) 参考文章: (1)解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题) (2)https: ...

  4. java sql sum函数的使用方法,Springboot jpa使用sum()函数返回结果如何接收

    1.需求 我的需求是统计域名以及域名出现的次数. 之前使用springboot jpa都是把数据库中的表跟实体类绑定,创建继承JpaRepository的接口.如下: @Repository publ ...

  5. springboot+jpa+mybatis 多数据源支持

    springboot+jpa+mybatis 多数据源支持 配置dataSource import org.springframework.beans.factory.annotation.Quali ...

  6. springboot+jpa+mysql+redis+swagger整合步骤

    springboot+jpa+MySQL+swagger框架搭建好之上再整合redis: 在电脑上先安装redis: 一.在pom.xml中引入redis 二.在application.yml里配置r ...

  7. springboot jpa sql打印_SpringBoot集成Spring Data JPA以及读写分离

    相关代码:github OSCchina JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理 ...

  8. 玩转 SpringBoot 2 快速整合 | RESTful Api 篇

    概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...

  9. 玩转 SpringBoot 2 快速整合 | JSP 篇

    前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面.作为Java技术系列的一部分,JSP技术可以快速开发独立 ...

最新文章

  1. USACO1.1 Broken Necklace (beads)
  2. PHP获取其他网站上的内容,php – 从外部网站获取DIV内容
  3. 基于Levenberg-Marquardt训练算法的BP网络Python实现
  4. Kafka broker配置介绍 (四)
  5. Eclipse中安装freemarker插件
  6. www.opensymphony.com - Class: java.net.PlainSocketImpl
  7. 【金三银四】微软java后端社招
  8. 前端学习(2474):页面布局
  9. linux中的文件权限drm解释,DRM内核源码分析之三
  10. MFC:ListControl用法
  11. 单主复制与多主复制入门
  12. Qt Http实现网络文件下载
  13. Structs2-Action
  14. zigbee学习之zigbee应用框架
  15. 使用 Python 制作黑白照片生成器
  16. ImageIO 本地读取,网络下载图片
  17. 鸿蒙开发工具在哪下载,【鸿蒙开发工具下载】华为鸿蒙开发工具软件下载 v2.1.8 最新版-七喜软件园...
  18. 咋么用计算机打出,键盘怎么输入符号_怎么用电脑键盘打符号-win7之家
  19. 我们如何造红色敞篷跑车
  20. 常见外包公司(非全部)

热门文章

  1. 结语|日拱一卒无有尽,功不唐捐终入海
  2. 被一个熟悉的面试题问懵了:StringBuilder 为什么线程不安全?
  3. Java中所有锁介绍
  4. java更改用户邮箱_git修改user.name 和user.email
  5. ip,子网与子网掩码
  6. oracle10g检测未通过,win64bit安装oracle 10g版本检查未通过解决 提示要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1...
  7. 保存图像_06 - matplotlib中应知应会numpy存储、交换图像
  8. c++new时赋初值_C高级编程精髓之内存管理,万千码农踩过的雷,大神带你走出雷区...
  9. DS1819 对应版本的FFMPEG_OpenCV开发笔记(七十):红胖子带你傻瓜式编译VS2017x64版本的openCV4...
  10. 微信公众号文章中的音乐怎么设置自动播放