基于MySQL的任意表转JSON字符串(含分页)

本文介绍如何使用JDBC从MySQL获取任意表的数据并转换为JSON字符串,包括分页处理。通过示例代码展示如何获取表的键名和键值,以及实现分页查询,最终将结果以JSON数组形式返回给客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题描述

输入

  • 一个任意数据表的表名
  • 第几页
  • 每页条数

输出

这个表的JSON数组字符串(每一行数据相当于一个JSON对象)

应用

对客户端(Web或移动端都行)向服务器端发送获取含分页的表格数据时,对服务器代码的重构,不需要根据表格的不同写不同的业务(尤其是表格数很多且键很多时不适合写枚举)。客户端收到后直接解析JSON再进一步处理即可。

2.需要导入的jar包

第一个是MYSQL的JDBC驱动,需要注意的是MYSQL的版本是5.7.x或8.0.x,这里以5.7.x为例。

其余是封装JSON对象所用到的jar包,六个互相依赖,缺一不可,并且注意版本号,很多比较新的版本并不是互相兼容的,这里给出的是经过测试过的可以用的一组版本号。

  • mysql-connector-java-5.1.45-bin.jar
  • json-lib-2.4-jdk15.jar
  • ezmorph-1.0.6.jar
  • commons-logging-1.2.jar
  • commons-lang-2.3.jar
  • commons-collections-3.2.jar
  • commons-beanutils-1.9.4.jar

下载地址:

  • mysql-connector-java:https://dev.mysql.com/downloads/connector/j/
    (Select Operating System:下拉框选择Platform Independent)

  • json-lib:https://sourceforge.net/projects/json-lib/files/json-lib/

  • ezmorph:https://sourceforge.net/projects/ezmorph/files/

  • commons开头的:https://archive.apache.org/dist/commons/

3.关键技术

JDBC如何获取表的键的个数?

    ResultSet rs = stmt.executeQuery("select *from "+tableName);//tableName为输入的表名
    ResultSetMetaData resultSetMetaData = rs.getMetaData();
    resultSetMetaData.getColumnCount()//键的个数

JDBC如何获取表的键名和键值?

    //i为第i个键,最小为1,最大为表的键的个数,获取方法见上文
    resultSetMetaData.getColumnName(i)//键名
    rs.getString(i)//键值

分页如何做

在rs.next()循环中,每次cnt++,根据第几页和每页条数算一下符合条件的cnt即可。

4.源代码

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.sql.*;

public class Main{
    //这里注意修改数据库的名,不是表名,也可以动态写入函数中去。
    private static String url = "jdbc:mysql://localhost:3306/db1?useSSL=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
    //注意版本MySQL号,5.7.x为这个驱动,8.0.x为“com.mysql.cj.jdbc”
    private static String jdbc = "com.mysql.jdbc.Driver";
    //注意修改用户名
    private static String user = "root";
    //注意修改密码
    private static String password = "123456";
    //与数据库的连接
    private static Connection conn;
    //与数据库的查询
    private static Statement stmt;
    //与数据库的查询结果
    private static ResultSet rs;
    /**
     * 将一个表转换为JSONArray字符串
     * @param tableName 表名
     * @param page 第几页(从1开始计算)
     * @param perPage 每页条数
     * @return 这个表的JSONArray字符串
     */
    public static String getDB(String tableName, int page, int perPage){
        if(page<1||perPage<1)
            return "[]";
        int cnt = 1;
        JSONObject jsonObject;
        JSONArray jsonArray = new JSONArray();
        try{
            Class.forName(jdbc);
            conn = DriverManager.getConnection(url,user,password);
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select *from "+tableName);
            ResultSetMetaData resultSetMetaData = rs.getMetaData();
            while(rs.next())
            {
                if(cnt>(page-1)*perPage&&cnt<=page*perPage){
                    jsonObject = new JSONObject();
                    for(int i=1;i<=resultSetMetaData.getColumnCount();i++){
                        jsonObject.put(resultSetMetaData.getColumnName(i),rs.getString(i));
                    }
                    jsonArray.add(jsonObject);
                }
                cnt++;
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException |ClassNotFoundException e){
            e.printStackTrace();
        }
        return jsonArray.toString();
    }
    public static void main(String[] args) {
        System.out.println(getDB("user",1,2));
    }
}

5.运行效果

测试数据表

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `pwd` varchar(255) NOT NULL,
  `st_id` varchar(255) NOT NULL,
  `sex` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '333', '20190001', 'girl');
INSERT INTO `user` VALUES ('8', 'lisi', '444', '20190002', 'girl');

控制台输出

[{“id”:“1”,“username”:“zhangsan”,“pwd”:“333”,“st_id”:“20190001”,“sex”:“girl”},{“id”:“8”,“username”:“lisi”,“pwd”:“444”,“st_id”:“20190002”,“sex”:“girl”}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值