作者從 C# 轉型 Java,習慣了 PetaPoco 的極簡體驗,調研主流方案後決定自研:
目標:學習 Java 高級特性、掌握底層數據組件、構建團隊遷移利器。
insert/update/delete/query 一行搞定PageInfo 封裝總頁數、總記錄數、當前頁數據@TableName("user_info")
@PrimaryKey(value = "id", autoIncrement = true)
public class UserInfo {
private int id;
private String userName;
@Column("password") private String password;
@Ignore private String none; // 不映射
// getter/setter 省略
}
DruidDataSource ds = new DruidDataSource(); // 配置數據源 Database db = new Database(ds); // 查詢所有 Listlist = db.query(UserInfo.class, "SELECT * FROM user_info"); // 單值查詢 Integer count = db.executeScalar(Integer.class, "SELECT COUNT(1) FROM user_info"); // 首條記錄 UserInfo user = db.firstOrDefault(UserInfo.class, "SELECT * FROM user_info WHERE id = ?", 123);
PageInfopage = db.pagedList(UserInfo.class, 1, 10, "SELECT * FROM user_info WHERE age > ? ORDER BY createDate DESC", 20);
PageInfo 包含:currentPage, totalPages, totalItems, itemsPerPage, items。
// 新增
UserInfo u = new UserInfo();
u.setUserName("PetaPojo");
u.setPassword("123123");
db.insert(u);
// 修改
u = db.firstOrDefault(UserInfo.class, "SELECT * FROM user_info WHERE id = ?", 1);
u.setPassword("123456");
db.update(u);
// 刪除(多種方式)
db.delete(u); // 實體刪除
db.delete(UserInfo.class, 1); // 主鍵刪除
db.delete(UserInfo.class, "WHERE id = ?", 1); // 條件刪除
// 原始 db.firstOrDefault(UserInfo.class, "SELECT * FROM user_info WHERE id = ?", 1); // 簡化:自動根據實體註解推斷表名、主鍵、列名 db.firstOrDefault(UserInfo.class, "WHERE id = ?", 1);
// 基礎鏈式
Sql sql = Sql.create()
.append("SELECT * FROM user_info")
.append("WHERE id = ?", id)
.append("AND createDate >= ?", DateTime.now());
// 條件化組裝
Sql sql = Sql.create().append("SELECT * FROM user_info");
if (age != null) sql.append("AND age > ?", age);
if (startDate != null) sql.append("AND createDate >= ?", startDate);
// 高級鏈式 API(配合自動補全更簡潔)
Sql sql = Sql.create()
.where("id = ?", 1)
.where("age >= ? AND age <= ?", 10, 20)
.orderBy("createDate DESC");
PageInfo page = db.pagedList(UserInfo.class, 1, 10, sql);
// 枚舉實現 IEnumMessage 接口
public enum UserType implements IEnumMessage {
Student(1, "學生"), Teacher(2, "老師"), Coder(4, "碼農");
// 存儲為 int,讀取自動映射回枚舉
}
// 實體中直接使用
private UserType userType;
private DateTime createDate; // 需 toString() 傳參
// 查詢參數
sql.where("createDate >= ?", DateTime.now().toString());