不构建 POJO 访问数据库

Jul 10, 2017 10:38:44 AM

作者:zozoh

POJO 之苦

很多时候,程序员在访问数据库时,预先构建一个 POJO 对象,会为之后的编程带来很大的便利。但是有些时候,构建 POJO 是不可能的,或者是很麻烦的,比如:

  • 字段可以动态增删的表
  • 表是被动态创建出来的
  • 非常少用到的表,为此维护一个 POJO 很不划算
    当然上述三个问题都可以通过 自定义 SQL 来实现,但是它毕竟有一点点复杂。想想其他的动态语言是怎么做的吧。他们为每条数据库记录直接返回一组名值对。很简单不是吗?

名值对,非常像 JDBC 中的 ResourceSet 对象,但是不幸的是,你不能把它保存到任意的地方,因为一旦 Connection 关闭了,它就 Over 了。为此,我想很多人都会想到从 ResultSet 读取一组 Map。Nutz.Dao 也提供了一个,它不是 Map 而是一个 Map 的包裹类 — Record。它比 Map 提供了更多的一些包裹方法,便于你取值。

对于 Update, Insert 操作,你可以使用 Chain (值链)。 这个我们后面会给你举几个例子,一看便知。

至于 Delete 操作, 通过 Dao.clear 操作,并配合上 Condition,你可以很容易删除数据

后面的例子,我们都假设有这样一个数据表:

  1. t_pet {
  2. id INT PK,
  3. name VARCHAR(20) UNIQUE,
  4. birthday TIMESTAMP
  5. }

获取一条记录

  1. // 根据主键获取
  2. Record re = dao.fetch("t_pet", Cnd.where("id","=",2));
  3. // 根据名字获取
  4. re = dao.fetch("t_pet", Cnd.where("name","=","XiaoBai"));
  5. // 打印名字
  6. System.out.println(re.getString("name"));
  7. // 打印生日
  8. System.out.println(re.getTimestamp("birthday"));
  9. // 打印字段总数
  10. System.out.println(re.getColumnCount());
  11. // 转换成 Pet 类,如果你有 Pet 类的话
  12. Pet pet = re.toPojo(Pet.class);
  13. // 转换成 Json 字符串
  14. String json = re.toJson(JsonFormat.nice());

查询多条记录

  1. // 查询所有以 A 开头的 Pet
  2. List<Record> list = dao.query("t_pet", Cnd.where("name","LIKE","A%"), null);
  3. // 查询所有以 A 开头的 Pet,返回前10个
  4. List<Record> list = dao.query("t_pet", Cnd.where("name","LIKE","A%"), dao.createPager(1,10));

插入

  1. dao.insert("t_pet", Chain.make("name","XiaoBai").add("birthday", new Timestampe(System.currentTimeMillis())));

它会执行 SQL

  1. INSERT INTO t_pet (name,birthday) VALUES ('XiaoBai', '2010-4-28 14:27:12')

值链实际就是通过链式赋值的方式构建出的一组名值对,当然如果值链较长你可以:

  1. Chain ch = Chain.make("字段名",字段值);
  2. ch.add("字段名", 字段值);
  3. ch.add("字段名", 字段值);
  4. ch.add("字段名", 字段值);
  5. ...

更新

  1. dao.update("t_pet",
  2. Chain.make("name","XiaoBai").add("birthday", new Timestampe(System.currentTimeMillis())),
  3. Cnd.where("id","=",2));

它会执行 SQL

  1. UPDATE t_pet SET name='XiaoBai', birthday='2010-4-28 14:27:12' WHERE id=2;

如果已经有一个map呢??

  1. dao.update("t_pet", Chain.from(map), Cnd.where("id","=",2));

删除

  1. dao.clear("t_pet", Cnd.where("id", "=" ,2));

它会执行 SQL

  1. DELETE t_pet WHERE id=2;

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/dao/record.html