com.ckjava.db.utils.DbUtils Maven / Gradle / Ivy
package com.ckjava.db.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ckjava.utils.StringUtils;
/**
* 数据库相关的帮助类
*
*
* - 根据 dburl,username,password 获取数据源 {@code DataSource }
* - 根据 数据源 可以获取到数据库的 所有表 的列表
* - 根据 数据源 和 表名 获取到表的详细信息
* - 根据 数据源 和 sql 获取到查询结果
* - 根据 数据源 和 sql 获取到查询结果,并且带有列名
*
*
*
*
* @author chen_k
*
* 2018年1月31日-下午7:22:54
*/
public class DbUtils extends StringUtils {
private static final Logger logger = LoggerFactory.getLogger(DbUtils.class);
private static Map dataSourceMap = Collections.synchronizedMap(new HashMap());
/**
* 根据 db url, 用户名, 密码创建数据源, 并将其存入到类缓存中, 自动根据 url 中的定义加载驱动类
*
* @param url 数据库连接 url, 包含数据库主机名,端口号,数据库
* @param username 数据库用户名
* @param password 数据库密码
* @return {@code DataSource}
* @throws Exception 异常对象
*/
public static DataSource createDataSource(String url, String username, String password) throws Exception {
String dbKey = getDbKey(url, username, password);
DataSource ds = dataSourceMap.get(dbKey);
if (ds == null) {
DatabasePoolConfig poolConfig = new DatabasePoolConfig();
PoolProperties p = poolConfig.getPoolProperties();
p.setUrl(url);
p.setUsername(username);
p.setPassword(password);
if (url.contains("jdbc:mysql")) {
p.setDriverClassName("com.mysql.jdbc.Driver");
} else if (url.contains("jdbc:sqlserver")) {
p.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} else {
throw new RuntimeException(MessageFormat.format("can't load DriverClass by url:{0}", url));
}
org.apache.tomcat.jdbc.pool.DataSource newDS = new org.apache.tomcat.jdbc.pool.DataSource(p);
dataSourceMap.put(dbKey, newDS);
return newDS;
} else {
return ds;
}
}
private static String getDbKey(String url, String username, String password) {
StringBuilder str = new StringBuilder();
str.append(url).append(CONCAT.AT).append(username).append(CONCAT.AT).append(password);
return str.toString();
}
/**
* 执行多条sql
*
* @param conn {@code Connection} 对象
* @param sql 以 ; 分隔的 sql
*/
public static void executeMutiSql(Connection conn, String sql) {
int rowcount = 0;
PreparedStatement ps = null;
try {
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
String tempSql = sql.replaceAll(";(\\s*|\t|\r|\n)(?i)insert", "';'insert")
.replaceAll(";(\\s*|\t|\r|\n)(?i)update", "';'update")
.replaceAll(";(\\s*|\t|\r|\n)(?i)delete", "';'delete");
String[] sqls = tempSql.split("\';\'");
for (String sqlstr : sqls) {
ps = conn.prepareStatement(sqlstr);
rowcount = ps.executeUpdate();
logger.info("执行sql:{},受影响行数:{}", new Object[]{sqlstr, rowcount});
}
conn.commit();
conn.setAutoCommit(true);
} catch (SQLException e) {
logger.error("执行sql出现异常", e);
try {
conn.rollback();
} catch (SQLException e1) {
logger.error("回滚出现异常", e1);
}
rowcount = 0;
} finally {
closeResource(conn, ps, null);
}
}
/**
* 关闭数据库相关资源
*
* @param conn {@code Connection} 对象
* @param ps {@code PreparedStatement} 对象
* @param rs {@code ResultSet} 对象
*/
public static void closeResource(Connection conn, PreparedStatement ps, ResultSet rs) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
logger.error("关闭数据库资源 Connection 出现异常", e);
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
logger.error("关闭数据库资源 PreparedStatement 出现异常", e);
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
logger.error("关闭数据库资源 ResultSet 出现异常", e);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy