欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis還是JPA?終于有答案了

 更新時(shí)間:2020年10月12日 10:30:44   作者:猿邏輯  
這篇文章主要介紹了MyBatis還是JPA,中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

對(duì)于一個(gè)和數(shù)據(jù)庫(kù)打交道的程序員來(lái)說(shuō),很快會(huì)面臨著一個(gè)艱難的選擇。到底是選擇MyBatis還是JPA呢?

很多人說(shuō),技術(shù)選擇,都要根據(jù)需求來(lái),這個(gè)沒(méi)錯(cuò)。但是,除了需求,還有很重要的一個(gè)環(huán)節(jié),那就是隊(duì)友的水平。如果你選擇了一些比較高級(jí)的技術(shù),那么就是在給整個(gè)團(tuán)隊(duì)埋坑。

JPA的抽象層次更高,代碼寫(xiě)起來(lái)也更簡(jiǎn)潔,但是它一點(diǎn)都不簡(jiǎn)單。雖然經(jīng)過(guò)了多次的培訓(xùn),我呆過(guò)的幾個(gè)團(tuán)隊(duì),還是把它用的和屎一樣。

我扔掉了JPA

我仔細(xì)想了一下,有下面幾點(diǎn)原因,造成了JPA在很多團(tuán)隊(duì)根本就玩不下去。

  • JPA適合業(yè)務(wù)模型固定的場(chǎng)景,適合比較穩(wěn)定的需求。但是國(guó)內(nèi)這種朝三暮四的需求風(fēng)格,產(chǎn)品經(jīng)理這種傳話筒式的設(shè)計(jì)模式,造成了需求的泛濫和不確定。JPA在這種模式下就是渣。
  • JPA的技術(shù)要求比較高。不要懷疑,你剛開(kāi)始用起里可能覺(jué)得非常簡(jiǎn)單。但隨著你的深入使用,你會(huì)發(fā)現(xiàn)這是一個(gè)災(zāi)難。里面的各種轉(zhuǎn)換和緩存,會(huì)把人繞暈。而大多數(shù)的快餐程序員是不想要了解這些的。
  • 很多程序員很會(huì)寫(xiě)SQL,所以很多SQL語(yǔ)句長(zhǎng)的很胖,長(zhǎng)的要命。業(yè)務(wù)混亂,多張表關(guān)聯(lián),我甚至見(jiàn)過(guò)上百?gòu)垬I(yè)務(wù)表關(guān)聯(lián)的復(fù)雜業(yè)務(wù)。DBA無(wú)奈之下,通常都會(huì)有sql審核。JPA搞sql審核?還是弱了一點(diǎn)。

所以,不是JPA不好,而是它不符合國(guó)情而已。想要在公司內(nèi)推行JPA,你需要給我一個(gè)穩(wěn)定的產(chǎn)品團(tuán)隊(duì)、一個(gè)牛X的技術(shù)團(tuán)隊(duì)才行。

所以,大多數(shù)公司寧可寫(xiě)一堆重復(fù)的、亂七八糟的Mybaits代碼,也不會(huì)輕易嘗試JPA,這是符合邏輯的,符合事物發(fā)展規(guī)律的。

所以,我們下面的文章就是來(lái)討論MyBatis的,來(lái)看一下Mybaits到底要怎么寫(xiě)才算優(yōu)雅。

MyBatis為什么不好用

優(yōu)秀的程序員都是很懶的。所以很多人不想設(shè)計(jì)實(shí)體的sql。JPA可以直接根據(jù)Java的實(shí)體代碼,生成sql的庫(kù)表,這在使用Mybatis的人來(lái)看,是非常羨慕的。

使用MyBatis,要倒著來(lái)。需要先設(shè)計(jì)庫(kù)表,然后根據(jù)庫(kù)表反向生成一堆Java代碼和配置文件。

這個(gè)代碼生成器,就是mybatis-generator。

