SpringBoot Ebean使用指南

Ebean是啥

額诸狭,具體的Ebean是啥可以自己搜索下院塞,說白了就是一個和MybatisHibernate Jpa差不多的數(shù)據(jù)庫操作框架辆憔,但是用了之后還是發(fā)現(xiàn)挺好用的,以下復(fù)制了一段贊揚Ebean的框架的臺詞

Hibernate/JPA

反正比 Hibernate/JPA 好

MyBatis

優(yōu)點

  • 在 XML 映射文件里寫 SQL 語句很爽

缺點

  • 實現(xiàn)一個 DAO报嵌、倉儲要寫很多文件(DAO/Repository虱咧、XXXMapper、XXXMapper.xml)锚国,方法多了比較繁瑣
  • 無法在一個方法里做批處理腕巡,無法級聯(lián)加載
  • 即時是簡單的 CRUD,都顯得繁瑣血筑,導(dǎo)致存在各種彌補 mybatis 這一缺陷的第三方封裝框架
  • 無法面向?qū)ο蠡娉粒瑹o法實現(xiàn) DDD
EBean

優(yōu)點

  • 所有場景都實現(xiàn)非常完美煎楣,代碼可讀性高
  • 實現(xiàn)批處理超級簡單
  • ORM 查詢、sql 查詢车伞、DTO 查詢都非常簡單

缺點

  • DTO 查詢功能較新择懂,有待增加 XML mapping 對 DTO 的支持

Ebean自動創(chuàng)建數(shù)據(jù)表

首先介紹幾個ebean的方法

config.setDdlRun(true);
config.setDdlGenerate(true);
config.setDdlCreateOnly(true);

EbeanServer的配置文件中加上以上配置就可以實現(xiàn)根據(jù)entity自動創(chuàng)建數(shù)據(jù)表,entity的寫法就和jpa的一樣

我看了下文檔的介紹

# setDdlGenerate
public void setDdlGenerate(boolean ddlGenerate)
Set to true to generate the "create all" DDL on startup.
Typically we want this on when we are running tests locally (and often using H2) and we want to create the full DB schema from scratch to run tests.

# setDdlRun
public void setDdlRun(boolean ddlRun)
Set to true to run the generated "create all DDL" on startup.
Typically we want this on when we are running tests locally (and often using H2) and we want to create the full DB schema from scratch to run tests.

# isDdlCreateOnly
public boolean isDdlCreateOnly()
Return true if the "drop all ddl" should be skipped.
Typically we want to do this when using H2 (in memory) as our test database and the drop statements are not required so skipping the drop table statements etc makes it faster with less noise in the logs.

我理解的意思就是另玖,setDdlRun會在一開始的時候困曙,創(chuàng)建所有的數(shù)據(jù)表。但是如果只用這個配置谦去,那么每次啟動都會先執(zhí)行drop all ddl赂弓,即,每次啟動是先刪除所有的表哪轿,再創(chuàng)建需要的表盈魁。

那如果需要達到不刪除已有數(shù)據(jù)表的效果,就需要加上isDdlCreateOnly窃诉,他會跳過drop all ddl這個語句

那么新的問題就來了杨耙,如果寫成

//是否執(zhí)行建表SQL
config.setDdlRun(true);
//是否生成建表SQL
config.setDdlGenerate(true);
//是否跳過刪表SQL
config.setDdlCreateOnly(true);

第一次創(chuàng)建的時候,是沒問題的飘痛,第二次創(chuàng)建的時候珊膜,就會報相應(yīng)的數(shù)據(jù)表already exist的錯誤

解決這個問題呢也非常的簡單,加一個判斷就可以宣脉,判斷是否已經(jīng)存在數(shù)據(jù)表车柠,如果不存在就進行創(chuàng)建,如果已經(jīng)存在就不創(chuàng)建塑猖,也就是下面這樣

