SpringBoot————JPA快速使用

本篇博客源码地址: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框架的整合使用,如果喜欢,还望评论三言两语!:-)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL优化建议汇总~~~

MySQL优化建议汇总~~~1、将经常要用到的字段&#xff08;比如经常要用这些字段来排序&#xff0c;或者用来做搜索&#xff09;&#xff0c;则最好将这些字段设为索引 2、字段的种类尽可能用int或者tiny int类型。另外字段尽可能用not null 3、当然无可避免某些字段会用到text&a…

Spring Boot————静态方法如何调用Spring容器中的Bean

问题分析 在使用静态方法的时候&#xff0c;某些情况下&#xff0c;需要使用类似自动注入的Bean来实现某些业务逻辑。 一般的非静态方法&#xff0c;可以很容易的通过在方法所在的类中Autowired自动将依赖的Bean注入到本类中&#xff0c;并操作。 静态方法在使用同样的操作流…

内部类详解————匿名内部类

内部类三连击&#xff1a; 《内部类详解————匿名内部类》 《内部类详解————局部内部类》 《内部类详解————静态嵌套类》 应用场景 由于匿名内部类不利于代码的重用&#xff0c;因此&#xff0c;一般在确定此内部类只会使用一次时&#xff0c;才会使用匿名内部…

内部类详解————局部内部类

内部类三连击&#xff1a; 《内部类详解————匿名内部类》 《内部类详解————局部内部类》 《内部类详解————静态嵌套类》 定义 在方法或某个作用域内的内部类&#xff0c;称为局部内部类。匿名内部类就是一种局部内部类。 实现方式 public class OutterType …

内部类详解————静态内部类

内部类三连击&#xff1a; 《内部类详解————匿名内部类》 《内部类详解————局部内部类》 《内部类详解————静态内部类》 定义 静态内部类&#xff0c;又叫静态嵌套类或嵌套类。是使用static关键字修饰的内部类。 静态内部类可以用 private 修饰&#xff0c;这…

jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

jvm gc&#xff08;垃圾回收机制&#xff09; Java JVM 垃圾回收&#xff08;GC 在什么时候&#xff0c;对什么东西&#xff0c;做了什么事情&#xff09; 前言&#xff1a;&#xff08;先大概了解一下整个过程&#xff09;作者&#xff1a;知乎用户 链接&#xff1a;https:…

【Mathematical Model】Ransac线性回归Python代码

Ransac算法&#xff0c;也称为随机抽样一致性算法&#xff0c;是一种迭代方法&#xff0c;用于从一组包含噪声或异常值的数据中估计数学模型。Ransac算法特别适用于线性回归问题&#xff0c;因为它能够处理包含异常值的数据集&#xff0c;并能够估计出最佳的线性模型。 1 简介 …

异常解析————Parameter metadata not available for the given statement

引言 在将数据存入mysql数据库时抛出异常&#xff1a;Parameter metadata not available for the given statement。参数元数据对于给定的声明不可用。 SQL本身并没有错误&#xff1a; Autowiredprivate JdbcTemplate jdbc;public Integer saveScenicSequence(ScenicSequence…

Swagger使用————接口参数注解的使用缺陷

问题描述 在使用springboot开发web项目时&#xff0c;用到了swagger框架&#xff0c;来生成web api文档。但是其中有一项是举例说明参数的结构&#xff0c;如下图&#xff1a;但是&#xff0c;这个功能真的是非常方便&#xff0c;因为可以让前端开发人员第一时间得知参数的内部…

分布式事务最终一致性常用方案

分布式事务最终一致性常用方案目前的应用系统&#xff0c;不管是企业级应用还是互联网应用&#xff0c;最终数据的一致性是每个应用系统都要面临的问题&#xff0c;随着分布式的逐渐普及&#xff0c;数据一致性更加艰难&#xff0c;但是也很难有银弹的解决方案&#xff0c;也并…

数据列表的分页实现————分页敏捷开发

概要 分页功能是比较常见的基础功能&#xff0c;虽然比较简单&#xff0c;但是每次需要用到这个功能的时候还是需要现写一遍。为了实现更加宏观的业务复用&#xff0c;特将本人特别喜欢的简易分页逻辑在此记述&#xff0c;以备日后重用。 逻辑描述 一般的分页实现方式多是通…

Eclipse深度患者设置VSCode快捷键

VSCode设置Eclipse中常用的快捷键 将eclipse中一些基本的快捷键输入右侧用户快捷键设置中&#xff1a; // Place your key bindings in this file to overwrite the defaults [{ "key": "alt/", "command": "editor.action.triggerSugges…

NodeJS学习————关于let和const命令的使用理解

let的基本用法 在新的js规范ES6中&#xff0c;新增了let 命令&#xff0c;用来声明变量。用法类似于var&#xff0c;但不同的是所声明的变量&#xff0c;只在let 命令所在的代码块内有效。 { let a 10; var b 10; } //ReferenceError: a is not defined console.log(a …

forward和redirect的区别是什么?

forward和redirect是什么&#xff1f; 是servlet种的两种主要的跳转方式。forward又叫转发&#xff0c;redirect叫做重定向。 区别&#xff1a;&#xff08;本地效应次数&#xff09; 地址栏&#xff0c;数据共享&#xff0c;应用场景&#xff0c;效率&#xff0c;本质&…

MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

一、MySQL索引类型 MySql常见索引类型有&#xff1a;主键索引、唯一索引、普通索引、全文索引、组合索引 PRIMARY KEY&#xff08;主键索引&#xff09; ALTER TABLE table_name ADD PRIMARY KEY ( column ) UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE (colu…

Servlet入门总结

一、了解Servlet的概念Servlet定义&#xff1a;Servlet是基于Java技术的Web组件&#xff0c;由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互。 注意&#xff1a;Servlet不是从…

MySQL日期类型的处理总结

一、概述 MySQL中的日期类型包括以下5种&#xff1a; 类型大小 (字节)范围格式用途DATE31000-01-01/9999-12-31YYYY-MM-DD日期值TIME3-838:59:59/838:59:59HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:…

详解HTTP协议~~~

详解HTTP协议~~~HTTP 简介HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。。HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;…

Mybatis Plus————代码生成器

代码生成器 MyBatis Plus是MyBatis的扩展框架&#xff0c;而代码生成器是MP的核心功能之一&#xff0c;另外还有 “条件构造器”和“通用CRUD”等功能。 步骤演示 mp的代码生成器有两种方式自动生成代码&#xff0c;一种是通过main方法来执行程序&#xff0c;另一种是通过maven…

Spring MVC 流程图解析

Spring MVC 流程图解析Spring MVC工作流程图图一图二 SpringMVC工作流程描述DispatcherServlet&#xff0c;HandlerMapping&#xff0c;HandlerExecutionChain&#xff0c;HandlerAdapter&#xff0c;HttpMessageConveter&#xff0c;BindingResult&#xff0c;ModelAndView&am…