设计模式学习笔记 - 开源实战五(上):Mybatis如何权衡易用性、性能和灵活性?

这篇具有很好参考价值的文章主要介绍了设计模式学习笔记 - 开源实战五(上):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 是如何简化数据库开发的呢?

我们结合模板模式(下)章节 中将的 JdbcTemplate 的例子来说明下。

在《模板模式(下)》中,我们讲到,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="com.example.repo.mapper.UserMapper">
	<select id="selectById" resultType="com.example.repo.UserDo">
		select * from user where id=#{id}
	</select>
</mapper>

// 4.全局配置文件:mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 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 可能没有程序员编写得好。同时,这样也丧失了灵活性。

所以,粗略地讲,有时候框架的易用性和性能成对立关系。追求易用性,那性能就差一些。相反,追求性能,易用性就差一些。此外,使用起来越简单,那灵活性就越差。这就好比我们用照相机。傻瓜相机按下快门就能拍照,但没有复杂的单反灵活。

实际上,JdbcTemplate、Mybatis、Hibernate 这几个框架之间也体现了刚刚的说的规律。

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

总结

JDBC 是 Java 访问数据库的开发规范,提供了一套抽象的统一的开发接口,隐藏不同数据库的访问细节。

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

本章除了介绍 Mybatis 背景之外,还学习了代码的易用性、性能、灵活性之间的关系。一般来讲,提供的高级功能越多,那性能损耗就越大;用起来越简单,提供越简化的开发方式,那灵活性也就相对越低。文章来源地址https://www.toymoban.com/news/detail-860897.html

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

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

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

相关文章

  • 【开源与项目实战:开源实战】85 | 开源实战四(中):剖析Spring框架中用来支持扩展的两种设计模式

    上一节课中,我们学习了 Spring 框架背后蕴藏的一些经典设计思想,比如约定优于配置、低侵入松耦合、模块化轻量级等等。我们可以将这些设计思想借鉴到其他框架开发中,在大的设计层面提高框架的代码质量。这也是我们在专栏中讲解这部分内容的原因。 除了上一节课中

    2024年02月11日
    浏览(37)
  • 学习笔记-设计模式-创建型模式-工厂模式

    工厂模式是一种创建者设计模式,细分之下可以分成三类 简单工厂模式 , 工厂方法模式 和 抽象工厂模式 。 简单工厂模式 最简单的工厂模式,它采用静态方法的方式来决定应该应该生产什么商品。 它的优点在于 将创建实例的工作与使用实例的工作分开,使用者不必关心类

    2024年02月10日
    浏览(27)
  • 学习笔记-设计模式-创建型模式-单例模式

    一个类只有一个实例,并提供一个全局访问此实例的点,哪怕多线程同时访问。 单例模式主要解决了 一个全局使用的类被频繁的创建和消费 的问题。 单例模式的案例场景 数据库的连接池不会反复创建 spring中一个单例模式bean的生成和使用 在我们平常的代码中需要设置全局

    2024年02月08日
    浏览(39)
  • 设计模式学习笔记

    把对象的创建和使用相分离 定义工厂接口和产品接口,但如何创建实际工厂和实际产品被推迟到子类实现,从而使调用方只和抽象工厂与抽象产品打交道 调用方尽量持有接口或抽象类,避免持有具体类型的子类,以便工厂方法能随时切换不同的子类返回,却不影响调用方代

    2024年02月19日
    浏览(25)
  • 设计模式的学习笔记

    1 设计模式概述 1.1 软件设计模式的产生背景 设计模式最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977 年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任 Christopher Alexander 在他的著作《建筑模式语言:城镇、建筑、构造》中描述了一些常见

    2024年01月20日
    浏览(40)
  • 命令模式 Command Pattern 《游戏设计模式》学习笔记

    对于一般的按键输入,我们通常这么做,直接if按了什么键,就执行相应的操作 在这里我们是将用户的输入和程序行为硬编码在一起,这是我们很自然就想到的最快的做法。 但是如果这是一个大型游戏,往往我们需要实现一个按键配置的功能(话说2077直到上线都没有实现这

    2024年02月14日
    浏览(31)
  • 【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    请编写程序完成APP抽奖活动具体要求如下: 假如每参加一次这个活动要扣除用户50积分,中奖概率是10% 奖品数量固定,抽完就不能抽奖 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完,活动的四个状态转换关系图如下 一开始的状态为“不能抽奖”,当扣除50积分

    2024年02月12日
    浏览(34)
  • 【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有各种鸭子,比如野鸭、北京鸭、水鸭等。 鸭子有各种行为,比如走路、叫、飞行等。不同鸭子的行为可能略有不同。要求显示鸭子的信息 不同的鸭子继承一个父类Duck,如果是相同的行为就继承,不同行为就重写方法 实现 【鸭子抽象类】 【野鸭】 【北京鸭】 【玩具鸭】

    2024年02月12日
    浏览(46)
  • 【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图 【对应类图】 【分析】 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。 违

    2024年02月15日
    浏览(32)
  • 【设计模式——学习笔记】23种设计模式——组合模式Composite(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    编写程序展示一个学校院系结构: 需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 【传统方式】 将学院看做是学校的子类,系是学院的子类,小的组织继承大的组织 分析: 在一个页面中展示出学校的院系组成,一个学校有多个

    2024年02月15日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包