上篇文章《简明 JDBC 数据访问操作库:JdbcHelper(一)》中,主要简介了 JdbcHelper 及 JdbcReader,其中关于 JdbcReader 都是偏源码、偏底层原理的介绍。这次我们打算介绍 Reader 的应用,怎么用于日常的 SQL 数据查询工作中,——所形成封装的就是 CRUD 类。所谓 CRUD,顾名思义就是增删改查的工作。
查询一笔记录,分为最简单的单行单列和但单行多列两种情形。什么是查询单行单列?举个例子:
SELECT id FROM news WHERE id = 1;
SELECT COUNT(1) FROM user;
这些都是返回一个字段的。相对地,我们传入*
则表示查询所有字段返回。
SELECT * FROM aritcle
明显这返回不是一个字段,而是多个。我们不能用一个 String/Long 等的单个类型去表示,而是采用 Map 或者 Java Bean 去承载查询返回的数据。
有且只有一行记录,并只返回第一列的字段。可指定字段的数据类型。入参为返回的类型、执行的 SQL 和 SQL 参数(选填项,能对应 SQL 里面的?
的插值符)。
public static <T> T queryOne(Class<T> clz, String sql, Object... params)
clz 支持的类型有 String、Integer、Long、Float、Double 等。
例子如下:
Long id = CRUD.queryOne(Long.class, "SELECT id FROM news WHERE id = ?", 1);
所谓普通的单笔记录,就是查询上述“单行多列”的记录。JdbcHelper 支持 Map 和 Java Bean 两种数据格式,故无论查询还是创建、修改数据,均支持返回和入参这两种格式。首先看看返回查询普通的单笔 Map 记录,有下面两种方法:
/**
* 查询单笔记录,以 Map 格式返回
*
* @param sql SQL 语句
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @return 查询结果,如果为 null 表示没数据
*/
public static Map<String, Object> info(String sql, Object... params);
/**
* 查询单笔记录,以 Map 格式返回
*
* @param sqlId SQL Id,于 XML 里的索引
* @param paramsMap Map 格式的参数(若没有可传 null)
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @return 查询结果,如果为 null 表示没数据
*/
public static Map<String, Object> infoMap(String sqlId, Map<String, Object> paramsMap, Object... params);
区别在于第一个参数,后者是sqlId
,它不是普通的 SQL 语句。我们支持类似 MyBatis 在 XML 书写 SQL 的方法,这样对于 SQL 有更好的管理作用。这个就是 XML 的索引,参见一个 XML 的例子。
<sqls>
<sql id="infoNews">
SELECT * FROM aritcle WHERE name LIKE '%${name}%'
sql>
sqls>
其中${name}
对应参数Map
中 key 为 name 的值;后面的入参params
,没有 key/value 结构,只是一维数组,按照顺序对应 SQL 中的?
,适合一些比较简单的入参情形。
例子:
Map<String, Object> article = CRUD.info("SELECT * FROM aritcle WHERE id = ?", 1);
接着是返回 Java Bean 的,它要求传入多个Class
的参数指定 Bean 类型。其余大体一样(入参之类的)。
/**
* 查询单笔记录,以 Java Bean 格式返回
*
* @param beanClz 返回的 Bean 类型
* @param sql SQL 语句
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @param 返回的 Bean 类型
* @return 查询单笔记录,以 Java Bea 格式返回
*/
public static <T> T info(Class<T> beanClz, String sql, Object... params);
/**
* 查询单笔记录,以 Java Bean 格式返回
*
* @param sqlId SQL Id,于 XML 里的索引
* @param beanClz 返回的 Bean 类型
* @param paramsMap Map 格式的参数(若没有可传 null)
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @param 返回的 Bean 类型
* @return 查询单笔记录,以 Java Bea 格式返回
*/
public static <T> T info(String sqlId, Class<T> beanClz, Map<String, Object> paramsMap, Object... params);
例子:
Article article = CRUD.info(Article.class, "SELECT * FROM aritcle WHERE id = ?", 1);
Article article = CRUD.info("infoArticle", Article.class, null, 1);
返回多行的List
集合。与上述同理,均有 Map/Bean、SQL/XML 之版本。
/**
* 查询列表记录,以 List Map 格式返回
*
* @param sql SQL 语句
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @return 查询结果,如果没数据返回一个空 List
*/
public static List<Map<String, Object>> list(String sql, Object... params);
/**
* 查询列表记录,以 List Map 格式返回
*
* @param sqlId SQL Id,于 XML 里的索引
* @param paramsMap Map 格式的参数(若没有可传 null)
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @return 查询结果,如果没数据返回一个空 List
*/
public static List<Map<String, Object>> listMap(String sqlId, Map<String, Object> paramsMap, Object... params);
/**
* 查询列表记录,以 List Java Bean 格式返回
*
* @param beanClz 实体 Bean 类型
* @param sql SQL 语句
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @return 查询结果,如果没数据返回一个空 List
*/
public static <T> List<T> list(Class<T> beanClz, String sql, Object... params);
/**
* 查询列表记录,以 List Java Bean 格式返回
*
* @param sqlId SQL Id,于 XML 里的索引
* @param beanClz 实体 Bean 类型
* @param paramsMap Map 格式的参数(若没有可传 null)
* @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符)
* @param 实体 Bean 类型
* @return 查询结果,如果没数据返回一个空 List
*/
public static <T> List<T> list(String sqlId, Class<T> beanClz, Map<String, Object> paramsMap, Object... params);
调用示例:
List<Map<String, Object>> result = CRUD.list("SELECT * FROM users");
List<Map<String, Object>> result = CRUD.listMap("getUserById", null, 1);
List<User> result = CRUD.list(User.class, "SELECT * FROM users WHERE is_delete = ?", 0);
List<User> result = CRUD.list("getUserById", User.class, null, 1);
分页是一种特殊类型的查询。我们通过 JSQL Parser 语法解析 SQL 查询语句,先生成 COUNT 统计总数的 SQL,若>0
则返回第二次查询的分页结果。
/**
* 分页查询列表记录,以 List Java Bean 格式返回
*
* @param beanClz 实体 Bean 类型
* @param sql SQL 语句
* @param paramsMap Map 格式的参数(若没有可传 null)
* @param 实体 Bean 类型
* @return 查询结果,如果没数据返回一个空 List
*/
public static <T> PageResult<T> page(Class<T> beanClz, String sql, Map<String, Object> paramsMap);
/**
* 分页查询列表记录,以 List Java Bean 格式返回
*
* @param sqlId SQL Id,于 XML 里的索引
* @param beanClz 实体 Bean 类型
* @param paramsMap Map 格式的参数(若没有可传 null)
* @param 实体 Bean 类型
* @return 查询结果,如果没数据返回一个空 List
*/
public static <T> PageResult<T> page(String sqlId, Class<T> beanClz, Map<String, Object> paramsMap);
返回的分页结果是PageResult
,是比较通用的结构了。它继承于ArrayList
:
/**
* 分页信息 bean
*
* @param Bean 对象,也可以是 Map
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class PageResult<T> extends ArrayList<T> {
private static final long serialVersionUID = 543109149479031294L;
/**
* 总记录数
*/
private int totalCount;
/**
* 从第几笔记录开始
*/
private int start;
/**
* 每页大小
*/
private int pageSize;
/**
* 总页数
*/
private int totalPage;
/**
* 当前第几页
*/
private int currentPage;
/**
* 是否没有数据,就是查询了之后,一条记录符合都没有
*/
private boolean isZero;
}
当前分页不支持返回 Map 的。