android 數據庫框架:DBExecutor

jopen 10年前發布 | 38K 次閱讀 Android開發 移動開發 DBExecutor

DBExecutor主要的功能

  • 使用了讀寫鎖,支持多線程操作數據。

  • 支持事務

  • 支持ORM

  • 緩存Sql,緩存表結構

這個類庫主要用于android 數據庫操作。 始終圍繞著一個類對應一個表的概念。 只要創建一個實體類,就不用當心它怎么存儲在數據庫中,不用重新寫增刪改查的代碼。基本的功能已經幫你實現好了。 增刪改查數據只要一句搞定

boolean isSuccess = db.insert(person);
boolean isSuccess = db.updateById(person);
boolean isSuccess  = db.deleteById(Person.class,1);
List<Person> persons = db.findAll(Person.class);
  • ---library_DB02 是項目的源碼。

  • ---DBLibrary_TestCase 是項目的測試用例,主要介紹該類庫詳細的用法

  • ---doc 是網頁文檔

  • ---db.jar 是該類庫的jar包

  • ---doc.chm 是該類庫的chm文檔

  • ---設計框架.docx 是該類庫的uml圖生成的圖片

  • ---設計框架.mdl 是該類庫的uml圖,描述整個類庫的架構

如果有什么建議可以發我郵箱 告知。794629068@qq.com

最后非常感謝XUtils代碼的作者wyouflf。 該代碼是對開源項目XUtils的數據庫模塊進行重構,及性能優化。 因為他的框架設計的非常合理。很多都是在其基礎上完善的。

1.定義一個簡單對應表的實體類

@Table(name = "Person")
public class Person {
 @Id(autoIncrement = true)
 private int id;
 private String name;
 private int age;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

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

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

}

必須包含@Id,@Id聲明的字段對應表里的id。autoIncrement = true 自增長。 @Table 聲明表的名字。@Table可以不需要。如果沒有@Table以包名+類名為表的名字

支持基本類型以及基本類型的封裝類,java.sql.Date 定義的字段。如果要支持其他類型的字段請查看DBLibrary_TestCase中的TestColumnConverter.java

2.主要類

1.DBExecutor主要用于執行sql語句,一個數據庫對應一個DBExecutor

獲取默認數據庫的執行者 DBExecutor executor = DBExecutor.getInstance(context); 獲取指定的數據庫的執行者 DBExecutor.getInstance(dbHelper)

主要的方法用 db.execute(sqls),db.executeQuery(sql)等 封裝了簡基本的增刪改查操作,使用db.insert(person);可以保存一條記錄。 執行sql的時候。不用考慮表是否創建。如果表不存在,會自動創建。

2.Sql用于DBExecutor 執行的Sql

與sql文本語句是有差別的。 區別在于Sql 里包含
sql.getTable();//操作的表
sql.getSqlText();//可以帶有?占位符的sql語句
sql.getBindValues();//?占位符對應的值。

sql.setCheckTableExit(checkTableExit);//設置執行sql時檢查表是否存在,默認為true如果 檢查到表不存在自動創建,設置為false 不做檢查 不要害怕復雜,我們可以通過SqlFactory 創建它Sql

3.SqlFactory主要用于創建Sql語句,可以創建復雜增刪改查的sql語句。

// 查詢語句
  Sql sql = SqlFactory.find(Person.class);
  sql = SqlFactory.find(Person.class).where("name", "=", "試著飛");
  sql = SqlFactory.find(Person.class).where("age", "=", "10").or("age", "=", 11);
  sql = SqlFactory.find(Person.class).where("age", "=", "10").orderBy("name", false);
  sql = SqlFactory.find(Person.class).where("age", "=", "10").orderBy("name", false).limit(1);
  sql = SqlFactory.find(Person.class).where("name", "like", "%飛");
  sql = SqlFactory.find(Person.class).where("name", "like", "_著_");
  sql = SqlFactory.find(Person.class).where("age", "in", new int[] { 10, 11, 12 });
  sql = SqlFactory.find(Person.class).where("name", "in", new String[] { "小明", "小紅" });
  sql = SqlFactory.find(Person.class, "name", "age").where("name", "=", "試著飛");
  sql = SqlFactory.find(Person.class, "count(*) as num").where("age", "=", "11");
  sql = SqlFactory.find(Person.class, "max(age) as maxAge", "min(age) as minAge").where("sex", "=", "男");
  sql = SqlFactory.find(Person.class, new MaxFunction("age", "maxAge"), new MinFunction("age", "minAge")).where("sex", "=", "男");
  sql = SqlFactory.find(Person.class).where("name=? and age=?", new Object[] { "小明", 11 });

  // 刪除語句
  sql = SqlFactory.deleteAll(Person.class);
  sql = SqlFactory.delete(Person.class).where("age", "=", 11);
  sql = SqlFactory.deleteById(Person.class, 11);
  sql = SqlFactory.deleteById(Person.class, new int[] { 11, 12 });

  // 更新語句
  sql = SqlFactory.update(Person.class, new String[] { "name", "age" }, new Object[] { "小明", "11" }).where("id", "=", 1);
  sql = SqlFactory.updateById(new Person(1, "小明", 11, "男"));
  sql = SqlFactory.updateById(new Person(1, "小明", 11, "男"), "name");

  // 如果存在 id為1的記錄,就更新,否則 插入一條新記錄
  sql = SqlFactory.updateOrInsertById(new Person(1, "小明", 11, "男"));

  // 插入語句
  sql = SqlFactory.insert(new Person(1, "小明", 11, "男"));

  // 自拼接sql語句
  sql = SqlFactory.makeSql(Person.class, "select * from Person where age = ?", new Object[] { 11 });

更多詳細信息請查看項目文檔里面的內容

項目主頁:http://www.baiduhome.net/lib/view/home/1410750546086

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!