基于spring 的DriverManagerDataSource的jdbc操作

1、封装jdbc的连接和查询方法

package com.kerun.db;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
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.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.jdbc.datasource.DriverManagerDataSource;

// ~ File Information
/**
 * @author zxy
 * @date 2019年4月11日 上午11:24:03 
 * 类说明:基于spring 的DriverManagerDataSource的jdbc操作
 */
// ====================================================================================================================

public class KJdbc {

	// ~ Static Fields
	public static String regex = ":[\\S]+";
	// ==================================================================================================================

	// ~ Fields
	// ==================================================================================================================

	// ~ Constructors
	// ==================================================================================================================

	// ~ Methods
	/**
	 * 获取数据库连接
	 * @param targetName
	 * @return
	 * @throws SQLException
	 * @throws IOException
	 */
	public static Connection getConnection(String targetName) throws SQLException, IOException {
		InputStream in = KJdbc.class.getResourceAsStream("/large-screen-display.properties");
		Properties props = new Properties();
		InputStreamReader inputStreamReader = new InputStreamReader(in, "UTF-8");
		props.load(inputStreamReader);

		DriverManagerDataSource ds = new DriverManagerDataSource();
		ds.setDriverClassName(props.getProperty(targetName + "_className"));
		ds.setUrl(props.getProperty(targetName + "_url"));
		ds.setUsername(props.getProperty(targetName + "_name"));
		ds.setPassword(props.getProperty(targetName + "_pw"));
		return ds.getConnection();
	}

	/**
	 * 执行查询方法
	 * 
	 * @param sql
	 * @param params
	 * @param con
	 * @return
	 * @throws Exception
	 */
	public static List<Map<String, Object>> execuSql(String sql, Map<String, Object> params, Connection con) {
		PreparedStatement prepareStatement = null;
		ResultSet executeQuery = null;
		List<Map<String, Object>> formatQueryData = null;
		try {
			prepareStatement = con.prepareStatement(formatSql(sql));//预编译sql语句
			initPreparedStatementParams(prepareStatement, params, sql);// 设置参数
			executeQuery = prepareStatement.executeQuery();//执行查询操作
			formatQueryData = formatQueryData(executeQuery);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				executeQuery.close();
				prepareStatement.close();
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return formatQueryData;
	}

	/**
	 * 格式化查询的结果数据格式
	 * 
	 * @param rs
	 * @return
	 * @throws SQLException
	 */
	private static List<Map<String, Object>> formatQueryData(ResultSet rs) throws SQLException {
		List<Map<String, Object>> list = new ArrayList<>();
		ResultSetMetaData metaData = rs.getMetaData();
		Map<String, Integer> columnName = new HashMap<>();// 字段的名字和列号
		for (int i = 1, count = metaData.getColumnCount(); i <= count; i++) {
			columnName.put(metaData.getColumnName(i), i);
		}
		Set<Entry<String, Integer>> entrySet = columnName.entrySet();
		// 遍历并转换数据
		while (rs.next()) {
			Map<String, Object> map = new HashMap<>();
			for (Entry<String, Integer> entry : entrySet) {
				map.put(entry.getKey(), rs.getObject(entry.getValue()));
			}
			list.add(map);
		}
		return list;
	}

	/**
	 * 初始化查询参数
	 * 
	 * @param prepareStatement
	 * @param params
	 * @param sql
	 * @throws Exception
	 */
	private static void initPreparedStatementParams(PreparedStatement ps, Map<String, Object> params, String sql)
			throws Exception {
		if (params == null || params.isEmpty()) {
			return;
		}
		// 使用正则表达式取出:test的字段,主要是确定下标
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(sql);
		int index = 1;
		while (m.find()) {
			String regexValue = m.group();
			String mapKey = regexValue.replaceAll(":", "").trim();
			Object object = params.get(mapKey);
			if (object == null) {
				throw new Exception("没有为变量" + mapKey + "赋值。");
			}
			ps.setString(index, (String) object);
			index++;
		}
	}

	/**
	 * 格式化sql,将冒号参数更改为问号,:test →?
	 * 
	 * @param sql
	 * @return
	 */
	private static String formatSql(String sql) {
		String replaceAll = sql.replaceAll(regex, "?");
		return replaceAll;
	}

	// ==================================================================================================================

}

2、在当前项目中的resource中新建一个数据库配置文件large-screen-display.properties

target_className=com.mysql.cj.jdbc.Driver
target_url=jdbc:mysql://IP:3306/scjg_exploit?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT
target_name=root
target_pw=root

3、新建测试代码


import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


// ~ File Information
/**
 * @author zxy
 * @date 2019年5月14日 下午5:35:35
 * 类说明:
 */
// ====================================================================================================================

public class TestDb {

	// ~ Static Fields
	// ==================================================================================================================

	// ~ Fields
	// ==================================================================================================================

	// ~ Constructors
	// ==================================================================================================================

	// ~ Methods
	public static void main(String[] args) {
		Map<String,Object> map=new HashMap<>();
		String sql = "select a.id from test_table a ";
		//map.put("serviceType", 1);
		Connection connection=null;
		try {
			connection = KJdbc.getConnection("target");
		} catch (SQLException | IOException e) {
			e.printStackTrace();
		}
		List<Map<String, Object>> execuSql = KJdbc.execuSql(sql, map, connection);
		System.out.println(execuSql);
	}
	// ==================================================================================================================

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值