歡迎您光臨本站 註冊首頁

jSqlBox 4.0.3 發布,Java 全功能資料庫持久層 ORM 工具

←手機掃碼閱讀     admin @ 2020-03-02 , reply:0

jSqlBox是一個Java全功能資料庫持久層工具,主頁 https://gitee.com/drinkjava2/jsqlbox
jSqlBox主要特點是架構優、尺寸小、功能全,基本上所有與資料庫操作相關的功能,jSqlBox都已提供。其它資料庫工具的主要功能,jSqlBox通常都有對應的方案提供,不提供的往往是不重要甚至是反模式的功能,不信可以隨便找一個其它持久層工具的功能,而jSqlBox卻沒有提供或無法輕易實現的功能來,我會給一個合理解釋。反之,如下jSqlBox具備的功能其它持久層工具往往並不提供:  
1.支持在Java里存放和定位多行(SQL)文本  
2.參數內嵌式SQL寫法  
3.自帶分庫分表
4.自帶聲明式事務、分散式事務 
5.ActiveRecord模式實體類可以只聲明介面,不佔用寶貴的單繼承 
6.支持多種資料庫方言的DDL生成

jSqlBox的目標是做最好的通用持久層工具,正如我喜歡給別的項目找缺點一樣,也歡迎大家來找出jSqlBox的缺點。開源項目就是在不斷的對比和相互學習中進步的。另外如果有誰想聽我嘮叨其它持久層工具優缺點的,也可以在評論里提出,一起來討論,jSqlBox是因為無法忍受現有持久層工具的缺點而誕生的,但是缺點是不是都找對了是值得花時間討論的。    

本次更新(4.0.3.jre8版)內容:
1. [I19WO0] 添加@CreateTimestamp和@UpdateTimestamp兩個實體註解,前者在實體插入到資料庫時自動寫入當前時間戳,後者在實體更新時自動更新對應欄位的時間戳,這兩個註解添加在Date或Timestamp類型上,一個使用示例如下:


public class SomeEntity {  
  
  @CreateTimestamp 
  java.sql.TimeStamp createTime;

  @Temporal(TemporalType.TIMESTAMP) //指定Date的映射類型,可選
  @UpdateTimestamp 
  java.util.Date updateTime;
  ...
}

2. 添加@CreatedBy和@LastModifiedBy兩個實體註解,前者在實體插入到資料庫時自動寫入當前創建者ID,後者在實體更新時自動更新對應欄位的編輯者ID,這兩個註解添加在實體的String類型屬性上,一個使用示例如下:


public class SomeEntity {  
  
  @CreatedBy
  String creator;

  @LastModifiedBy
  String modifier;
  ...
}

因為這兩個註解的當前創建者或修改者ID是在運行期動態獲取的,所以如果用到這兩個註解,必須在jSqlBox的DbContext上下文初始化時,先設置一個編輯者ID獲取類的實例,這個類中必須有一個名為getCurrentAuditor的方法。示例如下:


public static class GetUserIdDemo {
  public Object getCurrentAuditor() {
     //從Spring Security或Shiro之類的單點登錄工具中獲取當前用戶ID值
     return SomeSecurityUtil.getCurrentUserID();
  }
}

DbContext db=new DbContext(dataSource);
db.setAuditorGetter(new GetUserIdDemo());

3. 添加一個@COLUMN實體註解
@COLUMN這個全大寫的註解表示它是非標的,與標準JPA的@Column註解的區別是多了creationTimestamp, cpdateTimestamp, createdBy, lastModifiedBy, comment, tail這幾個私房貨欄位。所以@CreationTimestamp註解也可以寫成@COLUMN(creationTimestamp=true),效果等同。
@COLUMN註解中的comment和tail不會覆蓋掉columnDefinition的內容,而是累加在後面。comment顧名思義是數據表collumn列定義的comment片段,tail則可以加入任意字元串內容到column的DDL列定義未尾。   

4. 增強了從資料庫生成Java實體源代碼功能,將細節配置放在map里作為參數,並增加了linkStyle和fieldFlags兩個選項。使用示例如下,以下語句會讀取資料庫所有表格並在指定的"c:\temp"目錄下生成與所有資料庫表格對應的實體類源碼:


  Map<String, Object> setting = new HashMap<String, Object>();
  setting.put("packageName", "somepackage");
  setting.put("imports", 
              "import com.github.drinkjava2.jdialects.annotation.jdia.*;\n"
            + "import com.github.drinkjava2.jdialects.annotation.jpa.*;\n"
            + "import com.github.drinkjava2.jsqlbox.*;\n" 
            + "import static   com.github.drinkjava2.jsqlbox.DB.*;\n");
  setting.put("classDefinition", "public class $1 extends ActiveRecord<$1>");
  setting.put("linkStyle", true);
  setting.put("fieldFlags", true);
  ...

  TableModelUtils.db2JavaSrcFiles(dataSource, Dialect.MySqlDialect, "c:/temp", setting);

db2JavaSrcFiles方法的第一個參數是數據池,第二個參數是方言,第三個參數是輸出目錄,第四個參數是一個細節配置Map,其中的設定有:
packageName: 實體類的包名
imports: 要引入哪些外部包
classDefinition: 類定義模板,$1佔位符會被類名替換,類可以是POJO,也可以繼承於jSqlBox的ActiveRecord或只聲明實現ActiveEntity介面(限Java8)。
linkStyle:生成鏈式風格的setter, 即settter方法不再是void聲明,而是會返回類實例本身。鏈式風格的優點是可以寫出非常簡潔高效的語句,如: 
                 new User().setId("張三").load().setAge(13).update();             
fieldFlags: 為每一個實體屬性生成一個字元串常量,常量名為為屬性的大寫,值為數據表的列名。有了這個欄位,可以利用它來拼寫支持重構的SQL。

以下是一個實際由jSqlBox的源碼生成程序生成的實體類示例,它的linkStyle屬性和fieldFlags屬性都設為了true:


package somepackage;
import com.github.drinkjava2.jdialects.annotation.jdia.*;
import com.github.drinkjava2.jdialects.annotation.jpa.*;
import com.github.drinkjava2.jsqlbox.*;
import static com.github.drinkjava2.jsqlbox.DB.*;

@Table(name="entity1")
public class Entity1 extends ActiveRecord<Entity1> {

  public static final String ID = "id";
  @Id
  @Column(name=ID)
  private Integer id;

  public static final String NAME = "name";
  @Id
  @Column(name=NAME, length=10)
  private String name;

  public static final String CUSTID = "cust_id";
  @Column(name=CUSTID)
  private Integer custId;

  public Integer getId(){
    return id;
  }

  public Entity1 setId(Integer id){
    this.id=id;
    return this;
  }

  public String getName(){
    return name;
  }

  public Entity1 setName(String name){
    this.name=name;
    return this;
  }

  public Integer getCustId(){
    return custId;
  }

  public Entity1 setCustId(Integer custId){
    this.custId=custId;
    return this;
  }

}

實體源碼自動生成功能在項目開發初期比較有用,尤其是以資料庫建模驅動而不是以實體建模驅動開發的項目,但是不能過分依賴它,代碼生成工具到了項目後期就成了雞肋,實體欄位的增減、重構,直接在IDE里修改反而更簡單穩當。 


[admin ]

來源:OsChina
連結:https://www.oschina.net/news/113757/jsqlbox-4-0-3-released
jSqlBox 4.0.3 發布,Java 全功能資料庫持久層 ORM 工具已經有319次圍觀

http://coctec.com/news/all/show-post-226508.html