我的编程空间,编程开发者的网络收藏夹
学习永远不晚

选择MyBatis还是JPA

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

选择MyBatis还是JPA

这篇文章将为大家详细讲解有关选择MyBatis还是JPA,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

我扔掉了JPA

我仔细想了一下,有下面几点原因,造成了JPA在很多团队根本就玩不下去。

  1. JPA适合业务模型固定的场景,适合比较稳定的需求。但是国内这种朝三暮四的需求风格,产品经理这种传话筒式的设计模式,造成了需求的泛滥和不确定。JPA在这种模式下就是渣。

  2. JPA的技术要求比较高。不要怀疑,你刚开始用起里可能觉得非常简单。但随着你的深入使用,你会发现这是一个灾难。里面的各种转换和缓存,会把人绕晕。而大多数的快餐程序员是不想要了解这些的。

  3. 很多程序员很会写SQL,所以很多SQL语句长的很胖,长的要命。业务混乱,多张表关联,我甚至见过上百张业务表关联的复杂业务。DBA无奈之下,通常都会有sql审核。JPA搞sql审核?还是弱了一点。

所以,不是JPA不好,而是它不符合国情而已。想要在公司内推行JPA,你需要给我一个稳定的产品团队、一个牛X的技术团队才行。

所以,大多数公司宁可写一堆重复的、乱七八糟的 MyBatis 代码,也不会轻易尝试JPA,这是符合逻辑的,符合事物发展规律的。

所以,我们下面的文章就是来讨论 MyBatis 的,来看一下 MyBatis 到底要怎么写才算优雅。

MyBatis为什么不好用

优秀的程序员都是很懒的。所以很多人不想设计实体的 sql。 JPA 可以直接根据 Java 的实体代码,生成 sql 的库表,这在使用 MyBatis 的人来看,是非常羡慕的。

使用MyBatis,要倒着来。需要先设计库表,然后根据库表反向生成一堆Java代码和配置文件。

这个代码生成器,就是mybatis-generator

但是,请注意。这个生成器生成的代码,有四种模式!!!这就是最让初学者难受的地方。如果你也是刚接触MyBatis,强烈推荐只关注下面第一种模式。

  • MyBatis3 这种模式就是我们常用的方式,会生成domain类、Example类、mapper映射文件等。它生成的信息比较啰嗦,内容几乎无法改动。对于项目中自己写的sql,一般都采用手写的方式再写一份,而不是改动原来的文件。

  • MyBatis3Simple 上面这种模式的简易代码生成模式,缺少一些东西,但很简洁。对MyBatis没有经验,不推荐使用它。

  • MyBatis3DynamicSql 这是通过Builder模式实现的动态SQL特性,你还需要加入额外的jar包。加上它之后,其实和JPA是有点相似的。既然如此,那为何不直接使用JPA呢?所以这个DSQL虽然是默认的生成行为,但是非常不推荐。

  • MyBatis3Kotlin 这个不废话。就是生成Kotlin版的一些配置和代码信息。

所以,下面仅仅介绍MyBatis3模式的代码生成。

要使用它,需要在pom.xml里加入它的依赖。

org.mybatis.generator    mybatis-generator-core    true    test    1.4.0

我个人喜欢使用 Java 代码来操作代码生成这个过程,所以下面就是生成代码的代码。

public class MBGTool {    public static void main(String[] args) throws Exception {        List warnings = new ArrayList();        boolean overwrite = true;        InputStream configFile = MBGTool.class.getResourceAsStream("/generator/generatorConfig.xml");        ConfigurationParser cp = new ConfigurationParser(warnings);        Configuration config = cp.parseConfiguration(configFile);        DefaultShellCallback callback = new DefaultShellCallback(overwrite);        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);        myBatisGenerator.generate(null);    }}

从代码中,我们可以看到需要配置一个generatorConfig.xml文件,用来规定怎么生成代码文件。

                                                                                            <table tableName="test"/>

运行我们的MBGTool文件之后,就可以生成 MyBatis 的代码了。

