- 修復開發模式下,某些情況下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; }