问题:
业务使用一个库,报表查询和导出使用是另一个库,需要双数据源。
当时想的是报表,就使用报表工具,但是客户不同意。没办法研究产品的双数据源的问题,一直没有进展。
最后解决方案,JDBC单独写一个访问的类。报表类访问此类进行调用实现。
不多说了上代码
类的导入和类名
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class BaseDao {
连接池实现
// list连接池
static ArrayList list = new ArrayList();
/**
* 从连接池中获得一个连接
*/
public synchronized static Connection getConnection() throws Exception {
Connection con = null;
// 如果连接池有连接
if (list.size() > 0) {
return list.remove(0);// 删除0位置的元素并得到这个元素
}
// 连接池中没有连接
else {
Properties p = new Properties();
// 加载配置文件
// p.load(BaseDao.class.getClassLoader().getResourceAsStream("../jdbc.properties"));
// String driverClass = p.getProperty("jdbc.driverClass");
// String jdbcUrl = p.getProperty("jdbc.jdbcUrl");
// String bname = p.getProperty("jdbc.username");
// String bpwd = p.getProperty("jdbc.password");
// org.apache.hive.jdbc.HiveDriver.class
// String driverClass = "io.transwarp.jdbc.InceptorDriver";
// //jdbc:inceptor2://{host}[:{port}][(,{host2}[:{port2}])+]/[{database}]
// String jdbcUrl = "jdbc:inceptor2://20.1.4.8:10000/mdm";
// String bname = "hive";
// String bpwd = "123456";
DataSouceconf dsconf = new DataSouceconf();
String driverClass = dsconf.getDriverClassName();
String jdbcUrl = dsconf.getDriverUrl();
String bname = dsconf.getDriverUsername();
String bpwd = dsconf.getDriverPassword();
// 加载驱动
Class.forName(driverClass);
// 和指定的数据库建立连接
for (int i = 0; i < 1; i++) {
con = DriverManager.getConnection(jdbcUrl, bname, bpwd);
list.add(con);
}
}
return list.remove(0);
}
/**
* 关闭结果集
*
* @param rs代表结果集
*/
public static void close(ResultSet rs) throws Exception {
if (rs != null)
rs.close();
}
/**
* 关闭预处理对象
*
* @param pst代表预处理
*/
public static void close(PreparedStatement pst) throws Exception {
if (pst != null)
pst.close();
}
/**
* 关闭连接对象
*
* @param con代表连接对象
*/
public synchronized static void close(Connection con) {
if (con != null)
list.add(con);
}
/**
* 关闭结果集,预处理,连接等对象
*
* @param rs
* 结果集
* @param ps
* 预处理
* @param con
* 连接
*/
public static void close(ResultSet rs, PreparedStatement ps, Connection con)
throws Exception {
close(rs);
close(ps);
close(con);
}
增删改查实现
/**
* 根据SQL语句,进行insert,update,delete等操作
*
* @param sql
* @param param代表SQL语句里面的通配符
* (?)对应的值,一定注意顺序
* @return
*/
public boolean updateByParams(String sql, Object param[]) throws Exception {
boolean flag = false;
Connection con = getConnection();
PreparedStatement ps = null;
ps = con.prepareStatement(sql);
// 替换参数?
if (param != null) {
for (int i = 1; i <= param.length; i++) {
ps.setObject(i, param[i - 1]);
}
}
int n = ps.executeUpdate();
if (n > 0)
flag = true;
close(null, ps, con);
return flag;
}
/**
* 查询操作
*
* @param sql
* @param param
* @return List
导出实现
/**
* 导出
*
* @param sql
* @param param
* @return
*/
public String export(String sql, Object[] param,Map map) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
ResultSet rsnum = null;
// sql = " select * from ADMIN_SM_LOOKUP_TYPE ";
String sqlNum = "select count(1) num from ( " + sql + ") "; // 用于计算总数。
String filepath = "";
// 通过结果集得到字段字符串
try {
// conn =
// getConnection("jdbc:oracle:thin:@172.16.90.15:1521:sybase",
// "uimp_dev", "uimp_dev");
try {
conn = getConnection();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
stmt = conn.prepareStatement(sql);
// 替换参数?
if (param != null) {
for (int i = 1; i <= param.length; i++) {
stmt.setObject(i, param[i - 1]);
}
}
rs = stmt.executeQuery();
stmt = conn.prepareStatement(sqlNum);
// 替换参数?
if (param != null) {
for (int i = 1; i <= param.length; i++) {
stmt.setObject(i, param[i - 1]);
}
}
rsnum = stmt.executeQuery();
if (rs != null) {
File newFile = null;
// String fileName=matchSql(sql2); 文件名考虑地址是自选还是指定。
int rowCount = 0;
if (rsnum.next()) {
rowCount = rsnum.getInt("num");
}
String fileName = null;
fileName = CTools.getFileName();
// 变更为项目中读取配置文件的路径
filepath = new DataSouceconf().getExeclPath() + fileName;
newFile = new File(filepath + ".xls");
try {
ArrayList
导出中写文件实现
/**
* 主要是用来创建excel工作薄 fileName 文件名称 rs 查询出数据的结果集 num 一个sheet 最大条数。 rowCount
* 记录总条数
*/
public static void WriteExcel(File fileName, ResultSet rs, int num,
int rowCount,Map map) throws Exception {
// 创建一个新的工作薄,fileName 包含了文件名以及路径。
WritableWorkbook wwb = null;
WritableSheet ws = null;
try {
int i = 0;
int j = 0;
wwb = Workbook.createWorkbook(fileName);
if (rowCount / num != 0) {
int m = rowCount / num;
if (rowCount % num != 0)
m = m + 1;
for (int o = 0; o < m; o++) {
ws = wwb.createSheet("Sheet" + String.valueOf(o), o);// 给工作薄添加一个工作表,命名为
// sheettest.
// 下面for循环里面的rs.getMetaData().GetColumnCount() 获取数据库中某个表的列总数
for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
// rs.getMetaData().getColumnName()获取表的列名。并添加到
// excel表Label里,Label(i,j,s)表示i列j行添加s,s必须是String
ws.addCell(new Label(k, 0, map.get(rs.getMetaData()
.getColumnName(k + 1))));
}
i = 0;
while (rs.next()) {
// 算法,依次添加数据库中所有符合的数据到excel中
for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
ws.addCell(new Label(k, j + i + 1, rs
.getString(k + 1)));
}
i++;
if (i == num)
break;
}
}
} else {
ws = wwb.createSheet("Sheet0", 0);// 给工作薄添加一个工作表,命名为 sheettest.
// 下面for循环里面的rs.getMetaData().GetColumnCount() 获取数据库中某个表的列总数
for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
// rs.getMetaData().getColumnName()获取表的列名。并添加到
// excel表Label里,Label(i,j,s)表示i列j行添加s,s必须是String
ws.addCell(new Label(k, 0, map.get(rs.getMetaData()
.getColumnName(k + 1))));
}
while (rs.next()) {
// 算法,依次添加数据库中所有符合的数据到excel中
for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
ws.addCell(new Label(k, j + i + 1, rs.getString(k + 1)));
}
i++;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
wwb.write();// 写入工作薄
wwb.close();// 关闭工作薄
rs.close();// 关闭结果集
}
导出中其他实现
/**
* 查询序列
*/
public static String getSQE() {
String sqlString = " SELECT EMP_SEQUENCE.NEXTVAL NUMVALUE FROM DUAL ";
List> list = null;
try {
list = select(sqlString, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list.get(0).get("numvalue").toString();
}
/**
* 插入下载表
*/
public void insert(Object[] params) {
String sqlString = " insert into ADMIN_SM_SYS_DOWNLOAD values (?,?,?,?,sysdate,sysdate,'0') ";
try {
updateByParams(sqlString, params);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 更新下载表
*/
public void update(Object[] params) {
String sqlString = " UPDATE ADMIN_SM_SYS_DOWNLOAD SET FINISH_TIME=SYSDATE ,DOWN_STATUS='1' WHERE ID=?";
try {
updateByParams(sqlString, params);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2 方法的调用
使用map 对象转汉字
public class TestMain {
public static void main(String[] args) {
testExport();
}
public static void testExport(){
String sql=" select * from ADMIN_SM_LOOKUP_TYPE where instu_id = ? ";
ArrayList alt = new ArrayList();
alt.add(100);
Object param2[] = alt.toArray();
Map map=new HashedMap();
map.put("LOOKUP_TYPE_ID", "记录编号");
map.put("LOOKUP_TYPE_NAME", "目录名称");
map.put("UP_LOOKUP_TYPE_ID", "上级目录编号");
map.put("INSTU_ID", "金融机构编号");
map.put("LAST_CHG_USR", "最新变更用户");
map.put("LAST_CHG_DT", "最新变更时间");
BaseDao bDao=new BaseDao();
bDao.export(sql, param2,map);
}
}
3 配置类
本来想使用 @Configuration 配置类的,但是还没有时间研究,
等研究完了。在补充上。
public class DataSouceconf {
// @Value("com.mysql.jdbc.Driver")
// private String driverClassName="io.transwarp.jdbc.InceptorDriver";
//@Value("root")
private String driverClassName="oracle.jdbc.driver.OracleDriver";
private String driverUrl=""; //数据库访问地址
private String driverUsername=""; //用户名
private String driverPassword=""; //密码
private String execlPath="C://"; // 导出路径
private int num =5; // 每页限制条数
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getDriverUrl() {
return driverUrl;
}
public void setDriverUrl(String driverUrl) {
this.driverUrl = driverUrl;
}
public String getDriverUsername() {
return driverUsername;
}
public void setDriverUsername(String driverUsername) {
this.driverUsername = driverUsername;
}
public String getDriverPassword() {
return driverPassword;
}
public void setDriverPassword(String driverPassword) {
this.driverPassword = driverPassword;
}
public String getExeclPath() {
return execlPath;
}
public void setExeclPath(String execlPath) {
this.execlPath = execlPath;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}