Springboot系列(三十五):根据数据库连接信息指定分页查询表结构信息|超级详细,建议收藏

Posted bug菌¹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot系列(三十五):根据数据库连接信息指定分页查询表结构信息|超级详细,建议收藏相关的知识,希望对你有一定的参考价值。

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN、 掘金等社区优质创作者,全网合计7w粉+,对一切技术都感兴趣,重心偏Java方向,目前运营公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。
..
✍️温馨提醒:本文字数:5163字, 阅读完需:约 10 分钟

         嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章 点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

        通过,在使用springboot框架之后,就很少涉及到手动连接数据库的方式了,但bug菌有遇到这么一个需求场景,给到你的是无上限的数据库连接信息,要求你能按连接信息指定获取表数据,突然我就一愣,我问了问,能给我具体的那些数据库吗?由于是对接第三方,不确定,所以只能给到你生成好的连接信息,你只能依据它的连接信息自动连接并解析。

        很完美,这不就得回到以前玩springmvc的日子么,通过连接信息手动连接数据并获取表结构字段,且返回该表的数据。

        接下来,废话不多说,我就给大家演示一下,具体如何实现?

二、正文🔥

        接下来我还是以接口的请求方式,给大家简单演示一下,具体场景,你们自己依据情况而定,我就给大家展示下我手动获取本地库指定表的表结构字段吧。

1️⃣定义一个Controller接口

    /**
     * 根据数据库连接信息指定分页查询表获取表数据
     */
    @PostMapping("/find-db-info-by-page")
    @ApiOperation(value = "根据数据库连接信息指定分页查询表获取表数据",notes = "根据数据库连接信息指定分页查询表获取表数据")
    public ResultResponse<Map> findDbInfoByPage(@RequestBody FindDbByPageModel model)
        return new ResultResponse<>(dbService.findDbInfoByPage(model));
    

如下是上接口所涉及的入参体:

package com.example.demo.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * @author luoYong
 * @version 1.0
 * @date 2022/8/30 16:02
 */
@Data
@ApiModel(value = "查询用户参数体", description = "查询用户参数体")
public class FindDbByPageModel 

    @ApiModelProperty(value = "数据库url")
    private String dbUrl;

    @ApiModelProperty(value = "数据库连接用户名")
    private String userName;

    @ApiModelProperty(value = "数据库连接密码")
    private String passWord;

    @ApiModelProperty(value = "数据库驱动")
    private String driverClass;

    @ApiModelProperty(value = "指定查询表名")
    private String tableName;

    @ApiModelProperty(value = "页码")
    private int page;

    @ApiModelProperty(value = "容量")
    private int limit;

 2️⃣定义一个获取指定表数据的接口

    /**
     * 根据数据库连接信息指定分页查询表获取表数据
     */
    Map findDbInfoByPage(FindDbByPageModel model);

3️⃣实现获取指定表数据并分页

    /**
     * 根据数据库连接信息指定分页查询表获取表数据
     */
    @Override
    public Map findDbInfoByPage(FindDbByPageModel model) 
        //手动计算分页参数
        int limit = model.getLimit();
        int pageStart = (model.getPage() - 1) * limit;

        //与数据库取的连接
        Connection conn = this.getConn(model.getDbUrl(), model.getUserName(), model.getPassWord(), model.getDriverClass());

        //拼接分页sql(以mysql为例)
        String sql = "select * from " + model.getTableName() + " limit " + pageStart + "," + limit;
        //申明PreparedStatement
        PreparedStatement pst = null;
        int total = 0;
        try 
            //执行SQL语句
            pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery(sql);
            ResultSetMetaData metaData = rs.getMetaData();
            //定义一个存放所有列名的集合
            List<String> columnArr = new ArrayList<>();
            //
            total = metaData.getColumnCount();

            //获取表字段名
            for (int i = 1; i <= total; i++) 
                String columnName = metaData.getColumnName(i);
                columnArr.add(columnName);
            
            List<Map> dbData = new ArrayList<>();
            while (rs.next()) 
                //存放单条数据
                Map<String, String> linkedHashMap = new LinkedHashMap<>();
                columnArr.forEach(p -> 
                    //根据列名获取值
                    try 
                        String value = rs.getString(p);
                        linkedHashMap.put(p, value);
                     catch (SQLException e) 
                        e.printStackTrace();
                    
                );
                dbData.add(linkedHashMap);
            
            Map res = new LinkedHashMap<>();

            res.put("records", dbData);
            res.put("total", total);
            res.put("current", model.getPage());
            res.put("size", model.getLimit());
            //手动分页
            res.put("pages", total % model.getLimit() == 0 ? total / model.getLimit() : total / model.getLimit() + 1);

            //返回
            return res;
         catch (SQLException e) 
            e.printStackTrace();
        
        return new HashMap();
    

如下是手动连接库获取Connection对象的封装方法。

    /**
     * 手动连接数据库
     *
     * @param url
     * @param userName
     * @param passWord
     * @param driverClass
     */
    public Connection getConn(String url, String userName, String passWord, String driverClass) 

        //声明数据库连接对象
        Connection conn = null;
        try 
            //加载驱动
            Class.forName(driverClass);
            //初始化数据库连接,获取连接对象
            conn = DriverManager.getConnection(url, userName, passWord);
         catch (Exception e) 
            e.printStackTrace();
            System.out.println("获得数据库连接出错");
        
        return conn;
    

如果是oracle数据库,那分页sql语法就有点区别了。这个你们要注意! 

 4️⃣接口测试

         接下来既然我们已经实现了接口,那我们就来进行测试,还是老样子,直接通过在线接口文档swagger进行测试,集成swagger文档我前期文章已经讲过了,这个你们自己去看。

        参数体给与正确的,我就以本地库为例。

具体请看如下截图,很显然,是正常获取到了该【grade】表的表结构信息及将数据进行分页。

如下是具体获取到的数据,将获取到的表字段名作为key,value为具体的数据库存放数据。而且手动对其数据进行了分页处理。

 附上请求样例:


	"dbUrl": "jdbc:mysql://127.0.0.1:3306/springboot_db?serverTimezone=GMT%2B8",
	"userName": "root",
	"passWord": "123456",
	"driverClass": "com.mysql.cj.jdbc.Driver",
	"tableName": "grade"

  ... ...

       ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~

三、往期推荐🔥

四、文末🔥

       如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

        最后送大家两句我很喜欢的话,与诸君共勉!


☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start。

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。


​​​

💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果对文章有任何疑问,还请文末留言或者加群吧;

💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。

以上是关于Springboot系列(三十五):根据数据库连接信息指定分页查询表结构信息|超级详细,建议收藏的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot--实战开发--commons-lang3(三十五)

企业分布式微服务云SpringCloud SpringBoot mybatis (三十五)Restdoc生成api文档

Springboot系列(三十三):Springboot如何手动连接库并获取指定表结构|超级详细,建议收藏

重学c#系列——DiagnosticListener [三十五]

Springboot系列(三十三):Springboot如何手动连接库并获取指定表结构|超级详细,建议收藏

Springboot系列(三十三):Springboot如何手动连接库并获取指定表结构|超级详细,建议收藏