简明 JDBC 数据访问操作库:JdbcHelper(二)

上篇文章《简明 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 paramsMap中 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 的。

你可能感兴趣的:(数据库,开发语言)