本篇博客源码地址:https://github.com/DragonWatcher/ease-run
概述
Hibernate与JPA
本篇blog中的web项目选用Hibernate作为持久层框架。在springboot中,我们需要了解另一个概念:JPA
上一句话可能有些歧义,并不是说JPA就是springboot中的概念。而是Java Persistence Api,中文译名为:Java持久层Api。
JPA是一个基于O/R映射的标准规范,在这个规范中,JPA只定义标准规则,不提供实现。
目前,JPA的主要实现有Hibernate,EclipseLink,OpenJPA等。
由于Hibernate在数据访问解决技术领域的霸主地位,所以JPA标准基本由Hibernate主导。
SpringBoot这支自动步枪
spring框架中提供Spring Data JPA作为开发者应用Hibernate框架的依赖工具。我们的SpringBoot则提供了一款全自动的“自动依赖模块”: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等错误信息。
配置数据源信息
#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框架的整合使用,如果喜欢,还望评论三言两语!:-)