@Override
public EbeanServer getObject() throws Exception {
    EbeanServer server = null;
    ServerConfig config = new ServerConfig();
    config.setName("db");
    config.loadFromProperties();
    config.setDefaultServer(true);
    config.setDdlRun(true)   
    config.setDdlCreateOnly(true);
    //省略了生成建表的SQL
    try {
        server = EbeanServerFactory.create(config);
    } catch (Exception e) {
        config.setDdlRun(false);
        server = EbeanServerFactory.create(config);
    }
    return server;
}

但是這樣竹祷。就結(jié)束了嗎?上述實現(xiàn)方式羊苟,并不能達到修改某一字段自動檢測并更新的效果塑陵。

在很多ebean源代碼的分享者那里,都使用DbMigration來進行數(shù)據(jù)庫的遷移蜡励,更新等操作令花。那為什么不用上面的一些方法呢。因為create-all / drop-all這兩個簡單的腳本凉倚,本身就是為了測試而創(chuàng)建的兼都,不是為了實際的編碼使用的

不過話說回來,如果不是頻繁修改稽寒,好像上面的簡單實現(xiàn)也不錯的樣子

除了上面的DdlCreate之外扮碧,Ebean還提供了其他的數(shù)據(jù)初始化方案。比如

config.setDdlInitSql("beforeCreateSql.sql");  //在CreateSql前執(zhí)行
config.setDdlSeedSql("afterCreateSql.sql");  //在CreateSql后執(zhí)行

其中setDdlInitSql是在CreateSql前執(zhí)行的瓦胎,所以無論建表Sql是否執(zhí)行芬萍,都會執(zhí)行這個sql文件(該文件放在resources目錄下)尤揣。而如果數(shù)據(jù)表已存在而跳過了建表SQL,則也會相應(yīng)的跳過setDdlSeedSql這個方法

在這個基礎(chǔ)之上柬祠,我們就能進行數(shù)據(jù)的擴展操作北戏,比如在創(chuàng)建表之后,插入測試數(shù)據(jù)漫蛔,或者直接運行在本地導(dǎo)出的SQL批處理腳本等等

DB Migration

DB Migration 是根據(jù)實體類來生成數(shù)據(jù)庫的當前情況嗜愈,每一次數(shù)據(jù)庫的修改,都可以記錄下來莽龟,并以增量記錄的方式記錄下來

如果在配置文件中蠕嫁,設(shè)置了運行DB遷移文件,也可以達到修改數(shù)據(jù)表的效果毯盈,具體配置如下:

config.setRunMigration(true);

當然生成DB的遷移文件不是自動的剃毒,需要每次在你修改完實體類之后启摄,手動生成桅锄,一般是通過一個main方法執(zhí)行的

package com.example.demo;
import io.ebean.annotation.Platform;
import io.ebean.dbmigration.DbMigration;
import java.io.IOException;

public class GenerateDbMigration {
    /**
     * 生成下一個不同版本的數(shù)據(jù)庫表
     */
    public static void main(String[] args) throws IOException {
        DbMigration dbMigration = DbMigration.create();
        dbMigration.setPlatform(Platform.POSTGRES);
        dbMigration.generateMigration();
    }
}

在運行之后,就能在resources目錄下生成DB遷移文件扑眉,相應(yīng)的版本號也會通過文件名來標識

DB遷移文件

在運行時脑奠,會額外生成一個運行情況的記錄表基公,記錄運行成功的DB遷移數(shù)據(jù)的版本,和相關(guān)的數(shù)據(jù)宋欺,如下圖


DB遷移運行記錄表

通過DB Migration也可以完成數(shù)據(jù)表的創(chuàng)建和更新工作轰豆,相比較之下,比直接全部創(chuàng)建數(shù)據(jù)表精確度更高齿诞,也比執(zhí)行本地導(dǎo)出的SQL批處理文件更加方便酸休,但是DB Migration只更新增加的數(shù)據(jù)表或者增加的字段,如果有數(shù)據(jù)表刪除掌挚,或者某一個字段的刪除雨席,并不會進行相應(yīng)的更新

<changeSet type="pendingDrops">
    <dropColumn columnName="txt" tableName="user_vole"/>
