【开源与项目实战:开源实战】87 | 开源实战五(上):MyBatis如何权衡易用性、性能和灵活性?

这篇具有很好参考价值的文章主要介绍了【开源与项目实战:开源实战】87 | 开源实战五(上):MyBatis如何权衡易用性、性能和灵活性?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上几节课我们讲到了 Spring 框架,剖析了背后蕴含的一些通用设计思想,以及用到的十几种设计模式。从今天开始,我们再剖析另外一个 Java 项目开发中经常用到的框架:MyBatis。因为内容比较多,同样,我们也分三节课来讲解。

  • 第一节课,我们分析 MyBatis 如何权衡代码的易用性、性能和灵活性。
  • 第二节课,我们学习如何利用职责链与代理模式实现 MyBatis Plugin。
  • 第三节课,我们总结罗列一下 MyBatis 框架中用到的十几种设计模式。

话不多说,让我们正式开始今天的学习吧!

Mybatis 和 ORM 框架介绍

熟悉 Java 的同学应该知道,MyBatis 是一个 ORM(Object Relational Mapping,对象 - 关系映射)框架。ORM 框架主要是根据类和数据库表之间的映射关系,帮助程序员自动实现对象与数据库中数据之间的互相转化。说得更具体点就是,ORM 负责将程序中的对象存储到数据库中、将数据库中的数据转化为程序中的对象。实际上,Java 中的 ORM 框架有很多,除了刚刚提到的 MyBatis 之外,还有 Hibernate、TopLink 等。

在剖析 Spring 框架的时候,我们讲到,如果用一句话来总结框架作用的话,那就是简化开发。MyBatis 框架也不例外。它简化的是数据库方面的开发。那 MyBatis 是如何简化数据库开发的呢?我们结合第 59 讲中的 JdbcTemplate 的例子来说明一下。

在第 59 讲中,我们讲到,Java 提供了 JDBC 类库来封装不同类型的数据库操作。不过,直接使用 JDBC 来进行数据库编程,还是有点麻烦的。于是,Spring 提供了 JdbcTemplate,对 JDBC 进一步封装,来进一步简化数据库编程。

使用 JdbcTemplate 进行数据库编程,我们只需要编写跟业务相关的代码(比如,SQL 语句、数据库中数据与对象之间的互相转化的代码),其他流程性质的代码(比如,加载驱动、创建数据库连接、创建 statement、关闭连接、关闭 statement 等)都封装在了 JdbcTemplate 类中,不需要我们重复编写。

当时,为了展示使用 JdbcTemplate 是如何简化数据库编程的,我们还举了一个查询数据库中用户信息的例子。还是同样这个例子,我再来看下,使用 MyBatis 该如何实现,是不是比使用 JdbcTemplate 更加简单。
因为 MyBatis 依赖 JDBC 驱动,所以,在项目中使用 MyBatis,除了需要引入 MyBatis 框架本身(mybatis.jar)之外,还需要引入 JDBC 驱动(比如,访问 MySQL 的 JDBC 驱动实现类库 mysql-connector-java.jar)。将两个 jar 包引入项目之后,我们就可以开始编程了。使用 MyBatis 来访问数据库中用户信息的代码如下所示:

// 1. 定义UserDO
public class UserDo {
  private long id;
  private String name;
  private String telephone;
  // 省略setter/getter方法
}
// 2. 定义访问接口
public interface UserMapper {
  public UserDo selectById(long id);
}
// 3. 定义映射关系:UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.xzg.cd.a87.repo.mapper.UserMapper">
    <select id="selectById" resultType="cn.xzg.cd.a87.repo.UserDo">
        select * from user where id=#{id}
    </select>
</mapper>
// 4. 全局配置文件: mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
                <property name="username" value="root" />
                <property name="password" value="..." />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

需要注意的是,在 UserMapper.xml 配置文件中,我们只定义了接口和 SQL 语句之间的映射关系,并没有显式地定义类(UserDo)字段与数据库表(user)字段之间的映射关系。实际上,这就体现了“约定优于配置”的设计原则。类字段与数据库表字段之间使用了默认映射关系:类字段跟数据库表中拼写相同的字段一一映射。当然,如果没办法做到一一映射,我们也可以自定义它们之间的映射关系。

有了上面的代码和配置,我们就可以像下面这样来访问数据库中的用户信息了。

public class MyBatisDemo {
  public static void main(String[] args) throws IOException {
    Reader reader = Resources.getResourceAsReader("mybatis.xml");
    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    SqlSession session = sessionFactory.openSession();
    UserMapper userMapper = session.getMapper(UserMapper.class);
    UserDo userDo = userMapper.selectById(8);
    //...
  }
}

