热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot讲解三:使用SpringDataJPA替换掉Mybatis框架

一、为什么使用Spring Data JPA上篇文章《SpringBoot讲解一:搭建SSM项目+Thymeleaf+HikariCP》之所以选用Mybatis框架,是因为SSM框架在国内大火了几年,

一、为什么使用Spring Data JPA

上篇文章《SpringBoot讲解一:搭建SSM项目+Thymeleaf+HikariCP》之所以选用Mybatis框架,是因为SSM框架在国内大火了几年,Mybatis几乎成了Java从业者的必备技术。十年前具有煊赫名头,被称之为Java三大框架的SSH,其中的Struts2和Hibernate已经少初学者问津了,而且就算在企业中也是纷纷弃用SSH,选用SSM。

而笔者实际上已经在项目中弃用Mybatis而使用Spring Data JPA了。
之所以这样,
第一,是因为SpringBoot推荐使用Spring Data JPA,大家也都知道只要是SpringBoot推荐使用的技术,SpringBoot都对它们提供了更好的衔接和支持。
第二,Spring Data JPA对Sun的JPA技术做了一定的改进,使用起来更加人性化。其底层实现是Hibernate,Hibernate曾经因为它的繁琐配置和API让人望而却步,但应该没有人质疑它的功能和性能。当初很多人弃用Hibernate这个全ORM框架而选用Mybatis这个半ORM框架就是因为现在我们不想记Hibernate的那些繁琐配置,而退而求其次的使用MyBatis重新写sql语句。而现在只需要使用SpringDataJPA提供的注解和API,就能方便的让底层Hibernate干活,不用书写mysql语句,不用像Mybatis那样捯饬参数、一对多、多对一、多对多关联等等,何乐而不为。

MyBatis这些年其实也有很多插件对它进行简化开发,如mybatis-generator、TKmybatis、mybatis-plugs等等,其实细看来,都是为了避免书让开发者写过多的sql语句,也就是再往另一个Hibernate上发展。但是其对于多表关联关系的处理、性能上跟Hibernate是无法相提并论的。

当然,如果你要继续使用mybatis的话,不会影响接下来的学习,因为本课程起点较高,默认大家已经掌握了SSM框架,dao层不会有复杂操作,用具体哪个持久化框架根据自己喜欢即可。

二、Spring Data JPA简介

Spring Data JPA是Spring提供的一套简化Sun公司的JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

Spring Data JPA 提供了两种Dao层访问数据库的方式:EntityManager和Repository。
其中EntityManager是java.persitince.jpa包下的,用法跟Hibernate的dao层一样,建接口,再建daoImpl实现类。里面用entityManager取代hibernate的session做数据的处理。

另一种是Repository的形式,跟mybatis有点相似,只写接口不写实现类,而且也不用写MyBatis所需要的Sql语句。现在流行使用的正是这一种,以下也是对这样方式的讲解介绍。

三、Spring Data JPA的使用

1.加入依赖:

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>

注意,如果是基于上一个项目的,需要去除掉Mybatis依赖

2.yml中配置

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/company5?serverTimezOne=UTC&characterEncoding=UTF-8
username: root
password: 123
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
format_sql: true
enable_lazy_load_no_trans: true
show-sql: true
open-in-view: true

使用Mybatis的话,可以利用一些Mybatis的插件根据表来生成实体类,而Hibernate是一个全ORM框架,让开发者不必关心数据库,甚至不需要打开数据库(当然这是理想化的状态,我们测试的时候还得打开数据库看数据的)了,所以它不能通过表生成实体类,但是却可以通过实体类生成表,以上hbm2ddl的配置就是如此,值为update就是说如果实体类更新了,会将表结构也对应更新。

3.实体类

@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)//会在mysql中建立唯一索引
private String name;
@Column(nullable = false)
private String sex;
@Column(nullable = false)
private int age;
@JoinColumn(name="d_id")
@ManyToOne(cascade = CascadeType.MERGE)
private Department dep;
public Employee() {
}
public Employee(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Department getDep() {
return dep;
}
public void setDep(Department dep) {
this.dep = dep;
}
}


@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
//@JoinColumn(name = "d_id")
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "dep",fetch=FetchType.LAZY)
private List<Employee> emps;
public Department() {
}
public Department(String name) {
this.name = 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;
}
public List<Employee> getEmps() {
return emps;
}
public void setEmps(List<Employee> emps) {
this.emps = emps;
}
}

4.dao层结构

在这里插入图片描述
继承自JpaRepository类后,已经继承了很多默认的方法,如findById,findAll,save,delete等方法,如果实际项目中有这些方法不能解决的问题,则可以自定义方法:

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
List<Employee> findBySexOrAge(String sex, int age);
List<Employee> findByName(String name);
@Query("from Employee as e left join fetch e.dep where e.id=:id")
List<Employee> searchHql(Long id);
}

以findBy开头,加上实体类中的属性名,可以使用and和or等连接词进行与或查询,也可以使用与Hibernate的HQL几乎一样的JPQL语句进行查询,也可以使用本地SQL进行查询。

至此,大家便可以通过以上内容,来使用JPA替代Mybatis进行项目开发,如果想要深入学习Spring Data JPA,可以看我下一篇文章《SpringBoot讲解三:Spring Data JPA精讲》。


版权声明:本文为GodBlessYouAndMe原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/GodBlessYouAndMe/article/details/103385535
推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
author-avatar
手机用户2602884633
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有