From 0a7c050dcf2fc4a9e7e99bc696c7bfc4f80fc8fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 14 Mar 2012 00:22:38 +0800 Subject: [PATCH] add mapping support --- .../alibaba/druid/mapping/MappingEngine.java | 58 +++++++-- .../com/alibaba/druid/util/JdbcUtils.java | 110 ++++++++++++------ 2 files changed, 122 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java index a7aab55b37..6659770c8c 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java +++ b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java @@ -1,8 +1,11 @@ package com.alibaba.druid.mapping; +import java.sql.Connection; +import java.sql.SQLException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import com.alibaba.druid.mapping.spi.ExportParameterVisitor; import com.alibaba.druid.mapping.spi.MappingProvider; @@ -14,6 +17,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcUtils; public class MappingEngine { @@ -81,14 +85,6 @@ public class MappingEngine { return toSQL(query); } - public String toSQL(SQLObject sqlObject) { - StringBuilder out = new StringBuilder(); - SQLASTOutputVisitor outputVisitor = createOutputVisitor(out); - sqlObject.accept(outputVisitor); - - return out.toString(); - } - public SQLUpdateStatement explainToUpdateSQLObject(String sql) { return provider.explainToUpdateSQLObject(this, sql); } @@ -123,4 +119,50 @@ public class MappingEngine { ExportParameterVisitor exporter = this.provider.createExportParameterVisitor(parameters); sqlObject.accept(exporter); } + + public String toSQL(SQLObject sqlObject) { + return toSQL(sqlObject, false); + } + + public String toSQL(SQLObject sqlObject, boolean exportParameter) { + if (exportParameter) { + exportParameters(sqlObject); + } + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor outputVisitor = createOutputVisitor(out); + sqlObject.accept(outputVisitor); + + return out.toString(); + } + + public List> select(Connection conn, String sql, List parameters) throws SQLException { + SQLSelectQueryBlock sqlObject = this.explainToSelectSQLObject(sql); + exportParameters(sqlObject, parameters); + String rawSql = this.toSQL(sqlObject); + return JdbcUtils.executeQuery(conn, rawSql, parameters); + } + + public int delete(Connection conn, String sql, List parameters) throws SQLException { + SQLDeleteStatement sqlObject = this.explainToDeleteSQLObject(sql); + exportParameters(sqlObject, parameters); + String rawSql = this.toSQL(sqlObject); + int updateCount = JdbcUtils.executeUpdate(conn, rawSql, parameters); + return updateCount; + } + + public int update(Connection conn, String sql, List parameters) throws SQLException { + SQLUpdateStatement sqlObject = this.explainToUpdateSQLObject(sql); + exportParameters(sqlObject, parameters); + String rawSql = this.toSQL(sqlObject); + int updateCount = JdbcUtils.executeUpdate(conn, rawSql, parameters); + return updateCount; + } + + public void insert(Connection conn, String sql, List parameters) throws SQLException { + SQLInsertStatement sqlObject = this.explainToInsertSQLObject(sql); + exportParameters(sqlObject, parameters); + String rawSql = this.toSQL(sqlObject); + JdbcUtils.execute(conn, rawSql, parameters); + } } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 0090be6f70..5fda580093 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -526,8 +526,40 @@ public final class JdbcUtils { throw new SQLException(e.getMessage(), e); } } - - public static List> executeQuery(Connection conn, String sql, List parameters) { + + public static int executeUpdate(Connection conn, String sql, List parameters) throws SQLException { + PreparedStatement stmt = null; + + int updateCount; + try { + stmt = conn.prepareStatement(sql); + + setParameters(stmt, parameters); + + updateCount = stmt.executeUpdate(); + } finally { + JdbcUtils.close(stmt); + } + + return updateCount; + } + + public static void execute(Connection conn, String sql, List parameters) throws SQLException { + PreparedStatement stmt = null; + + try { + stmt = conn.prepareStatement(sql); + + setParameters(stmt, parameters); + + stmt.executeUpdate(); + } finally { + JdbcUtils.close(stmt); + } + } + + public static List> executeQuery(Connection conn, String sql, List parameters) + throws SQLException { List> rows = new ArrayList>(); PreparedStatement stmt = null; @@ -535,53 +567,23 @@ public final class JdbcUtils { try { stmt = conn.prepareStatement(sql); - for (int i = 0, size = parameters.size(); i < size; ++i) { - Object val = parameters.get(i); - int paramIndex = i + 1; - - if (val == null) { - stmt.setNull(paramIndex, Types.VARCHAR); - } else if (val instanceof BigDecimal) { - stmt.setBigDecimal(paramIndex, (BigDecimal) val); - } else if (val instanceof String) { - stmt.setString(paramIndex, (String) val); - } else if (val instanceof Date) { - long time = ((Date) val).getTime(); - stmt.setTimestamp(paramIndex, new java.sql.Timestamp(time)); - } else if (val instanceof Byte) { - stmt.setByte(paramIndex, (Byte) val); - } else if (val instanceof Short) { - stmt.setShort(paramIndex, (Short) val); - } else if (val instanceof Integer) { - stmt.setInt(paramIndex, (Integer) val); - } else if (val instanceof Long) { - stmt.setLong(paramIndex, (Long) val); - } else if (val instanceof Float) { - stmt.setFloat(paramIndex, (Float) val); - } else if (val instanceof Double) { - stmt.setDouble(paramIndex, (Double) val); - } else { - throw new DruidMappingException("not support parameters : " + val); - } - } + setParameters(stmt, parameters); rs = stmt.executeQuery(); - + ResultSetMetaData rsMeta = rs.getMetaData(); - + while (rs.next()) { Map row = new LinkedHashMap(); - + for (int i = 0, size = rsMeta.getColumnCount(); i < size; ++i) { String columName = rsMeta.getColumnName(i + 1); Object value = rs.getObject(i + 1); row.put(columName, value); } - + rows.add(row); } - } catch (SQLException e) { - throw new DruidMappingException("execute error", e); } finally { JdbcUtils.close(rs); JdbcUtils.close(stmt); @@ -589,7 +591,39 @@ public final class JdbcUtils { return rows; } - + + private static void setParameters(PreparedStatement stmt, List parameters) throws SQLException { + for (int i = 0, size = parameters.size(); i < size; ++i) { + Object val = parameters.get(i); + int paramIndex = i + 1; + + if (val == null) { + stmt.setNull(paramIndex, Types.VARCHAR); + } else if (val instanceof BigDecimal) { + stmt.setBigDecimal(paramIndex, (BigDecimal) val); + } else if (val instanceof String) { + stmt.setString(paramIndex, (String) val); + } else if (val instanceof Date) { + long time = ((Date) val).getTime(); + stmt.setTimestamp(paramIndex, new java.sql.Timestamp(time)); + } else if (val instanceof Byte) { + stmt.setByte(paramIndex, (Byte) val); + } else if (val instanceof Short) { + stmt.setShort(paramIndex, (Short) val); + } else if (val instanceof Integer) { + stmt.setInt(paramIndex, (Integer) val); + } else if (val instanceof Long) { + stmt.setLong(paramIndex, (Long) val); + } else if (val instanceof Float) { + stmt.setFloat(paramIndex, (Float) val); + } else if (val instanceof Double) { + stmt.setDouble(paramIndex, (Double) val); + } else { + throw new DruidMappingException("not support parameters : " + val); + } + } + } + public static String toString(StackTraceElement[] stackTrace) { StringBuilder buf = new StringBuilder(); for (StackTraceElement item : stackTrace) {