从代码中,我们可以看出,相对于使用 JdbcTemplate 的实现方式,使用 MyBatis 的实现方式更加灵活。在使用 JdbcTemplate 的实现方式中,对象与数据库中数据之间的转化代码、SQL 语句,是硬编码在业务代码中的。而在使用 MyBatis 的实现方式中,类字段与数据库字段之间的映射关系、接口与 SQL 之间的映射关系,是写在 XML 配置文件中的,是跟代码相分离的,这样会更加灵活、清晰,维护起来更加方便。

如何平衡易用性、性能和灵活性?

刚刚我们对 MyBatis 框架做了简单介绍,接下来,我们再对比一下另外两个框架:JdbcTemplate 和 Hibernate。通过对比我们来看,MyBatis 是如何权衡代码的易用性、性能和灵活性的。

我们先来看 JdbcTemplate。相对于 MyBatis 来说,JdbcTemplate 更加轻量级。因为它对 JDBC 只做了很简单的封装,所以性能损耗比较少。相对于其他两个框架来说,它的性能最好。但是,它的缺点也比较明显,那就是 SQL 与代码耦合在一起,而且不具备 ORM 的功能,需要自己编写代码,解析对象跟数据库中的数据之间的映射关系。所以,在易用性上它不及其他两个框架。

我们再来看 Hibernate。相对于 MyBatis 来说,Hibernate 更加重量级。Hibernate 提供了更加高级的映射功能,能够根据业务需求自动生成 SQL 语句。我们不需要像使用 MyBatis 那样自己编写 SQL。因此,有的时候,我们也把 MyBatis 称作半自动化的 ORM 框架,把 Hibernate 称作全自动化的 ORM 框架。不过,虽然自动生成 SQL 简化了开发,但是毕竟是自动生成的,没有针对性的优化。在性能方面,这样得到的 SQL 可能没有程序员编写得好。同时,这样也丧失了程序员自己编写 SQL 的灵活性。

实际上,不管用哪种实现方式,从数据库中取出数据并且转化成对象,这个过程涉及的代码逻辑基本是一致的。不同实现方式的区别,只不过是哪部分代码逻辑放到了哪里。有的框架提供的功能比较强大,大部分代码逻辑都由框架来完成,程序员只需要实现很小的一部分代码就可以了。这样框架的易用性就更好些。但是,框架集成的功能越多,为了处理逻辑的通用性,就会引入更多额外的处理代码。比起针对具体问题具体编程,这样性能损耗就相对大一些。

所以,粗略地讲,有的时候,框架的易用性和性能成对立关系。追求易用性,那性能就差一些。相反,追求性能,易用性就差一些。除此之外,使用起来越简单,那灵活性就越差。这就好比我们用的照相机。傻瓜相机按下快门就能拍照,但没有复杂的单反灵活。
实际上,JdbcTemplate、MyBatis、Hibernate 这几个框架也体现了刚刚说的这个规律。

JdbcTemplate 提供的功能最简单,易用性最差,性能损耗最少,用它编程性能最好。Hibernate 提供的功能最完善,易用性最好,但相对来说性能损耗就最高了。MyBatis 介于两者中间,在易用性、性能、灵活性三个方面做到了权衡。它支撑程序员自己编写 SQL,能够延续程序员对 SQL 知识的积累。相对于完全黑盒子的 Hibernate,很多程序员反倒是更加喜欢 MyBatis 这种半透明的框架。这也提醒我们,过度封装,提供过于简化的开发方式,也会丧失开发的灵活性。

重点回顾

好了,今天的内容到此就讲完了。我们一块来总结回顾一下,你需要重点掌握的内容。

如果你熟悉 Java 和 MyBatis,那你应该掌握今天讲到 JDBC、JdbcTemplate、MyBatis、Hibernate 之间的区别。JDBC 是 Java 访问数据库的开发规范,提供了一套抽象的统一的开发接口,隐藏不同数据库的访问细节。

JdbcTemplate、MyBatis、Hibernate 都是对 JDBC 的二次封装,为的是进一步简化数据库开发。其中,JdbcTemplate 不能算得上是 ORM 框架,因为还需要程序员自己编程来实现对象和数据库数据之间的互相转化。相对于 Hibernate 这种连 SQL 都不用程序员自己写的全自动 ORM 框架,MyBatis 算是一种半自动化的 ORM 框架。

如果你不熟悉 Java 和 MyBatis,作为背景介绍,那你简单了解一下 MyBatis 和 ORM 就可以了。不过,在你熟悉的语言中,应该也有相应的 ORM 框架,你也可以对比着去分析一下。

今天的内容除了起到对 MyBatis 做背景介绍之外,我们还学习了代码的易用性、性能、灵活性之间的关系。一般来讲,提供的高级功能越多,那性能损耗就会越大些;用起来越简单,提供越简化的开发方式,那灵活性也就相对越低。

课堂讨论

在你的项目开发中,有没有用过哪些框架,能够切实地提高开发效率,减少不必要的体力劳动?文章来源地址https://www.toymoban.com/news/detail-529066.html

