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


    上篇文章《简明 JDBC 数据访问操作库:JdbcHelper(一)》中,主要简介了 JdbcHelper 及 JdbcReader,其中关于 JdbcReader 都是偏源码、偏底层原理的介绍。这次我们打算介绍 Reader 的应用,怎么用于日常的 SQL 数据查询工作中,——所形成封装的就是 CRUD 类。所谓 CRUD,顾名思义就是增删改查的工作。本文则围绕查询的任务展开。

    查询单笔记录

    查询一笔记录,分为最简单的单行单列单行多列两种情形。什么是查询单行单列?举个例子:

    SELECT id FROM news WHERE id = 1;
    SELECT COUNT(1) FROM user;
    
    • 1
    • 2

    这些都是返回一个独立的字段。相对地,当我们传入* 的时候则表示查询所有字段返回。

    SELECT * FROM aritcle
    
    • 1

    明显这返回不是一个字段,而是多个。我们不能用一个 String/Long 等的单个类型去表示,而是采用 Map 或者 Java Bean 去承载查询所返回的数据。

    查询单行单列记录

    有且只有一行记录,并只返回第一列的字段。可指定字段的数据类型。入参为返回的类型、执行的 SQL 和 SQL 参数(选填项,能对应 SQL 里面的?的插值符)。

    public static <T> T queryOne(Class<T> clz, String sql, Object... params)
    
    • 1

    clz 支持的类型有 String、Integer、Long、Float、Double 等。

    例子如下:

    Long id = CRUD.queryOne(Long.class, "SELECT id FROM news WHERE id = ?"1)
    • 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    区别在于第一个参数,后者是sqlId,它不是普通的 SQL 语句。我们支持类似 MyBatis 在 XML 书写 SQL 的方法,这样对于 SQL 有更好的管理作用。这个就是 XML 的索引,参见一个 XML 的例子。

    
    <sqls>
    	<sql id="infoNews">
    		SELECT * FROM aritcle WHERE name LIKE '%${name}%'
    	sql>
    sqls>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中${name}对应参数Map paramsMap中 key 为 name 的值;后面的入参params,没有 key/value 结构,只是一维数组,按照顺序对应 SQL 中的?替换,这适合一些比较简单的入参情形。

    例子:

    Map<String, Object> article = CRUD.info("SELECT * FROM aritcle WHERE id = ?", 1);
    
    • 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    例子:

    Article article = CRUD.info(Article.class, "SELECT * FROM aritcle WHERE id = ?", 1);
    
    Article article = CRUD.info("infoArticle", Article.class, null, 1);
    
    • 1
    • 2
    • 3

    查询多行记录

    返回多行的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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    调用示例:

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    分页查询

    分页是一种特殊类型的查询。我们通过 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    返回的分页结果是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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    当前分页不支持返回 Map 的。

  • 相关阅读:
    使用SimPowerSystems并网光伏阵列研究(Simulink实现)
    UE4 相机围绕某点旋转
    探索未来的视觉革命:卷积神经网络的崭新时代(一)
    小猪APP分发:一站式托管服务,轻松玩转应用市场
    把 vs Code 添加到右键菜单 ( 其他程序一样 )
    Xilinx microblaze axi can 使用说明
    【uniapp】引入uni-ui组件库
    第二十二章 源代码文件 REST API 参考(四)
    【强化学习】结合Python实战深入分析原理
    Connor学Android - Drawable
  • 原文地址:https://blog.csdn.net/zhangxin09/article/details/132841014