Spring Data JPA和MyBatisPlus比较以及SpringBoot整合

news2024/11/25 6:42:57

文章目录

    • 一.基本概念
  • 二.SpringBoot JPA整合hibernate -yml配置
  • 三.SpringBoot整合MyBatisPlus


一.基本概念

Spring Data JPA
作用:面向对象的ORM全自动化框架,简化持久化操作的开发工作:让开发者从繁琐的JDBC和SQL代码中解脱出来,直接面向对象持久化操作.
特点:跨数据库换源方便
底层基于hibernate实现JPA实现
MySql中新建数据库,命名为springbootjpa,不用建表,运行项目后会自动生成表。
复杂sql支持原生语句
具备多表关联操作.配置好关联关系,自动处理关联操作
缺点:没有实现独立的增删改操作,必须先查询
复杂原生sql与代码耦合度高
Id 雪花算法需要自己开发
需要自己处理count查询
MyBatisPlus
作用:面向对象的ORM全自动化框架,简化持久化操作的开发工作:让开发者从繁琐的JDBC和SQL代码中解脱出来,直接面向对象持久化操作.
特点:无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence)
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎
内置分页插件:基于 MyBatis 物理分页
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
MySql中新建数据库,命名为springbootjpa,不用建表,运行项目后会自动生成表.
缺点:项目引入第三方插件包,未来升级有一定的兼容性问题.
社区技术迭代行快,从而会导致有效部分技术文档得不到及时更新.

总结: hibernate性能不如MyBatisPlus.但深刻体现面向对象编程的思想无需关注表结构和实体对象的关系.在小项目上hibernate更加方便.而对于复杂业务MyBatisPlus就更胜一筹;

详见hibernate与MyBatisPlus的优劣

二.SpringBoot JPA整合hibernate -yml配置

demo结构
在这里插入图片描述
pom

    <dependencyManagement>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.6.3</version>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-bom</artifactId>
                <version>2022.0.1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.11</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </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>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

yml

server:
  port: 8080
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
    username: root
    password: root

  jpa:
    # 默认检测
    database: mysql
    # 默认检测 数据库名称
    database-platform: test
    # 是否在启动时候初始化架构 generate  hibernate.auto二选一
    # generate-ddl: true
    # 表生成策略 默认none
    # update 如果没有表就自动创建,有就检查更新
    # create 创建
    hibernate:
      ddl-auto: update
      # physical-strategy 默认直接映射
      # SpringPhysicalNamingStrategy 驼峰命名映射为大写变下划线
#      naming:
#        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
    # properties 提供hibernate更多的原生配置
    properties:
      hibernate:
        # 配置方言:选择数据库类型 查看Dialect类的所有接口实现.
        dialect: org.hibernate.dialect.MySQL8Dialect
        # 控制台显示sql
        format_sql: true
        # 允许在日志中记录sql语句 默认false
        show-sql: true

主启动类

@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.vector.dao")
@EnableTransactionManagement
public class HibernateApplication {
    public static void main(String[] args) {
        SpringApplication.run(HibernateApplication.class);
    }
}

dao

@Repository
public interface CustomerDao extends PagingAndSortingRepository<Customer,Long> {
}

单元测试

@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class SpringDataJpaTest {
    @Resource
    CustomerDao repository;

    @Test
    public void testR() {
        Optional<Customer> byId = repository.findById(1L);
        System.out.println(byId.get());
    }

    @Test
    public void testC() {

        Customer customer = new Customer();
        customer.setCustId(3L);
        customer.setCustName("王五");

        repository.save(customer);
    }

    @Test
    public void testD() {
        Customer customer = new Customer();
        customer.setCustId(3L);
        customer.setCustName("李四");

        repository.delete(customer);
    }

    @Test
    public void testE(){
        log.info("查询所有数据: {}",repository.findAll());
    }
}

三.SpringBoot整合MyBatisPlus

MyBatisPlus官方文档

MyBatisPlus逆向工程

pom

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

yml