但是,請(qǐng)注意。這個(gè)生成器生成的代碼,有四種模式?。?!這就是最讓初學(xué)者難受的地方。如果你也是剛接觸MyBatis,強(qiáng)烈推薦只關(guān)注下面第一種模式。

  • MyBatis3 這種模式就是我們常用的方式,會(huì)生成domain類、Example類、mapper映射文件等。它生成的信息比較啰嗦,內(nèi)容幾乎無(wú)法改動(dòng)。對(duì)于項(xiàng)目中自己寫(xiě)的sql,一般都采用手寫(xiě)的方式再寫(xiě)一份,而不是改動(dòng)原來(lái)的文件。
  • MyBatis3Simple 上面這種模式的簡(jiǎn)易代碼生成模式,缺少一些東西,但很簡(jiǎn)潔。對(duì)MyBatis沒(méi)有經(jīng)驗(yàn),不推薦使用它。
  • MyBatis3DynamicSql 這是通過(guò)Builder模式實(shí)現(xiàn)的動(dòng)態(tài)SQL特性,你還需要加入額外的jar包。加上它之后,其實(shí)和JPA是有點(diǎn)相似的。既然如此,那為何不直接使用JPA呢?所以這個(gè)DSQL雖然是默認(rèn)的生成行為,但是非常不推薦。
  • MyBatis3Kotlin 這個(gè)不廢話。就是生成Kotlin版的一些配置和代碼信息。

所以,下面僅僅介紹MyBatis3模式的代碼生成。

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

<dependency>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-core</artifactId>
  <optional>true</optional>
  <scope>test</scope>
  <version>1.4.0</version>
</dependency>

我個(gè)人喜歡使用Java代碼來(lái)操作代碼生成這個(gè)過(guò)程,所以下面就是生成代碼的代碼。

public class MBGTool {
  public static void main(String[] args) throws Exception {
    List<String> 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);
  }
}

從代碼中,我們可以看到需要配置一個(gè)generatorConfig.xml文件,用來(lái)規(guī)定怎么生成代碼文件。

<!DOCTYPE generatorConfiguration PUBLIC
    "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
  <context id="simple" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/mbye"
            userId="root"
            password="root"
    />
    <javaModelGenerator targetPackage="com.github.javarunfast.mbye.domain" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
      <property name="trimStrings" value="true"/>
    </javaModelGenerator>
    <sqlMapGenerator targetPackage="com.github.javarunfast.mbye.mapper" targetProject="src/main/resources"/>
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.github.javarunfast.mbye.mapper" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </javaClientGenerator>
    <table tableName="test"/>
  </context>
</generatorConfiguration>

運(yùn)行我們的MBGTool文件之后,就可以生成MyBatis的代碼了。

怎么寫(xiě)代碼最優(yōu)雅

但是,我這里并不是要推薦你使用這種模式。因?yàn)?,它生成了一大堆無(wú)用的文件。假如你的項(xiàng)目使用了sonar這樣的代碼質(zhì)量審查工具,你會(huì)發(fā)現(xiàn)很多飄紅的地方,還有那要命的覆蓋率問(wèn)題。
怎么辦?

經(jīng)過(guò)我多年的摸索,我現(xiàn)在推薦一種非常好用的寫(xiě)法。自從我采用了這種方式之后,就再也沒(méi)有換過(guò)。

第一、不需要代碼生成器了
數(shù)據(jù)表的設(shè)計(jì),還有domain的書(shū)寫(xiě),全部靠手工。這樣我們的代碼,如果有必要,還可以遷移到JPA上去。這種模式還能順便學(xué)習(xí)一下Java里面的數(shù)據(jù)類型,是如何和SQL里的數(shù)據(jù)類型一一對(duì)應(yīng)的。在做表設(shè)計(jì)的時(shí)候,順便能夠了解一些背后的原理。

第二、不需要寫(xiě)映射文件了
生成器生成的東西,確實(shí)是有一堆無(wú)用的邏輯。比如我的某個(gè)數(shù)據(jù)表,根本不需要提供查詢所有和刪除這種動(dòng)作,它還是默認(rèn)提供了。

在這種簡(jiǎn)約模式下,我們直接手寫(xiě)Mapper文件,然后只聲明所需要的接口方法就可以了。

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

可以看到,里面有一個(gè)Insert注解,我們傳入了一個(gè)具體的domain,然后,就可以在AccountBasicMapper目錄下的insert.sql文件里,書(shū)寫(xiě)具體的sql語(yǔ)句了。

sql語(yǔ)句樣例如下:

INSERT INTO account_basic(
  account_id,
  nick_name,
  password,
  sex,
  state,
  photo_url,
  created,
  modified,
  version
)VALUES (
  <@p name="r.accountId"/>,
  <@p name="r.nickName"/>,
  <@p name="r.password"/>,
  <@p name="r.sex"/>,
  <@p name="r.state"/>,
  <@p name="r.photoUrl"/>,
  <@p name="r.created"/>,
  <@p name="r.modified"/>,
  <@p name="r.version"/>
)

