简单解决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 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>,map的key是查询的列名(小写)或别名,map的value是每列对应的值
	 */
	public static List> select(String sql, Object[] param)
			throws Exception {
		Connection con = getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		List> list = new ArrayList>();
		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 map = new HashMap();// 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 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 alt = new ArrayList();
					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 alt2 = new ArrayList();
					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 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;
		}

}

基本实现就这些。这里的主要SQL 的条件拼写,需要自己来拼写。比较麻烦。导出和查询,未集成到一起去。
简单解决springboot 中自封框架未集成双数据源方案之一_第1张图片
thanks~~

你可能感兴趣的:(spring,boot)