使用java连接MySql,将所有数据转换成Json

使用java连接MySql,将所有数据转换成Json(没有使用SpringFramework)

这是进公司最开始做的一个练手项目,比较简单。
使用到了两个jar:
gson-2.8.0.jar和mysql-connector-java-5.1.30-bin.jar

首先想到要连接数据库:

public class ConnectSQL {
    // URL指向要访问的数据库名
    public static final String url = "jdbc:mysql://192.168.1.1:3306/databasename?zeroDateTimeBehavior=convertToNull";
    // 驱动程序名
    public static final String name = "com.mysql.jdbc.Driver";
    // MySQL配置时的用户名
    public static final String user = "username";
    // MySQL配置时的密码
    public static final String password = "password";

    public Connection conn = null;
    public PreparedStatement pst = null;

    public ConnectSQL(String sql) {
        try {
            Class.forName(name);// 指定连接类型
            conn = DriverManager.getConnection(url, user, password);// 获取连接
            pst = conn.prepareStatement(sql);// 准备执行语句
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            this.conn.close();
            this.pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

连接数据库时Url最后加上了zeroDateTimeBehavior=convertToNull是由于数据库测试时有个字段Date:0000-00-00 00:00:00
输出时java错误提示:
Value 0000-00-00 00:00:00 can not be represented as java.sql.Timestamp。
这是由于MySQL用这个日期代表无效的日期,查到有两种解决方法:
1. 使用zeroDateTimeBehavior=convertToNull,最后结果输出Date:null
2. 使用zeroDateTimeBehavior=round,最后输出Date:0001-01-01 00:00:00
解决方式是参照https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html给出的zeroDateTimeBehavior的property,我这里使用了直接转换成null的第一种

连接之后,因为需要获取database内所有table的数据,所以首先获取了所有table名
DatabaseMetaData meta = (DatabaseMetaData) con.getMetaData();
ResultSet rs = meta.getTables(null, null, null, new String[] { "TABLE" });
while (rs.next()) {
arrTablenames.add(rs.getString(3));
}

然后,对每个table执行sql语句:

static ArrayList<String> arrcolname = new ArrayList<String>();
static ArrayList<String> arrcolout = new ArrayList<String>();
public static ResultSet execSQL(String strtablename) {
    String strsql = null;
    ConnectSQL db1 = null;
    ResultSet ret = null;
    strsql = "select * from " + strtablename;// SQL语句
    db1 = new ConnectSQL(strsql);// 创建ConnectSQL对象
    try {
        ret = db1.pst.executeQuery();// 执行语句,得到结果集
        while (ret.next()) {
            ResultSetMetaData rsmd = ret.getMetaData();
            int icolnum = rsmd.getColumnCount();
            for (int i = 1; i <= icolnum; i++) {
                arrcolname.add(rsmd.getColumnName(i).toString());//table字段名
                arrcolout.add(ret.getString(i));//table内容
            }
        }
        ret.close();
        db1.close();// 关闭连接
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return ret;
}

每个table的字段名和内容都保存在ArrayList<String>当中了,可以自己进行编辑,比如加个key,变成Map之类的。

最后使用Gson来转换所得的Java类型(比如Map),变成Json格式

public static String ToJson(LinkedHashMap<String, Object> mTotalOut) {
    String strJsonOut = new String();
    // toJson
    GsonBuilder gsonbuilder = new GsonBuilder().setPrettyPrinting().serializeNulls();
    Gson gson = gsonbuilder.create();
    strJsonOut = gson.toJson(mTotalOut);
    return strJsonOut;
}

开始时直接使用了gson.toJson(mTotalOut),没有使用GsonBuilder,然后发现输出有错。
由于表中有字段为null,gson默认忽略null 值
如tblUser中有UseName,Age这两个字段,User1的Age为null,最后输出成Json时就成了{},而不是预想的{User1:null},
所以之后加上了

GsonBuilder gsonbuilder = new GsonBuilder().serializeNulls(); 
Gson gson = gsonbuilder.create();

来解决Gson null值不输出的问题。
解决方式参照https://github.com/google/gson/blob/master/UserGuide.md#TOC-Null-Object-Support

setPrettyPrinting()

不使用的话,最后结果是打印在一行String上输出的,setPrettyPrinting()使最后打印在控制台上或者输出的Json能格式化,输出的美观一些,并不影响Json的结果。

Java中,将MySQL表结构转换成JSON格式的数据,通常需要几个步骤:连接数据库、获取表结构信息、生成JSON数据。这通常可以通过以下两种方式实现: 1. 手动编码:使用JDBC(Java数据连接)API连接MySQL数据库,然后使用`DatabaseMetaData`获取表结构信息,如表名、列名、列类型等。之后,你可以根据获取到的表结构信息构建相应的JSON对象。例如,使用`JSONObject`和`JSONArray`类(这些类来自于如org.json或者com.alibaba.fastjson等库)来构建JSON结构,并填充表中的数据。 2. 使用第三方库:有现成的第三方库可以简化这个过程,如MyBatis、Hibernate等ORM框架,或者是专门用于生成JSON的库。这些库往往提供了一些工具或API,可以更方便地将数据库表结构和数据换为JSON格式。 一个示例代码如下(使用JDBC和org.json库): ```java import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import org.json.JSONArray; import org.json.JSONObject; public class TableToJSON { public static void main(String[] args) { String jdbcURL = "jdbc:mysql://localhost:3306/your_database"; String username = "your_username"; String password = "your_password"; Connection connection = null; try { connection = DriverManager.getConnection(jdbcURL, username, password); DatabaseMetaData metaData = connection.getMetaData(); JSONArray jsonArray = new JSONArray(); ResultSet tables = metaData.getTables(null, null, "%", null); while (tables.next()) { String tableName = tables.getString("TABLE_NAME"); JSONObject jsonObject = new JSONObject(); jsonObject.put("table_name", tableName); // 添加表的其他信息,如列名、列类型等 // ... jsonArray.put(jsonObject); } System.out.println(jsonArray.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (Exception e) { e.printStackTrace(); } } } } ``` 在实际应用中,你可能还需要添加异常处理,确保数据连接正确关闭,并且处理可能发生的SQL异常。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值