怎么写代码最优雅

但是,我这里并不是要推荐你使用这种模式。因为,它生成了一大堆无用的文件。假如你的项目使用了 sonar 这样的代码质量审查工具,你会发现很多飘红的地方,还有那要命的覆盖率问题。

怎么办?

经过我多年的摸索,我现在推荐一种非常好用的写法。自从我采用了这种方式之后,就再也没有换过。

第一、不需要代码生成器了

数据表的设计,还有 domain 的书写,全部靠手工。这样我们的代码,如果有必要,还可以迁移到 JPA 上去。这种模式还能顺便学习一下 Java 里面的数据类型,是如何和 SQL 里的数据类型一一对应的。在做表设计的时候,顺便能够了解一些背后的原理。

第二、不需要写映射文件了

生成器生成的东西,确实是有一堆无用的逻辑。比如我的某个数据表,根本不需要提供查询所有和删除这种动作,它还是默认提供了。

在这种简约模式下,我们直接手写 Mapper 文件,然后只声明所需要的接口方法就可以了。

@Mapperpublic interface AccountBasicMapper {    @Insert("AccountBasicMapper/insert.sql")    void insert(@Param("r") AccountBasic record);}

可以看到,里面有一个 Insert 注解,我们传入了一个具体的 domain,然后,就可以在AccountBasicMapper目录下的insert.sql文件里,书写具体的 sql 语句了。

sql语句样例如下:

INSERT INTO account_basic(    account_id,    nick_name,    password,    sex,    state,    photo_url,    created,    modified,    version)VALUES (    ,    ,    ,    ,    ,    ,    ,    ,    )

那么这是什么语法呢?它又是如何知道是这样配置的呢?这就需要引入 MyBatis 的脚本语言配置功能。在这里,我们使用的freemark的模版。

不要忘了加入它的依赖。

org.mybatis.scripting    mybatis-freemarker    1.2.2

然后,在yaml文件里做上相应的配置就ok了。

mybatis:  check_config_location: false  scripting-language-driver:    freemarker:      template-file:        base-dir: mappers/      path-provider:        includes-package-path: false        separate-directory-per-mapper: false

这种方式的好处和坏处

我个人是非常喜欢这种模式的。因为它有下面几个好处:

  1. 用什么写什么,代码量少,简洁优雅。

  2. SQL集中,不用分散在代码里,xml里,或者注解里。方便DBA进行SQL审核。由于没了xml的干扰,SQL反而更加简洁了。

  3. 一个DAO方法一个sql文件,模式单一可控。

  4. MyBatis的功能优势可以全部发挥,无缝集成。

当然,缺点也是显而易见的。

  1. 即使变了个参数,也要修改很多sql文件。

  2. 需要为每一个方法配一个sql文件,即使这是个很弱智的插入查询方法。

不过,我并不认为这是个问题。每一个方法配备一个sql文件,代码写起来反而更加简单了。当出现问题的时候,也不用根据逻辑进行跟踪定位到拼接后的 SQL 语句。我现在,只需要拿到对应方法的 SQL 文件,就可以改吧改吧,直接在 sql 终端里执行调试。这样,sql 优化也变的简单了。

当然,一个人一个习惯。我个人喜欢这种模式,而且在我的团队里推行这种模式,发现运行的也很好。另外,程序员为了少写重复的 sql 代码,在设计Dao接口的时候,反而更加认真了。

关于“选择MyBatis还是JPA”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

选择MyBatis还是JPA

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

选择MyBatis还是JPA

这篇文章将为大家详细讲解有关选择MyBatis还是JPA,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我扔掉了JPA我仔细想了一下,有下面几点原因,造成了JPA在很多团队根本就玩不下去。JPA适合业务模型
2023-06-27

初学者选择Python2还是选择Python3

这篇文章主要介绍“初学者选择Python2还是选择Python3”,在日常操作中,相信很多人在初学者选择Python2还是选择Python3问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”初学者选择Python
2023-06-02

选择Go好还是Java好

