根据Java实体自动生成数据库表.
不需要书写任何SQL语句即可实现对数据库的 创表 增 删 查 改 分页 操作.
所有的操作方法都是静态的方法,依赖库是一个仅为 10+ K 大小的jar,代码污染率极低.所有的操作方法都集成在 "SqlTemplate" 对象.
pixel-data-base.jar (在项目根目录可以找到)
支持Java的八大基础类型与String类型数据,不支持数组,不支持List,基本类型与String类型之外的其他类型将会实例化到数据库时失败.
为需要实例化到数据库的字段添加 "@TableColumn" 注解, 要实例化到数据库表中的属性名不能是"_id",因为数据库中自己会建立一个列为"_id".
如下:
/**
* 数据库实体 (就是一个普通的Java对象)
*/
public class UserTable {
public Long id; // 没有 @TableColumn 注解在数据库表中不会创建该字段
// @TableColumn
// public Long _id; // 错误,不能用该名字,数据库表中已经存在改列名,属于关键字,不能使用.
@TableColumn
public String name; // 在数据库表中会创建一个名为'name'的列
@TableColumn
public Integer age; // 在数据库表中会创建一个名为'age'的列
// @TableColumn
// public List<String> list; // 创建失败,不支持List或者数组等集合的属性
}
SqlTemplate.initDataBase(getApplicationContext(), "pdb.db", 1, UserTable.class, MsgTable.class);
// 需要生成数据表的对象 注意: 数据名是对象的全路径名,不能随意修改对象包名与对象名.
Class<?>[] tables = new Class[]{UserTable.class, MsgTable.class, TestTable.class, BaseTable.class};
// 直接修改版本号,不传入回调接口数据库会重建所有表,现有的表数据会被删除。
// SqlTemplate.initDataBase(this, "pdb.db", 3, tables);
// 初始化数据库与创建数据库表 version修改后,onUpgrade方法会被回调.
SqlTemplate.initDataBase(this, "pdb.db", 3, tables, new OnDbUpdateCallback() {
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion, Class<?>... tables) {
if (oldVersion >= newVersion) {
return;
}
for (Class<?> table : tables) {
// 自定义修改部分表
if (table == UserTable.class) {
// 如果对象中有2两个属性有映射到数据库,则则两个字段都要声明,即使没有变更也要加入ColumnMapping。
List<ColumnMapping> columnMappingList = new ArrayList<ColumnMapping>() {{
// add(new ColumnMapping("name", "username")); // 数据库的列名从'user'变为'username',将原来'user'列的数据库,转移到新的'username'列上.
add(new ColumnMapping("username", "name")); // 数据库的列名从'username'变为'user',将原来'username'列的数据库,转移到新的'user'列上.
add(new ColumnMapping("age", "age")); // 'age'属性未变更也需要声明
}};
SqlTemplate.updateOrCreateTable(table, columnMappingList); // 更新表结构,保留原数据.
}
/*else {
SqlTemplate.updateOrCreateTable(table, null); // 更新表结构,不保留原数据.
}*/
}
}
});
long count = SqlTemplate.getTableRowCount(UserTable.class); // 获取 UserTable 数据表中有多少行数据
SqlTemplate.insert(new UserTable("测试", 100)); // 插入
SqlTemplate.update(new UserTable("运行", 200), _id, "_id"); // 更新 (条件: 数据库"_id"列要等于_id变量的值)
SqlTemplate.delete(UserTable.class, _id, "_id"); // 删除 (条件: 数据库"_id"列要等于_id变量的值)
List<UserTable> userTables = SqlTemplate.query(UserTable.class); // 查询 (无条件,读取所有.)
List<UserTable> userTables = SqlTemplate.query(UserTable.class, _id, "_id"); // 查询 (有条件: 数据库"_id"列要等于_id变量的值)
List<UserTable> userTables = SqlTemplate.query(UserTable.class, _id, "_id", 20L, 0L); // 分页查询 (有条件: 数据库"_id"列要等于_id变量的值, 查询第0页, 每页20条.)
需要更复杂的查询可以考虑使用: SqlTemplate.querySupport(),或者获取SQLiteDatabase对象直接执行SQL语句进行操作.
// 需要保留原数据,传入旧列名与新列名的对应关系,没变更的列名也需要传入.
PixelTools.updateTable(UserTable.class, new ArrayList\<ColumnMapping>() {{
add(new ColumnMapping("username", "name")); // ColumnMapping 参数说明: 1. 原列名, 2. 新列名
add(new ColumnMapping("age", "age")); // 将未更新前的'age'列的值保存到更新后的'age'值 (即使字段名没有修改,也需要这样操作,不然之前的'age'字段的数据将会丢失.)
}});
// 如果不需要保留原数据
PixelTools.updateTable(UserTable.class, null); // 映射参数传入 null, 仅仅更新表结构,不保留原数据,原来的数据会丢失.
public class UserTable implements OnDbIdCallback {
@Override
public void setId(Long _id) {
this.id = _id; // OnDbIdCallback接口方法,回传数据库自增长的ID的值.
}
}
SQLiteDatabase database = SqlTemplate.getSQLiteDatabase();
1. 封装对多表的联合查询操作,但是这样可能需要建立类似Hibernate那样的映射文件,支持库的复杂度会增加.
2. 增加对byte[]类型的支持.
3. 更新表结构的策略需要修改,不传入回调接口,默认在原来表基础上增加字段,不删除表数据。实际情况很少出现删除字段与修改字段的情况,大部分都是增加字段的情况。
[[email protected]](https://mail.qq.com/cgi-bin/frame_html)