国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計(jì)模式學(xué)習(xí)筆記 - 開源實(shí)戰(zhàn)五(上):Mybatis如何權(quán)衡易用性、性能和靈活性?

這篇具有很好參考價(jià)值的文章主要介紹了設(shè)計(jì)模式學(xué)習(xí)筆記 - 開源實(shí)戰(zhàn)五(上):Mybatis如何權(quán)衡易用性、性能和靈活性?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

概述

前面幾篇文章講解了 Spring 框架,剖析了背后蘊(yùn)含的一些通用設(shè)計(jì)思想、設(shè)計(jì)原則,以及用到的十幾種設(shè)計(jì)模式。從本章開始,我們?cè)倨饰鲆粋€(gè) Java 項(xiàng)目中經(jīng)常用到的開發(fā)框架:Mybatis。本次也分為三篇文章進(jìn)行講解:

  • 第一篇文章,分析 Mybatis 如何權(quán)衡代碼的易用性、性能和靈活性。
  • 第二篇文章,學(xué)習(xí)如何利用職責(zé)鏈模式與代理模式實(shí)現(xiàn) Mybatis Plugin。
  • 第三篇文章,總結(jié)邏輯下 Mybatis 框架中用到的十幾種設(shè)計(jì)模式。

Mybatis 和 ORM 框架

熟悉 Java 的同學(xué)應(yīng)該知道,Mybatis 是一個(gè) ORM(Object Relational Mapping,對(duì)象 - 關(guān)系映射)框架。ORM 框架主要是根據(jù)類和數(shù)據(jù)庫(kù)之間的映射關(guān)系,幫助程序員自動(dòng)實(shí)現(xiàn)對(duì)象與數(shù)據(jù)庫(kù)中數(shù)據(jù)之間的互相轉(zhuǎn)化。說(shuō)的更具體點(diǎn)就是,ORM 負(fù)責(zé)將程序中的對(duì)象存儲(chǔ)到數(shù)據(jù)庫(kù)中、將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)化為程序中的對(duì)象。實(shí)際上,Java 中的 ORM 框架有很多,除了 Mybatis 之外,還有 Hibernate、TopLink 等。

在剖析 Spring 框架時(shí),我們講到,如果用一句來(lái)總結(jié)框架的作用,那就是簡(jiǎn)化開發(fā)。Mybatis 框架也不例外。它簡(jiǎn)化的是數(shù)據(jù)庫(kù)方面的開發(fā)。Mybatis 是如何簡(jiǎn)化數(shù)據(jù)庫(kù)開發(fā)的呢?

我們結(jié)合模板模式(下)章節(jié) 中將的 JdbcTemplate 的例子來(lái)說(shuō)明下。

在《模板模式(下)》中,我們講到,Java 提供了 JDBC 類庫(kù)來(lái)封裝不同類型的數(shù)據(jù)庫(kù)操作。不過(guò),直接使用 JDBC 來(lái)進(jìn)行數(shù)據(jù)庫(kù)編程,還是有點(diǎn)麻煩。語(yǔ)句,Spring 提供了 JdbcTemplate,對(duì) JDBC 進(jìn)一步封裝,來(lái)進(jìn)一步簡(jiǎn)化數(shù)據(jù)庫(kù)編程。使用 JdbcTemplate 進(jìn)行數(shù)據(jù)庫(kù)編程,只需要編寫和業(yè)務(wù)相關(guān)的代碼(比如,SQL 語(yǔ)句、數(shù)據(jù)庫(kù)中數(shù)據(jù)與對(duì)象之間的互相轉(zhuǎn)化的代碼),其他流程性質(zhì)的代碼(比如,加載驅(qū)動(dòng)、創(chuàng)建數(shù)據(jù)庫(kù)連接、創(chuàng)建 statement、關(guān)閉連接、關(guān)閉 statement 等)都封裝在了 JdbcTemplate 中,不需要我們重復(fù)編寫。

