不得不吐槽的是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"}]
当然,在这个过程中我们甚至还可以进行一些键值的获取及剔除,再返回给前端。