package cn.baiweigang.qtaf.toolkit.mysql;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import cn.baiweigang.qtaf.toolkit.util.LogUtil;
import cn.baiweigang.qtaf.toolkit.util.StringUtil;
/**
* 数据库操作类,需先使用connMysql或reConnMysql方法先连接到数据库后,再执行其他操作
* @author @<a href='http://weibo.com/bwgang'>bwgang</a> (bwgang@163.com)<br/>
*
*/
public class MysqlUtil {
private static Connection con = null; // 创建用于连接数据库的Connection对象
private static LogUtil log = LogUtil.getLogger(MysqlUtil.class);// 日志记录
private static ConnMysql mysql;// 数据库连接
/**
* 连接mysql,如果已连接,则不再根据传入的参数创建连接
*
* @param ip
* @param port
* @param dataName
* @param userName
* @param passWord
*/
public static void connMysql(String ip, String port, String dataName,
String userName, String passWord) {
if (con == null) {
if (null == mysql) {//
mysql = new ConnMysql();
mysql.ip = ip;
mysql.port = port;
mysql.dataName = dataName;
mysql.userName = userName;
mysql.passWord = passWord;
}
con = mysql.getConnection();
}
}
/**
* 根据连接信息,重新连接mysql,如果已有连接,则先断开
*
* @param ip
* @param port
* @param dataName
* @param userName
* @param passWord
*/
public static void reConnMysql(String ip, String port, String dataName,
String userName, String passWord) {
closedConn();
connMysql(ip, port, dataName, userName, passWord);
}
/**
* 说明:关闭数据库连接
*/
public static void closedConn() {
if (con != null) {
mysql.closedConn();
con = null;
}
}
/**
* 说明:用于执行插入、更新、删除的sql语句,当受影响的行数为0和执行失败时返回false
*
* @param sql
* @return boolean 成功返回true,失败返回false
*/
public static boolean excSql(String sql) {
if (null == con) {
// log.info("尚未连接数据库");
return false;// 数据库未连接
}
return mysql.excSql(sql);
}
/**
* 按指定的sql,查询表中所有数据,返回表中所有列
*
* @param sql
* @return List<Map<String, String>>
*/
public static List<Map<String, String>> queryBySql(String sql) {
return getMapFromResult(querySql(sql));
}
/**
* 按指定的表名,查询表中所有数据,返回表中所有列
*
* @param tablename
* @return List<Map<String, String>>
*/
public static List<Map<String, String>> queryFromTable(String tablename) {
String sql = "select * from " + tablename;
return getMapFromResult(querySql(sql));
}
/**
* 按指定的表名,查询表中所有数据,返回表中所有列
*
* @param tablename
* @return List<Map<String, String>>
*/
public static List<Map<String, String>> queryFromTable(String tablename,
List<String> keyList) {
return getMapByKeyList(queryFromTable(tablename), keyList);
}
/**
* 按指定的查询条件和表名,查询表中所有数据,返回表中所有列
*
* @param tablename
* @param wherestr
* @return List<Map<String, String>>
*/
public static List<Map<String, String>> queryFromTableByIf(
String tablename, String wherestr) {
String sql = "select * from " + tablename + " where " + wherestr;
return getMapFromResult(querySql(sql));
}
/**
* 按指定的查询条件和表名.查询表中记录,返回第一条记录的指定列的值
*
* @param tablename
* @param wherestr
* @param keyname
* @return String
*/
public static String queryFromTableByIf(String tablename, String wherestr,
String keyname) {
Map<String, String> map = new TreeMap<String, String>();
try {
map = queryFromTableByIf(tablename, wherestr).get(0);
return map.get(keyname).toString();
} catch (Exception e) {
log.error("查询异常");
log.error(e.getMessage());
return "";
}
}
/**
* 按指定的sql.查询表中记录,返回第一条记录的指定列的值
*
* @param sql
* @param keyname
* @return String
*/
public static String queryTableBysqlMax(String sql) {
String max = "";
try {
ResultSet res = querySql(sql);
res.next();
max = res.getString(1);
} catch (SQLException e) {
log.error("查询最大值失败!");
log.error(e.getMessage());
}
return max;
}
/**
* 按指定的查询条件和表名,查询表中所有数据,返回指定的列
*
* @param tableName
* @param whereStr
* @param keyList
* @return List<Map<String, String>>
*/
public static List<Map<String, String>> getMapFromSql(String tableName,
String whereStr, List<String> keyList) {
return getMapByKeyList(queryFromTableByIf(tableName, whereStr), keyList);
}
/**
* 按指定的查询条件和表名,查询表中所有数据,返回Map中key对应的列
*
* @param tablename
* @param wherestr
* @param expMap
* @return List<Map<String, String>>
*/
public static List<Map<String, String>> getMapFromSql(String tablename,
String wherestr, Map<String, String> expMap) {
List<String> keyList = StringUtil.getKeyListFromMap(expMap);
return getMapFromSql(tablename, wherestr, keyList);
}
// 私有方法
private static ResultSet querySql(String sql) {
if (null == con) {
// log.info("尚未连接数据库");
return null;// 数据库未连接
}
return mysql.querySql(sql);
}
/**
* 说明:判断查询结果集内的记录个数,如果小于1条则返回true
*
* @param res
* 查询结果集
* @return boolean 结果集异常或等于0条返回true,否则返回false
*/
private static boolean ResultIsNull(ResultSet res) {
if (null == res) {
// log.info("数据库连接异常");
return true;
}
try {
res.last();
if (res.getRow() == 0) {
log.info("查询结果集为0条");
return true;
} else {
res.beforeFirst();
return false;
}
} catch (SQLException e) {
log.error("计算查询结果集个数失败!");
log.error(e.getMessage());
return true;
}
}
/**
* 查询结果集转换为Map列表
*
* @param rs
* @return List<Map<String, String>>
*/
private static List<Map<String, String>> getMapFromResult(ResultSet rs) {
List<Map<String, String>> mapList = new ArrayList<>();
Map<String, String> map;
ResultSetMetaData rsmd;
if (null == rs) {
// log.info("数据库连接异常");
return mapList;
}
try {
if (MysqlUtil.ResultIsNull(rs)) {
log.error(" 查询结果集为空");
return mapList;
}
rsmd = rs.getMetaData();
while (rs.next()) {
map = new TreeMap<String, String>();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
String key = "";
String value = "";
key = rsmd.getColumnName(i).toString();
try {
value = rs.getObject(i).toString();
} catch (Exception e) {
// log.error(" 查询结果中解析字段 "+key+"值异常");
// log.error(e.getMessage());
}
map.put(key, value);
}
mapList.add(map);
}
} catch (SQLException e) {
log.error("查询异常");
log.error(e.getMessage());
}
return mapList;
}
/**
* 根据指定的key列表,从map中取出新的map
*
* @param mapTmpList
* @param keyList
* @return List<Map<String, String>>
*/
private static List<Map<String, String>> getMapByKeyList(
List<Map<String, String>> mapTmpList, List<String> keyList) {
List<Map<String, String>> mapList = new ArrayList<Map<String, String>>();
Map<String, String> mapTmp;
if (null == keyList || keyList.size() < 1) {
log.error("要获取的列信息为空,请检查");
return mapList;
}
if (null == mapTmpList || mapTmpList.size() < 1) {
return mapList;
}
for (int i = 0; i < mapTmpList.size(); i++) {// 处理多条查询结果
mapTmp = new TreeMap<>();
for (int j = 0; j < keyList.size(); j++) {// 获取指定列信息
String key = keyList.get(j);
String value = StringUtil.getValueFromMapByKey(
mapTmpList.get(i), key);
mapTmp.put(key, value);
}
mapList.add(mapTmp);
}
return mapList;
}
}