</changeSet>

會顯示pendingDrops,即等待刪除

當然這個操作在一定程度上體現(xiàn)了安全性吠式,畢竟可能會刪除一些數(shù)據(jù),而不是一個空字段或者空表抽米。那如果這些數(shù)據(jù)真的需要刪除呢特占?只要在DB遷移文件生成類中,配置需要執(zhí)行刪除操作的遷移文件版本號即可

public static void main(String[] args) throws IOException {
        //執(zhí)行1.1版本下的刪除操作
        System.setProperty("ddl.migration.pendingDropsFor", "1.1");
        DbMigration dbMigration = DbMigration.create();
        ……
 }

重新生成DB遷移文件之后云茸,就會顯示該等待刪除的字段或者表已經(jīng)生成了相應(yīng)的刪除的SQL語句和新的版本號

相比之下是目,DB Migration比批量的createSql要好不少,而且可以自己制作相應(yīng)版本的DB遷移數(shù)據(jù)标捺,將自己需要的批處理Sql文件導(dǎo)入其中

Hello Ebean

還是要說下Ebean的簡單使用懊纳,畢竟是給很多沒用過Ebean的人看的揉抵。舉個查詢的例子,對某一個field進行升序或者降序排序后嗤疯,分頁查找其中的某一頁數(shù)據(jù)

public List<UserLogin> findByPage(String field, String type, int start, int size) {
     return ebeanServer.find(UserLogin.class)
           .orderBy(field+" "+type)
           .setFirstRow(start)
           .setMaxRows(size)
           .findList();
}

其中冤今,排序的字段和排序的方式是傳入的

Ebean的數(shù)據(jù)操作方式非常多,具體可以看官方文檔茂缚,而且EbeanElasticSearch也整合了戏罢,方便數(shù)據(jù)的全文搜索

另外,EbeanHibernate有一定的相似性脚囊,支持自定義的SQL

public int exeUpdate(String f1, Object v1, String f2, Object v2) {
     String s = "UPDATE user_login set "+f2+" = :v2 where "+f1+" = :v1";
     SqlUpdate update = ebeanServer.createSqlUpdate(s);
     update.setParameter("v1", v1);
     update.setParameter("v2", v2);
     return ebeanServer.execute(update);
 }

基本代碼都貼了龟糕,應(yīng)該差不多沒啥,配置問題網(wǎng)上查一下應(yīng)該都能跑起來悔耘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讲岁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衬以,更是在濱河造成了極大的恐慌缓艳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泄鹏,死亡現(xiàn)場離奇詭異郎任,居然都是意外死亡,警方通過查閱死者的電腦和手機备籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門舶治,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人车猬,你說我怎么就攤上這事霉猛。” “怎么了珠闰?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵惜浅,是天一觀的道長。 經(jīng)常有香客問我伏嗜,道長坛悉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任承绸,我火速辦了婚禮裸影,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘军熏。我一直安慰自己轩猩,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著均践,像睡著了一般晤锹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彤委,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天鞭铆,我揣著相機與錄音,去河邊找鬼葫慎。 笑死衔彻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的偷办。 我是一名探鬼主播艰额,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椒涯!你這毒婦竟也來了柄沮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤废岂,失蹤者是張志新(化名)和其女友劉穎祖搓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湖苞,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拯欧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了财骨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐作。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隆箩,靈堂內(nèi)的尸體忽然破棺而出该贾,到底是詐尸還是另有隱情,我是刑警寧澤捌臊,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布杨蛋,位于F島的核電站,受9級特大地震影響理澎,放射性物質(zhì)發(fā)生泄漏逞力。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一糠爬、第九天 我趴在偏房一處隱蔽的房頂上張望掏击。 院中可真熱鬧,春花似錦秩铆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捅膘。三九已至,卻和暖如春滚粟,著一層夾襖步出監(jiān)牢的瞬間寻仗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工凡壤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留署尤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓亚侠,卻偏偏與公主長得像曹体,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子硝烂,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容