## MyBatis配置
#mybatis:
#    # 搜索指定包别名
#    typeAliasesPackage: com.vector.**.domain
#    # 配置mapper的扫描,找到所有的mapper.xml映射文件
#    mapperLocations: classpath*:mapper/**/*Mapper.xml
#    # 加载全局的配置文件
#    configLocation: classpath:mybatis/mybatis-config.xml

# MyBatis-plus配置
mybatis-plus:
  type-aliases-package: com.vector.**.pojo
  # mapper-locations: classpath*全包依赖扫描; classpath自己的mapper
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  #  统一设定自增主键
  global-config:
    db-config:
      id-type: auto
      logic-delete-value: 1
      logic-not-delete-value: 0

main

@SpringBootApplication
@MapperScan("com.vector.**.dao")
@EnableTransactionManagement
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

dao

@Mapper
public interface CategoryMapper extends BaseMapper<Article> {

}

在这里插入图片描述

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

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

相关文章

Elasticsearch:在搜索中使用衰减函数(Gauss)

在我之前的文章 “Elasticsearch&#xff1a;使用 function_score 及 script_score 定制搜索结果的分数” 我有讲到 Decay 函数在搜索中的使用。在那里&#xff0c;我有一个例子讲述在规定的时间里&#xff0c;分数不进行衰减。同一的函数也可以适用于地理位置的搜索。位置搜索…

C++原子变量atomic详解

C原子变量atomic详解一、简介二、成员函数2.1、构造函数2.2、is_lock_free函数2.3、store函数2.4、load函数2.5、exchange函数2.6、compare_exchange_weak函数2.7、compare_exchange_strong函数2.8、专业化支持的操作三、使用示例总结一、简介 原子类型的对象包含特定type ()的…

分享5个超好用的Vue.js库

开发人员最好的朋友和救星就是这些第三方库&#xff0c;无论是开发新手还是经验丰富的老手&#xff0c;我们都喜欢开源软件包。借助开源库加速Vue项目的开发进度是现代前端开发比较常见的方式&#xff0c;这几个 Vue.js库&#xff0c;建议尽早用上&#xff0c;加速你的项目开发…

集合(Set、Collections、Map、集合嵌套)

目录 Set系列集合 Set系列集合概述 HashSet元素无序的底层原理&#xff1a;哈希表 HashSet元素去重复的底层原理 实现类&#xff1a;LinkedHashSet 实现类&#xff1a;TreeSet Collection体系的特点、使用场景总结 补充知识&#xff1a;可变参数 补充知识&#xff1a;集…

自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改,删除,新增操作

Jmeter也可以连接mysql数据库&#xff0c;通过JDBC去调用数据库内的参数到HTTP请求中进行接口测试&#xff0c;可以说是相当方便 自动化测试实战篇&#xff08;7&#xff09;jmeter连接mysql数据库&#xff0c;实现单表、多表、三表查询&#xff0c;并对表中数据进行修改&#…

多线程带来的的风险-线程安全

❣️关注专栏&#xff1a;: JavaEE 这篇文章将为大家描述线程安全问题的原因和解决方案。线程安全是多线程编程中最难的地方&#xff0c;也是重要的地方&#xff0c;还是一个最容易出错的地方&#xff0c;也是面试中容易考的要点&#xff0c;同样也是我们以后工作中经常爱出错的…

【软件测试】8年资深测试总结出的测试学习经验,从入门到测试开发......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试圈子里有一句话…

Python语言零基础入门教程(九)

Python pass 语句 Python pass 是空语句&#xff0c;是为了保持程序结构的完整性。 pass 不做任何事情&#xff0c;一般用做占位语句。 Python 语言 pass 语句语法格式如下&#xff1a; pass测试实例&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 Pytho…

Caused by: java.sql.SQLException: ORA-28040: 没有匹配的验证协议

更改Oracle的配置文件&#xff1a;Oracle -> app -> ... ->...dbhome... -> admin重启Oracle:重启Oracle数据库的操作步骤1.查看监听器状态&#xff1a;lsnrctl status2.停止监听器&#xff1a;lsnrctl stop3.连接数据库&#xff1a;sqlplus / as sysdba4.停止数据…

