所谓 CRUD,顾名思义就是数据库增删改查的工作——所形成封装的就是 CRUD 类。这类多数的方法都是static
方法。
查询一笔记录,分为最简单的单行单列和单行多列两种情形。什么是查询单行单列?举两个例子:
// 最简单的单行单列 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 id 的例子。
SELECT * FROM aritcle WHERE name LIKE '%${name}%'
其中${name}
对应参数Map<String, Object> paramsMap
中 key 为 name 的值;后面的入参 params,那不是
key/value 的结构,只是一维数组,按照顺序对应
SQL 中的?
替换,这适合一些比较简单的入参情形。
Map<String, Object> article = CRUD.info("SELECT * FROM aritcle WHERE id = ?", 1);
接着是返回 Java Bean 的,它要求传入一个Class<T>
的参数指定 Bean 类型。其余大体一样(入参之类的)。
/** * 查询单笔记录,以 Java Bean 格式返回 * * @param beanClz 返回的 Bean 类型 * @param sql SQL 语句 * @param params SQL 参数列表(选填项,能对应 SQL 里面的`?`的插值符) * @param <T> 返回的 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 <T> 返回的 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 String/XML id 之版本。
/** * 查询列表记录,以 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 <T> 实体 Bean 类型 * @return 查询结果,如果没数据返回一个空 List */ public static <T> List<T> list(String sqlId, Class<T> beanClz, Map<String, Object> paramsMap, Object... params);
分页是一种特殊类型的查询。我们通过 JSQL Parser 语法解析 SQL 查询语句,先生成 COUNT 统计总数的 SQL,若 >0 则返回第二次查询的分页结果。
/** * 分页查询列表记录,以 List Java Bean 格式返回 * * @param beanClz 实体 Bean 类型 * @param sql SQL 语句 * @param paramsMap Map 格式的参数(若没有可传 null) * @param <T> 实体 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 <T> 实体 Bean 类型 * @return 查询结果,如果没数据返回一个空 List */ public static <T> PageResult<T> page(String sqlId, Class<T> beanClz, Map<String, Object> paramsMap);
返回的分页结果是 PageResult,是比较通用的结构了。它继承于 ArrayList:
/** * 分页信息 bean * * @param <T> 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 的,page(clz)
中的 clz 参数传 null 即可。
有关原理的分析,请移步至博客文章: ↗ https://zhangxin.blog.csdn.net/article/details/130445993。