简单解决springboot 中自封框架未集成双数据源方案之一
Posted 诗萧尘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单解决springboot 中自封框架未集成双数据源方案之一相关的知识,希望对你有一定的参考价值。
问题:
业务使用一个库,报表查询和导出使用是另一个库,需要双数据源。
当时想的是报表,就使用报表工具,但是客户不同意。没办法研究产品的双数据源的问题,一直没有进展。
最后解决方案,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<Connection> list = new ArrayList<Connection>();
/**
* 从连接池中获得一个连接
*/
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<Map<String, Object>>,map的key是查询的列名(小写)或别名,map的value是每列对应的值
*/
public static List<Map<String, Object>> select(String sql, Object[] param)
throws Exception
Connection con = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
ps = con.prepareStatement(sql);
// 替换参数?
if (param != null)
for (int i = 1; i <= param.length; i++)
ps.setObject(i, param[i - 1]);
rs = ps.executeQuery();// 执行查询
ResultSetMetaData rm = rs.getMetaData();// 获得结果集源数据
// 获得结果集列的总数
int count = rm.getColumnCount();
while (rs.next())
Map<String, Object> map = new HashMap<String, Object>();// map用来存储一个列的信息
for (int i = 1; i <= count; i++) // for循环用来遍历每一行
// key是列名,并且是小写的;value是根据列名获得某条记录对应的值
map.put(rm.getColumnName(i).toLowerCase(),
rs.getObject(rm.getColumnName(i)));// 不知道什么类型所以用object
list.add(map);
close(rs, ps, con);
return list;
导出实现
/**
* 导出
*
* @param sql
* @param param
* @return
*/
public String export(String sql, Object[] param,Map<String, String> 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<Object> alt = new ArrayList<Object>();
String seqString = getSQE();
alt.add(seqString); // 序列
alt.add("张三"); // 用户名
alt.add("99999"); // 机构号
alt.add(fileName + ".xls"); // 文件名称
Object param2[] = alt.toArray();
insert(param2);// 插入生成文件的目录
WriteExcel(newFile, rs, new DataSouceconf().getNum(),
rowCount,map);
ArrayList<Object> alt2 = new ArrayList<Object>();
alt2.add(seqString);
Object param3[] = alt2.toArray();
update(param3);// 更新路径下载
System.out.println("导出路径为 ——————>" + filepath + ".xls");
filepath = fileName + ".xls";
catch (Exception e)
e.printStackTrace();
catch (SQLException e)
e.printStackTrace();
finally
JdbcUtil.close(rs, stmt, conn);
JdbcUtil.close(rsnum, null, null);
return "success";
导出中写文件实现
/**
* 主要是用来创建excel工作薄 fileName 文件名称 rs 查询出数据的结果集 num 一个sheet 最大条数。 rowCount
* 记录总条数
*/
public static void WriteExcel(File fileName, ResultSet rs, int num,
int rowCount,Map<String, String> 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<Map<String, Object>> 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<Object> alt = new ArrayList<Object>();
alt.add(100);
Object param2[] = alt.toArray();
Map<String, String> 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;
基本实现就这些。这里的主要SQL 的条件拼写,需要自己来拼写。比较麻烦。导出和查询,未集成到一起去。
thanks~~
以上是关于简单解决springboot 中自封框架未集成双数据源方案之一的主要内容,如果未能解决你的问题,请参考以下文章