怡合达业务大规模容器化最佳实践

作者&#xff1a;肖念康&#xff0c;东莞怡合达智能制造供应链资深 Java 开发工程师&#xff0c;主要负责公司内部 DevOps、代码托管平台、任务需求管理平台的研发及其他项目的管理&#xff0c;云原生的研究与开发工作。 公司简介 怡合达致力于自动化零部件研发、生产和销售&am…

[C++] -- 模板初阶

文章目录函数模板函数模板的隐式实例化显式实例化模板参数的匹配原则类模板模板函数声明和定义分离会链接错误函数模板 对于一些参数不同但功能类似的函数&#xff0c;C有函数重载&#xff0c;但是函数重载有一些缺陷&#xff1a; 重载的函数只是参数不同&#xff0c;代码复用…

【五六七人口普查】我国省市两级家庭户住房状况

人口数据是我们在各项研究中最常使用的数据&#xff01;之前我们分享过第七次人口普查&#xff08;简称七普&#xff09;的数据&#xff01;很多小伙伴拿到数据后都反馈数据非常好用&#xff0c;同时很多小伙伴咨询有没有前面几次人口普查的数据&#xff0c;这样方便做人口变化…

7.1 微服务-SpringCloud(二)

目录 前言 7.1.5 Hystrix 7.1.5.1 什么是Hystrix 7.1.5.2 雪崩问题 7.1.5.3 线程隔离&#xff0c;服务降级 7.1.5.4 搭建 7.1.5.4.1 引入依赖 7.1.5.4.2 开启熔断 7.1.5.4.3 编写降级逻辑 1.局部降级逻辑 2.全局降级逻辑 7.1.5.4.4 设置超时 7.1.5.5 服务熔断 7.…

2023-02-09 - 1 Elasticsearch简介

1 Elasticsearch的基本概念 1.1 索引 在使用传统的关系型数据库时&#xff0c;如果对数据有存取和更新操作&#xff0c;需要建立一个数据库。相应地&#xff0c;在ES中则需要建立索引。用户的数据新增、搜索和更新等操作的对象全部对应索引。 1.2 文档 在使用传统的关系型数…

上海亚商投顾:三大指数均涨超1% 芯片板块集体大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日低开高走&#xff0c;午后集体涨超1%&#xff0c;创业板指盘中涨超1.7%。芯片板块集体大涨&#xff0c;…

Node——使用nvm切换node版本

1. 下载mvn安装包 https://pan.baidu.com/s/1alfyRvwVWr_TrkN0A9Er5g?pwd1v7c 2. 安装后命令输入mvn -v 验证是否安装成功 3. mvn命令 nvm list available 显示可下载的版本nvm install [node版本号] 显示可下载的版本nvm uninstall [node版本号] 删除已安装的指定版本nvm…

内网资源探测

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;内网安全 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远是…

计算机软件技术基础复习

数据结构 文章目录数据结构第一节 数据结构的基本概念第二节 线性结构线性表顺序表和链表的特点实现循环队列第三节 非线性结构树操作系统操作系统概述进程和程序存储空间的组织数据库技术数据库设计软件技术软件生命周期第一节 数据结构的基本概念 数据结构&#xff1a;指相互…

SQLSERVER 的 truncate 和 delete 有区别吗?

一&#xff1a;背景 1. 讲故事 在面试中我相信有很多朋友会被问到 truncate 和 delete 有什么区别 &#xff0c;这是一个很有意思的话题&#xff0c;本篇我就试着来回答一下&#xff0c;如果下次大家遇到这类问题&#xff0c;我的答案应该可以帮你成功度过吧。 二&#xff1…

Vue2.0页面缓存机制联合页面标签的交互(keep-alive + router)

预期效果&#xff1a;&#xff08;借助iview-ui的在线体验页面示意一下&#xff09; 项目中只有一部分页面需要缓存&#xff0c;且存在多级路由的页面。每打开一个菜单&#xff0c;就会新增一个 Tab标签&#xff0c;只要 Tab标签不关闭&#xff0c;对应的页面就会被缓存&#x…