Jul 10, 2017 10:38:44 AM

概述

传统关系型数据库定义了四种数据操作:

  • 插入 Insert
  • 删除 Delete
  • 更新 Update
  • 查询 Query
    可以说,这四种操作涵盖了所有的数据操作。并且,除了 插入 操作,所有的操作都是可以一次针对多条记录的。

但是,Nutz.Dao 认为从使用者的角度来看,这四种操作还是有所不同的。比如,查询返回的结果,很多时候仅仅是一条记录。我们需要为这种情况进行优化。所以,Nutz.Dao 在传统关系型数据库数据操作的基础上定义了如下的数据操作:

请注意: 这里我是说 “一条” SQL。 如果通过 Dao 接口,你传入的是一个集合或者数组,它会为每一个元素都生成一条 SQL 并执行,并更新操作:

同理,delete 和 insert 也支持传入数组和集合

示例的前提条件

  • 我们假设已经创建了实体类 com.zzh.demo.Person 和实体表 t_person
  • 在文档 Nutz.Dao 入门 中,我们已经声明了这个实体
  • 下述所有的操作都是假设已经有了 dao 变量,并且它指向一个 Dao 的实例。文档 中,我们给出了如何创建 Dao 实例,以及如何搭建运行环境

创建数据表

为 Pet 创建数据表,如果数据表存在,则自动忽略

  1. dao.create(Pet.class, false);

删除数据表

删除 Pet 的数据表

  1. dao.drop(Pet.class);//全部删掉哦,没条件的,慎用!!

插入 Insert

  1. Person p = new Person();
  2. p.setName("Peter");
  3. p.setAge(22);
  4. dao.insert(p);
  5. System.out.println(p.getId());
  • 更多的关于 注解的描述,请参看 关于主键 以及

取得 Fetch

根据名称获取 (如果你的实体声明了 字段, 字符型主键,或者带唯一性索引的字段)

  1. Person p = dao.fetch(Person.class,"Peter");
  2. System.out.println(p.getId());

根据 ID 获取 (如果你的实体声明了 @Id 字段, 数值型主键)

  1. Person p = dao.fetch(Person.class,2);
  2. System.out.println(p.getName());

@Name可以同时存在于一个Pojo类内,但不允许标注在同一个属性,毕竟不可以同时是数值型主键又是字符型主键

更新 Update

  1. Person p = dao.fetch(Person.class,2);
  2. p.setAge(32);
  3. dao.update(p)
  4. dao.update(p, "^age$"); //仅更新age,参数是个正则表达式
  5. // 注意, p至少带@Id/@Name/@Pk中的一种
  6. dao.update(list, "^age$"); //更新一个集合也是可以的

更新多条

  1. // 根据特定条件更新特定字段
  2. dao.update(Person.class, Chain.make("dead",true), Cnd.where("age",">",150));
  3. // 常用的+1更新
  4. dao.update(Person.class, Chain.makeSpecial("age", "+1").add("location", "yvr"), Cnd.where("name","=", "wendal"));

删除 Delete

直接删对象

根据名称删除 (如果你的实体声明了 @Name 字段). 批量删除请用clear

  1. dao.delete(Person.class,"Peter");

根据 ID 删除 (如果你的实体声明了 字段)

  1. dao.delete(Person.class,2);

直接删列表. 如果要按条件删,用dao.clear

  1. dao.delete(list);

查询 Query

  1. List<Person> people = dao.query(Person.class, null);

按条件查询

  1. List<Person> people = dao.query(Person.class, Cnd.where("name", "like", "P%"));
  • Cnd 类的全名是 org.nutz.dao.Cnd
    • where() 函数 第一个参数是字段名,要和 Java 类里面的字段名相同。
    • where() 函数 第二个参数遵循 SQL 的标准,可以是 >, <, >=, <= 等等
    • 提供了一个 wrap 函数,你可以直接写 SQL 的条件
  • 如果你愿意,你完全可以自己实现一个 Condition,来做更复杂灵活的判断
  • 关于更多的查询条件的说明,请参看 复杂条件
  1. List<Person> people = dao.query(Person.class, Cnd.where("age", ">", 18), dao.createPager(2, 4));
  • dao.createPager 第一个参数是第几页,第二参数是一页有多少条记录
  • 关于分页更多的说明,请参看

清除 Clear

清除所有记录

  1. dao.clear(Person.class); //还是那句,慎用
  • 关于更多的清除条件的说明,请参看 复杂条件

插入和更新集合

  • 集合 ( Collection<?> )
  • 数组 ( T[] )
    Nutz.Dao 会自动替你拆包,对集合成员依次执行相应操作。 对于 Map,它会迭代每一个值。

集合操作(func)

整数类型. 例如调用sum

  1. dao.func(Person.class, "sum", "age");
  1. dao.func2(Person.class, "min", "price");

自动建表

Dao接口有一个create方法,通过它可以让nutz为你建好数据库表

  1. dao.create(Pet.class, false);

第一个参数是Pojo类, 第二个参数是如果表存在,是不是先删再重新建,否则就是保持原样

字段的详细定义,例如定义长度

  1. @ColDefine(width=1024)
  2. private String data;

强制自定义字段类型

  1. @ColDefine(customType="TEXT", type=ColType.VARCHAR)
  2. private String fu;

添加索引, 类级注解

  1. @TableIndexes({@Index(name="orderid_userid", fields={"orderId", "userId"})})
  2. public class UserOrder {
  3. private long id;
  4. private long orderId;
  5. private long userId;
  6. //... 其他属性
  7. }

局限性

  • 不生成外键,我们也不推荐用外键
  • 只能解决一般建表需求,复杂的表结构请通过自定义sql完成

批量建表,扫描某个package下的bean,为带注解的类建表

    表结构自动迁移

    本页面的文字允许在和GNU自由文档许可证下修改和再使用。