增删改查 CRUD

所谓 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