SpringBoot_扩展数据库操作_DBUtils

SpringBoot_扩展数据库操作_DBUtils

依赖pom.xml

	<dependency>
		<groupId>commons-dbutils</groupId>
		<artifactId>commons-dbutils</artifactId>
	</dependency>
	<dependency>
		<groupId>c3p0</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.1.2</version>
	</dependency>

配置类

//pingruan.base.c3p0.data.use-ext-data=true
//pingruan.base.c3p0.data.driver-class=com.mysql.jdbc.Driver
//pingruan.base.c3p0.data.jdbc-url=jdbc:mysql://192.168.164.100:3306/manage-a?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
//pingruan.base.c3p0.data.user=root
//pingruan.base.c3p0.data.password=qwe123

配置源码

@Component
@ConfigurationProperties(prefix="pingruan.base.c3p0.data")
@Data
public class C3p0Properties {
	private String useExtData = "false";
	private String driverClass;
	private String jdbcUrl;
	private String user;
	private String password;
	private int initialPoolSize = 10;
	private int minPoolSize = 5;
	private int maxPoolSize = 20;
}
/**
 * 获取数据库连接
 *
 * @author vander
 * @date 2018年11月26日
 */
public class Db {
	
	private static final QueryRunner runner = new QueryRunner();
	private static ComboPooledDataSource ds = null;
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
	
	Db(C3p0Properties c3p0){
		try {
			ds = new ComboPooledDataSource();
			ds.setDriverClass(c3p0.getDriverClass());
			ds.setJdbcUrl(c3p0.getJdbcUrl());
			ds.setUser(c3p0.getUser());
			ds.setPassword(c3p0.getPassword());
			ds.setInitialPoolSize(c3p0.getInitialPoolSize());
			ds.setMinPoolSize(c3p0.getMinPoolSize());
			ds.setMaxPoolSize(c3p0.getMaxPoolSize());
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	
	/**
	 * 获取连接
	 * 
	 * @return
	 * @throws SQLException
	 */
	private Connection getConnection() throws SQLException {
		Connection conn = threadLocal.get();
		if (null == conn) {
			conn = getDataSource().getConnection();
			threadLocal.set(conn);
		}
		return conn;
	}

	/**
	 * 开启事务
	 */
	private void startTransaction() {
		try {
			Connection conn = threadLocal.get();
			if (null == conn) {
				conn = getConnection();
				threadLocal.set(conn);
			}
			conn.setAutoCommit(false);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 事务提交
	 */
	private void commit() {
		try {
			Connection conn = threadLocal.get();
			if (conn != null) {
				conn.commit();
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 事务回滚
	 */
	private void rollback() {
		try {
			Connection conn = threadLocal.get();
			if (conn != null) {
				conn.rollback();
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 释放连接
	 */
	private void close() {
		try {
			Connection conn = threadLocal.get();
			if (conn != null) {
				conn.close();
				threadLocal.remove();
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 获取数据源
	 * 
	 * @return
	 */
	private DataSource getDataSource() {
		return ds;
	}


	/**
	 * 查询(返回Array结果)
	 * @param sql
	 * @param params
	 * @return
	 */
	public Object[] queryArray(String sql, Object... params) {
		Object[] result = null;
		try {
			result = runner.query(getConnection(), sql, new ArrayHandler(), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 查询(返回ArrayList结果)
	 * @param sql
	 * @param params
	 * @return
	 */
	public List<Object[]> queryArrayList(String sql, Object... params) {
		List<Object[]> result = null;
		try {
			result = runner.query(getConnection(), sql, new ArrayListHandler(), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 查询(返回Map结果)
	 * @param sql
	 * @param params
	 * @return
	 */
	public Map<String, Object> queryMap(String sql, Object... params) {
		Map<String, Object> result = null;
		try {
			result = runner.query(getConnection(), sql, new MapHandler(), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 查询(返回MapList结果)
	 * @param sql
	 * @param params
	 * @return
	 */
	public List<Map<String, Object>> queryMapList(String sql, Object... params) {
		List<Map<String, Object>> result = null;
		try {
			result = runner.query(getConnection(), sql, new MapListHandler(), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/* 查询(返回Bean结果) */
	public <T> T queryBean(Class<T> cls, Map<String, String> map, String sql,
			Object... params) {
		T result = null;
		try {
			if (map != null) {
				result = runner.query(getConnection(), sql, new BeanHandler<T>(cls, new BasicRowProcessor(new BeanProcessor(map))),
						params);
			} else {
				result = runner.query(getConnection(), sql, new BeanHandler<T>(cls), params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 查询(返回BeanList结果)
	 * @param cls
	 * @param map
	 * @param sql
	 * @param params
	 * @return
	 */
	public <T> List<T> queryBeanList(Class<T> cls, Map<String, String> map, String sql,
			Object... params) {
		List<T> result = null;
		try {
			if (map != null) {
				result = runner.query(getConnection(), sql,
						new BeanListHandler<T>(cls, new BasicRowProcessor(new BeanProcessor(map))), params);
			} else {
				result = runner.query(getConnection(), sql, new BeanListHandler<T>(cls), params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 查询指定列名的值(单条数据)
	 * @param column
	 * @param sql
	 * @param params
	 * @return
	 */
	public <T> T queryColumn(String column, String sql, Object... params) {
		T result = null;
		try {
			result = runner.query(getConnection(), sql, new ScalarHandler<T>(column), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 查询指定列名的值(多条数据)
	 * @param column
	 * @param sql
	 * @param params
	 * @return
	 */
	public <T> List<T> queryColumnList(String column, String sql, Object... params) {
		List<T> result = null;
		try {
			result = runner.query(getConnection(), sql, new ColumnListHandler<T>(column), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 查询指定列名对应的记录映射
	 * @param column
	 * @param sql
	 * @param params
	 * @return
	 */
	public <T> Map<T, Map<String, Object>> queryKeyMap(String column, String sql,
			Object... params) {
		Map<T, Map<String, Object>> result = null;
		try {
			result = runner.query(getConnection(), sql, new KeyedHandler<T>(column), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}

	/**
	 * 更新(包括UPDATE、INSERT、DELETE,返回受影响的行数)
	 * @param sql
	 * @param params
	 * @return
	 */
	public int update( String sql, Object... params) {
		int result = 0;
		try {
			startTransaction();
			result = runner.update(getConnection(), sql, params);
			commit();
		} catch (SQLException e) {
			rollback();
			e.printStackTrace();
		}finally {
			close();
		}
		return result;
	}
}

//@Autowired
//Db db;
/**
 * 扩展数据源
 * 
 *
 * @author vander
 * @date 2018年11月26日
 */
@Configuration
@ConditionalOnProperty(value="pingruan.base.c3p0.data.use-ext-data",havingValue="true")
public class DbConfig {
	
	@Autowired
	C3p0Properties c3p0Properties;
	
	@Bean
	public Db dbs() {
		return new Db(c3p0Properties);
	}

}

Guess you like

Origin blog.csdn.net/qq_15764943/article/details/87728149