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