到了这里,关于【开源与项目实战:开源实战】87 | 开源实战五(上):MyBatis如何权衡易用性、性能和灵活性?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UI 易用性测试 以及自动化实现!

    GUI 是指图形用户界面,UI 是指用户界面,对于纯软件系统,这两者没有本质的区别,GUI易用性测试与 UI 易用性测试内容一致。但是如果测试的对象是一个产品,这两者则存在区别,对于产品 UI 则不仅仅包括 GUI,还包括产品硬件部分的测试。 UI 测试包括两类:软件界面测试

    2024年04月10日
    浏览(41)
  • RunnerGo:轻量级、全栈式、易用性和高效性的测试工具

    随着软件测试的重要性日益凸显,市场上的测试工具也日益丰富。RunnerGo作为一款基于Go语言研发的开源测试平台,以其轻量级、全栈式、易用性和高效性的特点,在测试工具市场中逐渐脱颖而出。 RunnerGo是一款轻量级的测试工具,使用Go语言研发,具有轻便灵活的特点。与

    2024年02月10日
    浏览(28)
  • 怎么选合适的图纸加密软件?迅软DSE加密软件功能、安全与易用性并存

    利用加密软件进行图纸加密, 确保企业的图纸信息能够得到有效保护,防止非法访问和数据泄露。 一、挑选图纸加密软件的注意事项? 用户反馈 :参考其他用户的反馈和评价,了解软件在实际使用中的表现和潜在问题。 兼容性 :软件应与现有的系统和应用程序兼容,不会

    2024年04月29日
    浏览(49)
  • 华为云云耀云服务器 L 实例使用,从性能、性价比、易用性、稳定性和安全性等方面进行评测

    华为云云耀云服务器 L 实例是一款面向中小企业和开发者的云服务器产品。下面我们将从性能、性价比、易用性、稳定性和安全性等方面进行评测,并将其与同类产品进行对比。 性能 华为云云耀云服务器 L 实例基于最新的处理器技术,具备卓越的计算性能和响应速度。经过

    2024年02月07日
    浏览(45)
  • [开源工具]Win10-87键盘如何使用数字小键盘功能?

    87键盘小巧好用,但是经常有困扰,如何使用数字小键盘功能,win10帮我们解决了这个问题!!! 1.首先点击开始,找到“运行”。(或者win+r) 2.点开“运行”,输入“osk”,点击确认,虚拟小键盘出现如图。 3.点击选项–开启小键盘功能 5.直接使用数字小键盘即可

    2024年02月11日
    浏览(47)
  • Spring+SpringMVC+MyBatis整合项目开发(配有项目,已开源)

    🍰 个人主页:__Aurora__ 🍞 如果文章有什么需要改进的地方还请各位大佬斧正。 🍉如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️ 🔥最近在学SSM框架,本文是根据b站【黑马程序员 ssm框架 2021 版】整理。 🔥视频链接:https://www.bilibili.com/video/BV1WZ4y1P7Bp?spm_id_from=3

    2023年04月08日
    浏览(41)
  • SpringBoot项目实战笔记:电脑商城项目实战(SpringBoot+MyBatis+MySQL)

    花了一段实现刚学完SpringBoot,做个项目练练手。教程视频来源于B站。 视频链接: 【SpringBoot项目实战完整版】SpringBoot+MyBatis+MySQL电脑商城项目实战_哔哩哔哩_bilibili 目录 一、系统概述与环境搭建 1. 系统开发及运行环境 2.项目分析 3.创建项目 4.配置并运行项目 4.1 运行项目

    2024年02月12日
    浏览(26)
  • 强大易用的开源 建站工具Halo

    Halo 采用可插拔架构,功能模块之间耦合度低、灵活性提高。支持用户按需安装、卸载插件,操作便捷。同时提供插件开发接口以确保较高扩展性和可维护性。 ☑ 支持在运行时安装和卸载插件 ☑ 更加方便地集成三方平台 ☑ 统一的可配置设置表单 ☑ 支持自定义模型,自动生

    2024年02月09日
    浏览(53)
  • 【开源与项目实战:开源实战】79 | 开源实战二(中):从Unix开源开发学习应对大型复杂项目开发

    我们知道,项目越复杂、代码量越多、参与开发人员越多、开发维护时间越长,我们就越是要重视代码质量。代码质量下降会导致项目研发困难重重,比如:开发效率低,招了很多人,天天加班,出活却不多;线上 bug 频发,查找 bug 困难,领导发飙,中层束手无策,工程师抱

    2024年02月11日
    浏览(34)
  • 一个开源、免费在线数据建模、元数据管理平台,简单易用

    一、开源项目简介 ERD Online 是一个开源、免费在线数据建模、元数据管理平台。提供简单易用的元数据设计、关系图设计、SQL查询等功能,辅以版本、导入、导出、数据源、SQL解析、审计、团队协作等功能、方便我们快速、安全的管理数据库中的元数据。 使用AGPL-3.0开源协议

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包