當(dāng)時(shí)為了展示使用 JdbcTemplate 是如何簡(jiǎn)化數(shù)據(jù)庫(kù)編程的,還舉了一個(gè)查詢數(shù)據(jù)庫(kù)中用戶信息的例子。還是同樣的例子,再來(lái)看下使用 Mybatis 該如何實(shí)現(xiàn),是不是比 JdbcTemplate 更加簡(jiǎn)單。

因?yàn)?Mybatis 依賴 JDBC 驅(qū)動(dòng),所以,在項(xiàng)目中使用 Mybatis,除了需要引入 Mybatis 框架本身(Mybatis.jar)之外,還需要引入 JDBC 驅(qū)動(dòng)(比如,訪問(wèn) MYSQL 的 JDBC 驅(qū)動(dòng)實(shí)現(xiàn)類 mysql-connector-java.jar)。兩個(gè) jar 包引入項(xiàng)目之后,就可以開始編程了。使用 Mybatis 來(lái)訪問(wèn)數(shù)據(jù)庫(kù)中用戶信息的代碼如下所示。

// 1.定義UserDO
public class UserDo {
	private long id;
	private String name;
	private String telephone;
	// 省略setter/getter方法
}

// 2.定義訪問(wèn)接口
public interface UserMapper {
	public UserDo selectById(long id);
}

// 3.定義映射關(guān)系: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 語(yǔ)句之間的映射關(guān)系,并沒有顯式地定義類(UserDo)字段與數(shù)據(jù)庫(kù)表(user)之間的映射關(guān)系。實(shí)際上,這就體現(xiàn)了 “約定優(yōu)先于配置” 的設(shè)計(jì)原則。類與數(shù)據(jù)庫(kù)表字段之間使用了默認(rèn)的映射關(guān)系:類字段跟數(shù)據(jù)庫(kù)表中拼寫相同的字段一一映射。當(dāng)然,如果沒有辦法做到一一映射,我們也可以自定義它們之間的映射關(guān)系。

有了上面的代碼和配置,我們就可以向下面這樣來(lái)訪問(wèn)數(shù)據(jù)庫(kù)中的用戶信息了。

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);
        // ...
    }
}

從代碼中可以看出,相對(duì)于使用 JdbcTemplate 的實(shí)現(xiàn)方式,使用 Mybatis 的實(shí)現(xiàn)方式更加靈活。在使用 JdbcTemplate 的實(shí)現(xiàn)方式中,對(duì)象與數(shù)據(jù)庫(kù)之間的轉(zhuǎn)化代碼、SQL 語(yǔ)句,是硬編碼在業(yè)務(wù)代碼中。而使用 Mybatis 的實(shí)現(xiàn)方式中,類字段和數(shù)據(jù)庫(kù)字段之間的映射關(guān)系、接口與 SQL 之間的映射關(guān)系,是寫在 XML 配置文件中的,是跟代碼相分離的,這樣會(huì)更加靈活、清晰,維護(hù)起來(lái)更加方便。

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

剛剛對(duì) Mybatis 做了簡(jiǎn)單的介紹,接下來(lái),再對(duì)比下另外兩個(gè)框架:JdbcTemplate 和 Hibernate。通過(guò)對(duì)比來(lái)看,Mybatis 是如何權(quán)衡代碼的易用性、性能和靈活性的。

先來(lái)看 JdbcTemplate。相對(duì)于 Mybatis 來(lái)說(shuō),JdbcTemplate 更加輕量級(jí)。因?yàn)樗鼘?duì) JDBC 只做了很簡(jiǎn)單的封裝,所以性能損耗比較少。相對(duì)于其他兩個(gè)框架來(lái)說(shuō),它性能最好。但是,它的缺點(diǎn)也比較明顯,那就是 SQL 與代碼耦合在一起,而且不具備 ORM 功能,需要自己編寫代碼,解析對(duì)象跟數(shù)據(jù)庫(kù)之間的映射關(guān)系。所以,在易用性上它不及其他兩個(gè)框架。

