数据库查询

写入数据

其他用法

Misc

与实体交互

到目前为止,我们一直在讨论使用 SQL 语句的 SqlMan。可能看起来我们离不开 SQL,但事实并非如此。SqlMan 提供了一种使用实体与数据库交互的方式,无需编写任何 SQL 代码。

这里的实体指的是 Java Bean(POJO)或 Map 对象。

查询实体

假设我们的数据库中有一个 shop_address 表,我们想要查询其中的所有记录。最基本的,我们需要知道要查询哪个表,所以可以这样做:

List<Map<String, Object>> result2 = new Entity(conn).setTableName("shop_address").list().queryList();
assertFalse(result2.isEmpty());

默认情况下,它会生成以下 SQL 语句:

SELECT * FROM shop_address WHERE 1=1 ORDER BY create_date DESC

遵循"约定优于配置"原则,它假设表中有一个名为 create_date 的列。它会自动执行降序查询。

如果这样的列不存在怎么办?我们可以指定要查询的列。这完全可以,但需要更多代码:

TableModel tableModel = new TableModel();
tableModel.setTableName("shop_address");
tableModel.setCreateDateField("create_at"); // 指定列名
tableModel.setHasIsDeleted(false);

List<Map<String, Object>> result = new Entity(conn).setTableModel(tableModel).list().queryList();
assertFalse(result.isEmpty());

TableModel 定义了如何查询表。

自定义条件查询

虽然你不能像 SQL 语句那样直接传递参数,但你仍然可以传递 WHERE 子句到查询中:

List<Address> addresses = new Entity(conn).setTableModel(tableModel).list("AND stat = 1").queryList(Address.class);
assertNotNull(addresses);

记住在条件语句前添加 AND

另外,这个例子展示了结果是 Java Bean 对象而不是 Map 对象。

使用 Java Bean 查询

使用 Java Bean 也是可以的:

Address bean = new Entity(conn).setTableName("shop_address").info(1L).query(Address.class);

分页查询

分页功能的使用方式与上面相同:

PageResult<Object> article = new Entity(conn).setTableName("shop_address").list().page();
assertFalse(article.isEmpty());

插入实体

这段代码演示了如何使用 SqlMan 的实体功能向数据库插入新记录。首先,创建一个新的 Address 对象并设置其属性:

Address address = new Address();
address.setName("出差");
address.setAddress("广州");
address.setPhone("188");
address.setPhone2("188");
address.setRe("Tom");

然后,使用 TableModel 配置表设置:

TableModel tableModel = new TableModel();
tableModel.setTableName("shop_address");
tableModel.setAutoIns(true);
tableModel.setIdTypeClz(Integer.class);

最后,执行插入操作:

CreateResult<Integer> result = new Entity(conn).setTableModel(tableModel).input(address).create(Integer.class);
assertNotNull(result.getNewlyId());
assertTrue(result.isOk());

这段代码会根据 Address 对象的属性自动生成并执行 INSERT SQL 语句。CreateResult 对象返回操作的相关信息,包括新生成的记录 ID。

更新实体

这段代码演示了如何使用 SqlMan 的实体功能更新数据库中的现有记录。

Address address = new Address();
address.setId(1);
address.setName("出差");
address.setAddress("广州");
address.setPhone("188");
address.setPhone2("188");
address.setRe("Tom");

TableModel tableModel = new TableModel();
tableModel.setTableName("shop_address");
tableModel.setAutoIns(true);
tableModel.setIdTypeClz(Integer.class);

UpdateResult result;
result = new Entity(conn).setTableModel(tableModel).input(address).update();

assertTrue(result.isOk());

与插入操作的主要区别是:

这段代码会根据 Address 对象的属性自动生成并执行 UPDATE SQL 语句,更新 ID = 1 的记录。

列名映射

如果数据库中的列名与 Java Bean 中的属性名不同怎么办?SqlMan 提供了一种将列名映射到属性名的方法,只需使用 Java 注解 @Column(name ="xxxx") 来指定:

@Data
public class Address {
    private Integer id;

    private String name;

    private String address;

    private String phone;

    @Transient // 非持久化
    private String phone2;

    @Column(name ="receiver") // 实际数据库列名是 "receiver"
    private String re;
}

非持久化字段

默认情况下,属性和字段都是持久化的。如果你不希望某个字段被更新,可以通过添加 @Transient 注解将该属性或字段标记为非持久化。