成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Sqlla: 數(shù)據(jù)庫操作從未如此簡單

AJie / 1063人閱讀

摘要:一套數(shù)據(jù)庫的微型庫,提供簡單高效的來操作數(shù)據(jù)庫。讓開發(fā)者不需要關(guān)心數(shù)據(jù)庫操作的具體細節(jié),只需專注和業(yè)務(wù)邏輯。和是兩個事務(wù)方法,他們之間完全隔離,提交和回滾互不影響。

Sqlla

一套數(shù)據(jù)庫的 ORM 微型庫,提供簡單高效的 API 來操作數(shù)據(jù)庫。

Sqlla 擁有極少的API,使用方式簡單。讓開發(fā)者不需要關(guān)心數(shù)據(jù)庫操作的具體細節(jié),只需專注SQL和業(yè)務(wù)邏輯。同時簡單的事務(wù)模型讓開發(fā)過程增益很多。

簡單使用

創(chuàng)建實體類,用 @SqllaEntity 標識

@SqllaEntity
public class UserBean {

    private String uid;
    private String phone;
    private String name;
    
    // 使用 SqllaColumnAlias 標識后的屬性使用 alias 的值來對應(yīng)表中的列
    // 沒有標識時直接使用屬性的名字來對應(yīng)
    @SqllaColumnAlias("gender")
    private int sex;
    
    // setter getter here
}

DAO 接口類

public interface UserDao {

    // 用 @Sql 標識
    @Sql("select * from t_user where uid = ?")
    UserBean getUserById(String uid);

    @Sql("select * from t_user desc by lastActiveTS limit ?")
    List topUsers(int limit);

    @Sql("select (count(*) > 0) from t_user where name = ?")
    boolean userExist(String name);

    @Sql("insert into t_user (id, uid, name, phone) values (null, ?, ?, ?)")
    boolean insertUser(String uid, String name, String phone);

    @Sql("delete from t_user where uid = ?")
    boolean deleteUserById(String uid);
}

創(chuàng)建 Sqlla 實例

Sqlla.ConnectionPool pool = your implimention;
Sqlla sqlla = new Sqlla.Builder().pool(pool).build();

數(shù)據(jù)庫操作 CRUD

UserDao dao = sqlla.createApi(UserDao.class);

// 獲取結(jié)果集中的第一個對象(結(jié)果集的第一行)
UserBean bean = dao.getUserById("uid_10000001");

// 查詢最新的10個用戶
List beanList = dao.topUsers(10);

// 查詢用戶是否存在:對于updateable sql, 返回值可以是int, boolean(>0 for true), void
boolean exists = dao.userExist("李多情");

// 插入用戶到數(shù)據(jù)庫(update count > 0 for true)
boolean inserted = dao.insertUser("uid_10000002", "李明洙", "1324113361*");

// 刪除指定用戶
boolean deleted = dao.deleteUserById("uid_10000003");

DAO接口不需要任何的實現(xiàn)類,是不是使用非常簡單??

概念

實體: 庫中預(yù)置了兩種實體模型

@SqllaEntity 標識的Pojo實體

ViewObject 結(jié)果集視圖實體,代表著結(jié)果集的一樣。類似于扁平的 JSONObject

轉(zhuǎn)換器: 將結(jié)果集轉(zhuǎn)換成實體的部件,可以自定義

DAO接口: CRUD操作集合,每個方法代表一條SQL操作

事務(wù): Transaction 代表一個多條DAO方法的事務(wù)

深入使用

Sqlla.Builder 提供 pool() 和 addConverterFactory() 方法。

pool()方法必須設(shè)置一個ConnectionPool實例(test 代碼提供了一個基于c3p0數(shù)據(jù)源的 pool)。

addConverterFactory() 方法設(shè)置 自定義的結(jié)果集轉(zhuǎn)換工廠(實現(xiàn) ResultConverter.Factory 接口)。 內(nèi)部預(yù)置了三種工廠,

PrimitiveTypeConverterFactory 轉(zhuǎn)換基礎(chǔ)數(shù)據(jù)類型

SqllaEntityConverterFactory 轉(zhuǎn)換 @SqllaEntity 表示的實體類和其列表(List)

ViewObjectConverterFactory 轉(zhuǎn)換 ViewObject 結(jié)果集視圖和其列表(List)

外部可以自定義針對自己特定類型的轉(zhuǎn)換工廠 (ResultSet --> CustomType),自定義的轉(zhuǎn)換工廠 return !null 時會攔截系統(tǒng)預(yù)置的轉(zhuǎn)換工廠。

事物支持

當前版本對事物進行了簡單的支持,與Spring的配合暫時沒有做過測試。

例子
Boolean ret = sqlla.transact(new Transaction(Isolation.SERIALIZABLE) {
    public Boolean transact() throw Exception {
        UserDao dao = sqlla.createApi(UserDao.class);
        dao.deleteUserById("uid_10000004");
        // 也可以手動rollback() or commit(true)
        dao.deleteUserById("uid_10000005");
        return true;
    }
}, false);    // failed value