那么這是什么語(yǔ)法呢?它又是如何知道是這樣配置的呢?這就需要引入MyBatis的腳本語(yǔ)言配置功能。在這里,我們使用的freemark的模版。

不要忘了加入它的依賴。

<dependency>
  <groupId>org.mybatis.scripting</groupId>
  <artifactId>mybatis-freemarker</artifactId>
  <version>1.2.2</version>
</dependency>

然后,在yaml文件里做上相應(yīng)的配置就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

這種方式的好處和壞處

我個(gè)人是非常喜歡這種模式的。因?yàn)樗邢旅鎺讉€(gè)好處:

  • 用什么寫(xiě)什么,代碼量少,簡(jiǎn)潔優(yōu)雅。
  • SQL集中,不用分散在代碼里,xml里,或者注解里。方便DBA進(jìn)行SQL審核。由于沒(méi)了xml的干擾,SQL反而更加簡(jiǎn)潔了。
  • 一個(gè)DAO方法一個(gè)sql文件,模式單一可控。
  • MyBatis的功能優(yōu)勢(shì)可以全部發(fā)揮,無(wú)縫集成。

當(dāng)然,缺點(diǎn)也是顯而易見(jiàn)的。

  • 即使變了個(gè)參數(shù),也要修改很多sql文件。
  • 需要為每一個(gè)方法配一個(gè)sql文件,即使這是個(gè)很弱智的插入查詢方法。

不過(guò),我并不認(rèn)為這是個(gè)問(wèn)題。每一個(gè)方法配備一個(gè)sql文件,代碼寫(xiě)起來(lái)反而更加簡(jiǎn)單了。當(dāng)出現(xiàn)問(wèn)題的時(shí)候,也不用根據(jù)邏輯進(jìn)行跟蹤定位到拼接后的SQL語(yǔ)句。我現(xiàn)在,只需要拿到對(duì)應(yīng)方法的SQL文件,就可以改吧改吧,直接在sql終端里執(zhí)行調(diào)試。這樣,sql優(yōu)化也變的簡(jiǎn)單了。

當(dāng)然,一個(gè)人一個(gè)習(xí)慣。我個(gè)人喜歡這種模式,而且在我的團(tuán)隊(duì)里推行這種模式,發(fā)現(xiàn)運(yùn)行的也很好。另外,程序員為了少寫(xiě)重復(fù)的sql代碼,在設(shè)計(jì)Dao接口的時(shí)候,反而更加認(rèn)真了。

這可能是一個(gè)額外的收獲吧。

到此這篇關(guān)于MyBatis還是JPA?終于有答案了的文章就介紹到這了,更多相關(guān)MyBatis還是JPA內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • springboot使用hibernate validator校驗(yàn)方式

    springboot使用hibernate validator校驗(yàn)方式

    hibernate validator提供了一套比較完善、便捷的驗(yàn)證實(shí)現(xiàn)方式。下面小編給大家介紹下springboot使用hibernate validator校驗(yàn)方式,感興趣的朋友一起看看吧
    2018-01-01
  • JAVA代碼塊你了解嗎

    JAVA代碼塊你了解嗎

    這篇文章主要介紹了舉例說(shuō)明Java中的代碼塊,包括靜態(tài)屬性和非靜態(tài)屬性以及構(gòu)造函數(shù)等相關(guān)的執(zhí)行先后,需要的朋友可以參考下
    2021-09-09
  • java數(shù)學(xué)工具類Math詳解(round方法)

    java數(shù)學(xué)工具類Math詳解(round方法)

    這篇文章主要為大家詳細(xì)介紹了java數(shù)學(xué)工具類Math,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解

    關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解

    這篇文章主要介紹了關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解,RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,需要的朋友可以參考下
    2023-05-05
  • Java 異常的知識(shí)整理

    Java 異常的知識(shí)整理

    這篇文章主要介紹了Java 異常的知識(shí)整理的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • JavaEE線程安全實(shí)現(xiàn)線程池方法

    JavaEE線程安全實(shí)現(xiàn)線程池方法

    這篇文章主要介紹了JavaEE線程安全實(shí)現(xiàn)線程池方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • 最新評(píng)論