这篇文章主要介绍“选择Go好还是Java好”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“选择Go好还是Java好”文章能帮助大家解决问题。1. 初遇 Go2017 年初,我接手了一个非常有趣的项目,
2023-06-27

云服务器选择wordpress还是Docker

如果您是在使用云计算平台作为应用程序的开发平台,您可能会选择使用wordpress作为其主要的云应用程序之一。但是,如果您已经有一个现有的应用程序,则通常情况下,最好考虑使用Docker作为替代品。Docker是一个容器技术,它提供了一组虚拟机和镜像来运行应用程序。使用Docker,您可以将虚拟机分配在不同的地理位置,例如不同的主机或服务器上,以及将应用程序部署在多台虚拟机上,以便在不同的操作
2023-10-26

开发者视角:选择Go还是C?

开发者视角:选择Go还是C?在软件开发领域,程序员们经常需要面对一个重要的选择:使用哪种编程语言来开发项目。在众多编程语言中,Go(又称Golang)和C是两个备受关注的选项。本文将从开发者的视角,分析选择Go还是C的优缺点,并通过具体的
开发者视角:选择Go还是C?
2024-03-09

Golang 调优:优化选择,T 还是 t?

golang 中 time.duration 类型的 t 和 t 格式分别表示带有特定单位和纳秒数的持续时间。t 格式适用于指定具有明确单位的持续时间,而 t 格式用于表示直接的纳秒数或没有明确单位的持续时间段。根据代码的具体情况,t 格式
Golang 调优:优化选择,T 还是 t?
2024-04-08

网页加图片:选择img还是CSS?

在Web开发中,图片和CSS样式表都是非常重要的。在设计一个网站时,我们需要决定该如何展示和优化这些元素,以确保网站能够尽可能地快速加载和呈现。在传统的网站开发中,图片和CSS样式表是两个独立的文件。而现在,随着技术的发展,我们可以把图片和CSS样式表整合到一起,由此产生了一种新的技术:img或css。那么,到底应该使用img还是css呢?这需要根据具体情况来进行判断。首先,对
2023-05-14

选择java开发还是嵌入式开发

首先,Java开发和嵌入式开发都是目前IT行业内比较常见的开发岗位,也都有大量的从业人员,所以从就业的角度来看,学习Java开发和嵌入式开发都是不错的选择。Java语言的应用领域包括Web开发、Android开发和大数据开发等领域,这些领域也都有大量的岗位需求
选择java开发还是嵌入式开发
2019-07-23

怎么选择学习Python还是Java语言

这篇文章主要讲解了“怎么选择学习Python还是Java语言”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么选择学习Python还是Java语言”吧!Python vs Java:结构与设
2023-06-16

选择虚拟主机还是云服务器

选择虚拟主机还是云服务器?在当今数字化时代,无论是企业还是个人,拥有一个在线存在是至关重要的。然而,选择一个合适的服务器托管解决方案可能是一个令人困惑的决策。虚拟主机和云服务器是两个广泛使用的选项,本文将探讨它们之间的区别,便于选择到更适合的主机解决方案。
选择虚拟主机还是云服务器
2024-01-25

非程序员选择学习C++还是Python?

  非程序员选择C++还是Python?编程语言是当下非常热门的技术,也是非常具有发展前景的行业,广受大家喜欢。不过在考虑学习编程的时候,很多人都会疑惑学习Python还是C++?为大家介绍一下。  首先,对于非程序员职场人员来说,当前情况
2023-06-01

阿里云服务器:选择Linux还是Windows?

简介在云计算时代,阿里云服务器成为了许多企业和个人的首选。然而,在选择操作系统时,很多人会陷入Linux和Windows之间的纠结。本文将探讨阿里云服务器上使用Linux和Windows的优缺点,帮助您做出明智的选择。Linux服务器的优势1.稳定性和安全性Linux操作系统以其稳定性和安全性而闻名。它具有强大的内核和
阿里云服务器:选择Linux还是Windows?
2024-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录