BeetlSQL 3.12.8 釋出,流行的 Java ORM 工具

2022-01-06 15:00:22
  • 修復開發模式下,某些情況下SQL檔案的更新時間判斷有誤,導致及時檔案沒修改每次都更新的的Bug
  • 程式碼生成模組,生成的sql檔案裡增加一個json對映設定。可以用此來編寫複雜對映,無需從頭新寫
<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetlsql</artifactId>
    <version>3.12.8-RELEASE</version>
</dependency>

BeetlSQL 自主研發自 2015 年,目標是提供開發高效,維護高效,執行高效的資料存取框架,它適用範圍廣,客製化性強,寫起資料庫存取程式碼特別順滑,不亞於 MyBatis。你不想寫 SQL 也好,或者想更好地寫 SQL 也好,BeetlSQL 都能滿足這要求,目前支援的資料庫如下

  • 傳統資料庫:MySQL (包括支援MySQL協定的各種資料庫), MariaDB ,Oralce ,Postgres (包括支援 Postgres 協定的各種資料庫), DB2 , SQL Server ,H2 , SQLite , Derby ,神通,達夢,華為高斯,人大金倉,PolarDB,GBase8s,GreatSQL 等
  • 巨量資料:HBase,ClickHouse,Cassandar,Hive,GreenPlum
  • 物聯網時序資料庫:Machbase,TD-Engine,IotDB
  • SQL查詢引擎:Drill,Presto,Druid
  • 記憶體資料庫:ignite,CouchBase

 原始碼和例子   效能測試 

例子1,內建方法,無需寫SQL完成常用操作

UserEntity user  = sqlManager.unique(UserEntity.class,1);

user.setName("ok123");
sqlManager.updateById(user);

UserEntity newUser = new UserEntity();
newUser.setName("newUser");
newUser.setDepartmentId(1);
sqlManager.insert(newUser);

輸出紀錄檔友好,可反向定位到呼叫的程式碼

┏━━━━━ Debug [user.selectUserAndDepartment] ━━━
┣ SQL:     select * from user where 1 = 1 and id=?
┣ 引數:     [1]
┣ 位置:     org.beetl.sql.test.QuickTest.main(QuickTest.java:47)
┣ 時間:     23ms
┣ 結果:     [1]
┗━━━━━ Debug [user.selectUserAndDepartment] ━━━

例子2 使用SQL

String sql = "select * from user where id=?";
Integer id  = 1;
SQLReady sqlReady = new SQLReady(sql,new Object[id]);
List<UserEntity> userEntities = sqlManager.execute(sqlReady,UserEntity.class);
//Map 也可以作為輸入輸出引數
List<Map> listMap =  sqlManager.execute(sqlReady,Map.class);

例子3 使用模板SQL

String sql = "select * from user where department_id=#{id} and name=#{name}";
UserEntity paras = new UserEntity();
paras.setDepartmentId(1);
paras.setName("lijz");
List<UserEntity> list = sqlManager.execute(sql,UserEntity.class,paras);

String sql = "select * from user where id in ( #{join(ids)} )";
List list = Arrays.asList(1,2,3,4,5); Map paras = new HashMap();
paras.put("ids", list);
List<UserEntity> users = sqlManager.execute(sql, UserEntity.class, paras);

例子4 使用Query類

支援重構

LambdaQuery<UserEntity> query = sqlManager.lambdaQuery(UserEntity.class);
List<UserEntity> entities = query.andEq(UserEntity::getDepartmentId,1)
                    .andIsNotNull(UserEntity::getName).select();

例子5 把數十行SQL放到sql檔案裡維護

//存取user.md#select
SqlId id = SqlId.of("user","select");
Map map = new HashMap();
map.put("name","n");
List<UserEntity> list = sqlManager.select(id,UserEntity.class,map);

例子6 複雜對映支援

支援像mybatis那樣複雜的對映

  • 自動對映
@Data
@ResultProvider(AutoJsonMapper.class)
 public static class MyUserView {
        Integer id;
        String name;
        DepartmentEntity dept;
 }
  • 設定對映,比MyBatis更容易理解,報錯資訊更詳細
{
	"id": "id",
	"name": "name",
	"dept": {
		"id": "dept_id",
		"name": "dept_name"
	},
	"roles": {
		"id": "r_id",
		"name": "r_name"
	}
}

例子7 最好使用mapper來作為資料庫存取類

@SqlResource("user") /*sql檔案在user.md裡*/
public interface UserMapper extends BaseMapper<UserEntity> {

    @Sql("select * from user where id = ?")
    UserEntity queryUserById(Integer id);

    @Sql("update user set name=? where id = ?")
    @Update
    int updateName(String name,Integer id);

    @Template("select * from user where id = #{id}")
    UserEntity getUserById(Integer id);

    @SpringData/*Spring Data風格*/
    List<UserEntity> queryByNameOrderById(String name);

    /**  * 可以定義一個default介面  * @return  */
     default List<DepartmentEntity> findAllDepartment(){
        Map paras = new HashMap();
        paras.put("exlcudeId",1);
        List<DepartmentEntity> list = getSQLManager().execute("select * from department where id != #{exlcudeId}",DepartmentEntity.class,paras);
        return list;
    }


    /**  * 呼叫sql檔案user.md#select,方法名即markdown片段名字  * @param name  * @return  */
     List<UserEntity> select(String name);


    /**  * 翻頁查詢,呼叫user.md#pageQuery  * @param deptId  * @param pageRequest  * @return  */
    PageResult<UserEntity> pageQuery(Integer deptId, PageRequest pageRequest);
	
    @SqlProvider(provider= S01MapperSelectSample.SelectUserProvider.class)  List<UserEntity> queryUserByCondition(String name);

    @SqlTemplateProvider(provider= S01MapperSelectSample.SelectUs  List<UserEntity> queryUserByTemplateCondition(String name);

    @Matcher /*自己定義個Matcher註解也很容易*/
    List<UserEntity> query(Condition condition,String name);
}

你看到的這些用在Mapper上註解都是可以自定義,自己擴充套件的

例子8 使用Fetch 註解

可以在查詢後根據Fetch註解再次獲取相關物件,實際上@FetchOne和 @FetchMany是自定義的,使用者可自行擴充套件

    @Data
    @Table(name="user")
    @Fetch
    public static class UserData {
        @Auto
        private Integer id;
        private String name;
        private Integer departmentId;
        @FetchOne("departmentId")
        private DepartmentData dept;
    }

    /**  * 部門資料使用"b" sqlmanager  */
    @Data
    @Table(name="department")
    @Fetch
    public static class DepartmentData {
        @Auto
        private Integer id;
        private String name;
        @FetchMany("departmentId")
        private List<UserData> users;
    }

 

展開閱讀全文