使用JDBC处理Postgresql数据库

不得不吐槽的是Java的配置真心的繁琐,如果没有有IDE的话,手动处理这些内容真心会累死人。
今天简单的来说明下,如何使用JDBC来连接数据库,只能说是1个抛砖引玉的过程。
这里,我们选择的Java版本为8,使用的数据库是Postgresql。首先我们使用maven下载对应的依赖:

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->  
<dependency>  
    <groupId>org.postgresql</groupId>  
    <artifactId>postgresql</artifactId>  
    <version>42.2.5</version>  
</dependency>  
<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>fastjson</artifactId>  
    <version>1.2.49</version>  
</dependency>  
...

接着我们编写代码,引入如下的几个包:

import java.util.*;  
import java.io.*;  
import java.sql.*;  
import com.alibaba.fastjson.*;

然后定义1个公共类:

public class hello {  
    public static void main(String[] args) {  
        Properties properties = new Properties();  
        try {  
            Class.forName("org.postgresql.Driver");  
            InputStream stream = new FileInputStream("db.properties");  
            properties.load(stream);  
            String url = properties.getProperty("url");  
            String user = properties.getProperty("user");  
            String pwd = properties.getProperty("pwd");  
            stream.close();  
            Connection conn = DriverManager.getConnection(url, user, pwd);  
            Statement smt = conn.createStatement();  
            smt.setFetchSize(50);  
            smt.setMaxRows(10);  
            ResultSet rs = smt.executeQuery("select * from fund");  
            ResultSetMetaData metadata = rs.getMetaData();  
            JSONArray arr = new JSONArray();  
            while(rs.next()){  
                HashMap<String, Object> map = new HashMap<>();  
                int count = metadata.getColumnCount();  
                for(int i=0;i<count;i++){  
                    String label = metadata.getColumnLabel(i+1);  
                    Object val = rs.getObject(label);  
                    map.put(label, val);  
                }  
                arr.add(map);  
            }  
            rs.close();  
            String response = JSON.toJSONString(arr);  
            System.out.println(response);  
        } catch (Exception e){  
            e.printStackTrace();  
        }  

    }  
}

在这个类,我们可以将程序划分为如下3个部分:

  • 读取配置文件
  • 进行数据查询
  • 进行数据序列化

对于配置文件的读取,我们选择使用FileInputStream来读取1个文件,这个文件中的内容类似如下:

  
url=jdbc:postgresql://localhost:5432/dog  
user=dog  
pwd=123456  

这里我们通过Class.forName导入对应包中的类,然后通过Properties实例的load方法将之前文件输入流传递来进来,从而得到1个键值对的对象。之后我们就可以通过Properties实例的getProperty进行键值的获取。
对于数据的查询,我们使用了setMaxRows方法设置其最大查询的行数,类似于如下的操作:

  
select * from fund limit 10  

而对于数据的序列化,我们通过ResultSet实例的getMetaData方法得到1个ResultSetMetaData实例,之后我们调用其getColumnCount方法得到列的数量。之后,我们进行迭代,通过其getColumnLabel得到列的标签名称,而对应的值通过ResultSet实例的getObject方法来得到。
在这里,我们使用阿里巴巴公司fastjson来进行JSON的序列化处理,我们将对应的值添加到JSONArray中,最后调用JSON.toJSONString将对应的对象序列化为JSON字符串。其结果为:

  
[{"fund_type":8,"fund_id":"000001","fund_name":"华夏成长","fund_code":"HXCZ"},{"fund_type":8,"fund_id":"000002","fund_name":"华夏成长(后端)","fund_code":"HXCZ"},{"fund_type":6,"fund_id":"000003","fund_name":"中海可转债A","fund_code":"ZHKZZA"},{"fund_type":6,"fund_id":"000004","fund_name":"中海可转债C","fund_code":"ZHKZZC"},{"fund_type":7,"fund_id":"000005","fund_name":"嘉实增强信用定期债券","fund_code":"JSZQXYDQZQ"},{"fund_type":6,"fund_id":"000007","fund_name":"鹏华国企债债券","fund_code":"PHGQZZQ"},{"fund_type":3,"fund_id":"000008","fund_name":"嘉实中证500ETF联接","fund_code":"JSZZ500ETFLJ"},{"fund_type":10,"fund_id":"000009","fund_name":"易方达天天理财货币A","fund_code":"YFDTTLCHBA"},{"fund_type":10,"fund_id":"000010","fund_name":"易方达天天理财货币B","fund_code":"YFDTTLCHBB"},{"fund_type":8,"fund_id":"000011","fund_name":"华夏大盘精选","fund_code":"HXDPJX"}]  

当然,在这个过程中我们甚至还可以进行一些键值的获取及剔除,再返回给前端。

若文章对您有帮助,请打赏1块钱。您的支持,可以让我分享更多精彩的文章。转载请注明来源


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。