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 }); 更多詳細信息請查看項目文檔里面的內容