package net.mengkang.nettyrest.mysql; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.*; /** * */ public class Mysql { private static final Logger logger = LoggerFactory.getLogger(Mysql.class); protected static void grammarCheck(String sql,DMLTypes sqlType){ String dmlType = sqlType.toString().toLowerCase(); try { if (!sql.toLowerCase().startsWith(dmlType)) { throw new Exception(dmlType + " statement needed"); } // 除了 insert 之外的操作, 删改查都必须带上条件 if(!dmlType.equals("insert") && sql.toLowerCase().indexOf("where") < 1){ throw new Exception("where statement needed"); } } catch (Exception e) { logger.error(e.getMessage()); } } /** * 检查预处理语句和参数个数是否相符 以免出现参数太多,少写 ? 的情况 * * @param sql * @param params * @return */ protected static int getParameterNum(String sql, Object... params) { int paramSize = sql.length() - sql.replaceAll("\\?", "").length(); try { if (paramSize != params.length) { throw new Exception("parameter's num error"); } } catch (Exception e) { logger.error(e.getMessage()); } return paramSize; } /** * bind parameters * * @param statement * @param params * @return * @throws SQLException */ protected static PreparedStatement bindParameters(PreparedStatement statement, Object... params) throws SQLException { int paramSize = params.length; for (int i = 1; i <= paramSize; i++) { Object param = params[i - 1]; if (param instanceof java.lang.Integer) { statement.setInt(i, (Integer) param); } else if (param instanceof java.lang.String) { statement.setString(i, (String) param); } else if (param instanceof java.lang.Float) { statement.setFloat(i, (Float) param); } else if (param instanceof java.lang.Long) { statement.setLong(i, (Long) param); } else if (param instanceof java.lang.Double) { statement.setDouble(i, (Double) param); } else if (param instanceof java.sql.Date) { statement.setDate(i, (Date) param); } else { statement.setObject(i, param); } } return statement; } /** * 插入操作 * * @param sql * @param params * @return */ public static int insert(String sql, Object... params) { grammarCheck(sql,DMLTypes.INSERT); int paramSize = getParameterNum(sql,params); Connection conn = null; PreparedStatement statement = null; ResultSet rs = null; int id = 0; try { conn = JdbcPool.getWriteConnection(); statement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); if (paramSize > 0) { statement = bindParameters(statement, params); } statement.executeUpdate(); rs = statement.getGeneratedKeys(); if (rs.next()) { id = rs.getInt(1); } } catch (SQLException e) { logger.error("sql error",e); } finally { JdbcPool.release(conn, statement, rs); } return id; } /** * 删除操作 * * @param sql * @param params * @return */ public static int delete(String sql, Object... params) { return update(sql, params); } /** * 更新操作 * * @param sql * @param params * @return */ public static int update(String sql, Object... params) { if (!sql.toLowerCase().startsWith(DMLTypes.DELETE.toString().toLowerCase()) && !sql.toLowerCase().startsWith(DMLTypes.UPDATE.toString().toLowerCase()) && !sql.toLowerCase().startsWith(DMLTypes.REPLACE.toString().toLowerCase())) { try { throw new Exception("update statement needed"); } catch (Exception e) { e.printStackTrace(); } } int paramSize = getParameterNum(sql,params); Connection conn = null; PreparedStatement statement = null; int row = 0; try { conn = JdbcPool.getWriteConnection(); statement = conn.prepareStatement(sql); if (paramSize > 0) { statement = bindParameters(statement, params); } row = statement.executeUpdate(); } catch (SQLException e) { logger.error("sql error",e); } finally { JdbcPool.release(conn, statement, null); } return row; } public static String getValue(String sql, Object... params) { grammarCheck(sql,DMLTypes.SELECT); int paramSize = getParameterNum(sql,params); Connection conn = null; PreparedStatement statement = null; ResultSet rs = null; String res = null; try { conn = JdbcPool.getReadConnection(); statement = conn.prepareStatement(sql); if (paramSize > 0) { statement = bindParameters(statement, params); } rs = statement.executeQuery(); if (rs.next()) { res = rs.getString(1); } } catch (SQLException e) { logger.error("sql error", e); } finally { JdbcPool.release(conn, statement, rs); } return res; } public static int getIntValue(String sql, Object... params) { grammarCheck(sql,DMLTypes.SELECT); int paramSize = getParameterNum(sql,params); if (!sql.toLowerCase().startsWith("select")) { return -1; } Connection conn = null; PreparedStatement statement = null; ResultSet rs = null; int res = 0; try { conn = JdbcPool.getReadConnection(); statement = conn.prepareStatement(sql); if (paramSize > 0) { statement = bindParameters(statement, params); } rs = statement.executeQuery(); if (rs.next()) { res = rs.getInt(1); } } catch (SQLException e) { logger.error("sql error",e); } finally { JdbcPool.release(conn, statement, rs); } return res; } }