上面的代碼執(zhí)行了一個簡單的事務(wù),事務(wù)中包含兩條刪除語句。如果都成功,則自動 commit;只要有一個失敗,則會rollback。當回滾之后,事務(wù)將返回給定的 failed value。在事務(wù)中,也可以手動 rollback() 或者 commit(val),這兩個操作只能調(diào)用一次,而且會中斷其后面的代碼執(zhí)行,要謹慎使用。

開啟一個事務(wù)有兩種方法:

T sqlla.transact(Transaction transaction);

void sqlla.transact(Transaction0 transaction);

注意: transact方法是一個同步方法,它會立馬調(diào)用transaction, 并返回。

Transaction 是一個抽象類,抽象方法transact用于實現(xiàn)事務(wù)的具體邏輯。最多有三個參數(shù):isolation,readOnly 和 timeout,分別代表隔離級別,是否只讀,超時秒數(shù)。Transaction0 是其范型為 Void 的子類。Transaction0 是其范型為 Void 的子類。

嵌套事務(wù)

Sqlla 對事務(wù)的嵌套提供了簡單的支持。相比于Spring事務(wù)間的多種傳播機制,Sqlla只提供了 REQUIRES_NEW 的傳播機制:內(nèi)層和外層完全隔離開來,互不影響。

methodA 和 methodB 是兩個事務(wù)方法,他們之間完全隔離,提交和回滾互不影響。

public void methodA() {
    sqlla.transact(new Transaction0() {
        protected void transact0() throws Exception {
            UserDao dao = sqlla.createApi(UserDao.class);
            
            boolean inserted = dao.insertUser("uid_1000007", "王五", "13241133615");
            methodB();  // 事務(wù)B方法
            boolean deleted = dao.deleteUserByName("張三");
        }
    });
}

public void methodB() {
    sqlla.transact(new Transaction0() {
        protected void transact0() throws Exception {
            UserDao dao = sqlla.createApi(UserDao.class);
            boolean inserted = dao.insertUser("uid_1000008", "趙六", "13241133616");
        }
    }
}

如何驗證兩個事務(wù)之間互不影響?

我們先把 mehtodA 中的 deleteUserByName 方法的sql改成一個錯的sql

@Sql("delete from t_user where name = ????????")
boolean deleteUserByName(String name);

現(xiàn)在再調(diào)用 methodA,你會發(fā)現(xiàn) “王五” 這個用戶并未插入到數(shù)據(jù)庫中, “張三” 也沒有被刪除,而 “趙六” 卻實實在在的插入到了數(shù)據(jù)庫中。

注意:假如 methodB 本身并不是一個多帶帶的事務(wù)方法 (未用 sqlla.transact 開啟),那么他將使用外層的事務(wù)。所以要不要使用事務(wù),一定要考慮好,不然可能會有一些意想不到的效果。

Sqlla雖然提供了注解的方式來操作SQL,但是事務(wù)并沒有使用注解的方式, 這和MyBatis一致。實際內(nèi)部實現(xiàn)也和 MyBatis 相差無幾。

GitHub鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70066.html

相關(guān)文章

  • 從未如此驚艷!你好,SuperTextView

    摘要:支持設(shè)置圓角,并且能夠精確的控制圓角位置。如果你想要設(shè)置的顯示出來,必須設(shè)置為。如此驚艷的效果得益于內(nèi)置的動畫驅(qū)動,你能夠結(jié)合來實現(xiàn)難以置信的動畫效果。一切只需要在你合理的編寫好后,調(diào)用和來啟動停止動畫。 showImg(https://segmentfault.com/img/remote/1460000009148011); 簡介 歡迎使用SuperTextView,這篇文檔將會向...

    weapon 評論0 收藏0
  • Laravel5.3分頁以及樣式——從未如此簡單

    摘要:版本以上的分頁比之前的更簡單和人性化首先獲取到數(shù)據(jù),方法能夠自動判定當前頁面正確的數(shù)量限制和偏移數(shù)。默認情況下,當前頁數(shù)由請求所帶的參數(shù)來決定。當然,該值由自動檢測,并自動插入由分頁器生成的鏈接。 laravel5.3版本以上的分頁比之前的更簡單和人性化 1.首先獲取到數(shù)據(jù),paginate方法 能夠自動判定當前頁面正確的數(shù)量限制和偏移數(shù)。默認情況下,當前頁數(shù)由HTTP 請求所帶的 ...

    isLishude 評論0 收藏0
  • 難以置信!LSTM和GRU的解析從未如此清晰

    摘要:作為解決方案的和和是解決短時記憶問題的解決方案,它們具有稱為門的內(nèi)部機制,可以調(diào)節(jié)信息流。隨后,它可以沿著長鏈序列傳遞相關(guān)信息以進行預(yù)測,幾乎所有基于遞歸神經(jīng)網(wǎng)絡(luò)的技術(shù)成果都是通過這兩個網(wǎng)絡(luò)實現(xiàn)的。和采用門結(jié)構(gòu)來克服短時記憶的影響。 短時記憶RNN 會受到短時記憶的影響。如果一條序列足夠長,那它們將很難將信息從較早的時間步傳送到后面的時間步。 因此,如果你正在嘗試處理一段文本進行預(yù)測,RNN...

    MrZONT 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<