再來(lái)看 Hibernate。相對(duì) Mybatis 來(lái)說(shuō),Hibernate 更加重量級(jí)。Hibernate 提供了更加高級(jí)的映射功能,能夠根據(jù)業(yè)務(wù)需求自動(dòng)生成 SQL 語(yǔ)句。我們需要像使用 Mybatis 那樣自己編寫 SQL。因此,有時(shí)候,我們也把 Mybatis 稱半自動(dòng)化的 ORM 框架,把 Hibernate 稱全自動(dòng)化的 ORM 框架。不過(guò),雖然自動(dòng)生成 SQL 簡(jiǎn)化了開發(fā),但畢竟是自動(dòng)生成的,沒有針對(duì)性能的優(yōu)化。在性能方面,這樣得到的 SQL 可能沒有程序員編寫得好。同時(shí),這樣也喪失了靈活性。

所以,粗略地講,有時(shí)候框架的易用性和性能成對(duì)立關(guān)系。追求易用性,那性能就差一些。相反,追求性能,易用性就差一些。此外,使用起來(lái)越簡(jiǎn)單,那靈活性就越差。這就好比我們用照相機(jī)。傻瓜相機(jī)按下快門就能拍照,但沒有復(fù)雜的單反靈活。

實(shí)際上,JdbcTemplate、Mybatis、Hibernate 這幾個(gè)框架之間也體現(xiàn)了剛剛的說(shuō)的規(guī)律。

JdbcTemplate 提供的功能最簡(jiǎn)單,易用性最差,性能損耗最少,用它編程性能最好。Hibernate 提供的功能最完善,易用性最好,但相對(duì)來(lái)說(shuō)性能損耗就高了。Mybatis 介于兩種中間,在易用性、性能、靈活性三個(gè)方面做了權(quán)衡。它支持程序員自己編寫 SQL,能夠延續(xù)程序員對(duì) SQL 知識(shí)的積累。相對(duì)于完全黑盒子的 JdbcTemplate,很多程序員反倒是更加喜歡 Mybatis 這種半透明的框架。這也提醒我們,過(guò)度封裝,提供過(guò)于簡(jiǎn)化的開發(fā)方式,也是喪失開發(fā)的靈活性。

總結(jié)

JDBC 是 Java 訪問(wèn)數(shù)據(jù)庫(kù)的開發(fā)規(guī)范,提供了一套抽象的統(tǒng)一的開發(fā)接口,隱藏不同數(shù)據(jù)庫(kù)的訪問(wèn)細(xì)節(jié)。

JdbcTemplate、Mybatis、Hibernate 都是對(duì) JDBC 的二次封裝,為的是進(jìn)一步簡(jiǎn)化數(shù)據(jù)庫(kù)開發(fā)。其中 JdbcTemplate 不能算得上是 ORM 框架,因?yàn)檫€需要程序員自己編程來(lái)實(shí)現(xiàn)對(duì)象和數(shù)據(jù)庫(kù)之間的相互轉(zhuǎn)化。相對(duì)于 Hibernate 這種連 SQL 都不用程序員寫的全自動(dòng) ORM 框架,Mybatis 算式一種半自動(dòng)化的 ORM 框架。

本章除了介紹 Mybatis 背景之外,還學(xué)習(xí)了代碼的易用性、性能、靈活性之間的關(guān)系。一般來(lái)講,提供的高級(jí)功能越多,那性能損耗就越大;用起來(lái)越簡(jiǎn)單,提供越簡(jiǎn)化的開發(fā)方式,那靈活性也就相對(duì)越低。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860897.html

到了這里,關(guān)于設(shè)計(jì)模式學(xué)習(xí)筆記 - 開源實(shí)戰(zhàn)五(上):Mybatis如何權(quán)衡易用性、性能和靈活性?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包