⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sql.java

📁 大名鼎鼎的java动态脚本语言。已经通过了sun的认证
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
    }    public void commit() {        try {            this.useConnection.commit();        }        catch (SQLException e) {            log.log(Level.SEVERE, "Caught exception commiting connection: " + e, e);        }    }    public void rollback() {        try {            this.useConnection.rollback();        }        catch (SQLException e) {            log.log(Level.SEVERE, "Caught exception rollbacking connection: " + e, e);        }    }    /**     * @return Returns the updateCount.     */    public int getUpdateCount() {        return updateCount;    }    /**     * If this instance was created with a single Connection then the connection     * is returned. Otherwise if this instance was created with a DataSource     * then this method returns null     *     * @return the connection wired into this object, or null if this object     *         uses a DataSource     */    public Connection getConnection() {        return useConnection;    }    /**     * Allows a closure to be passed in to configure the JDBC statements before they are executed     * to do things like set the query size etc.     *     * @param configureStatement     */    public void withStatement(Closure configureStatement) {        this.configureStatement = configureStatement;    }    // Implementation methods    //-------------------------------------------------------------------------    /**     * @return the SQL version of the given query using ? instead of any     *         parameter     */    protected String asSql(GString gstring, List values) {        String[] strings = gstring.getStrings();        if (strings.length <= 0) {            throw new IllegalArgumentException("No SQL specified in GString: " + gstring);        }        boolean nulls = false;        StringBuffer buffer = new StringBuffer();        boolean warned = false;        Iterator iter = values.iterator();        for (int i = 0; i < strings.length; i++) {            String text = strings[i];            if (text != null) {                buffer.append(text);            }            if (iter.hasNext()) {                Object value = iter.next();                if (value != null) {                    if(value instanceof ExpandedVariable){                        buffer.append(((ExpandedVariable)value).getObject());                        iter.remove();                    }else{                        boolean validBinding = true;                        if (i < strings.length - 1) {                            String nextText = strings[i + 1];                            if ((text.endsWith("\"") || text.endsWith("'")) && (nextText.startsWith("'") || nextText.startsWith("\""))) {                                if (!warned) {                                    log.warning("In Groovy SQL please do not use quotes around dynamic expressions " +                                            "(which start with $) as this means we cannot use a JDBC PreparedStatement " +                                            "and so is a security hole. Groovy has worked around your mistake but the security hole is still there. " +                                            "The expression so far is: " + buffer.toString() + "?" + nextText);                                    warned = true;                                }                                buffer.append(value);                                iter.remove();                                validBinding = false;                            }                        }                        if (validBinding) {                            buffer.append("?");                        }                    }                }                else {                    nulls = true;                    buffer.append("?'\"?"); // will replace these with nullish                    // values                }            }        }        String sql = buffer.toString();        if (nulls) {            sql = nullify(sql);        }        return sql;    }    /**     * replace ?'"? references with NULLish     *      * @param sql     * @return     */    protected String nullify(String sql) {        /*         * Some drivers (Oracle classes12.zip) have difficulty resolving data         * type if setObject(null). We will modify the query to pass 'null', 'is         * null', and 'is not null'         */        //could be more efficient by compiling expressions in advance.        int firstWhere = findWhereKeyword(sql);        if (firstWhere >= 0) {            Pattern[] patterns = { Pattern.compile("(?is)^(.{" + firstWhere + "}.*?)!=\\s{0,1}(\\s*)\\?'\"\\?(.*)"),                    Pattern.compile("(?is)^(.{" + firstWhere + "}.*?)<>\\s{0,1}(\\s*)\\?'\"\\?(.*)"),                    Pattern.compile("(?is)^(.{" + firstWhere + "}.*?[^<>])=\\s{0,1}(\\s*)\\?'\"\\?(.*)"), };            String[] replacements = { "$1 is not $2null$3", "$1 is not $2null$3", "$1 is $2null$3", };            for (int i = 0; i < patterns.length; i++) {                Matcher matcher = patterns[i].matcher(sql);                while (matcher.matches()) {                    sql = matcher.replaceAll(replacements[i]);                    matcher = patterns[i].matcher(sql);                }            }        }        return sql.replaceAll("\\?'\"\\?", "null");    }    /**     * Find the first 'where' keyword in the sql.     *      * @param sql     * @return     */    protected int findWhereKeyword(String sql) {        char[] chars = sql.toLowerCase().toCharArray();        char[] whereChars = "where".toCharArray();        int i = 0;        boolean inString = false; //TODO: Cater for comments?        boolean noWhere = true;        int inWhere = 0;        while (i < chars.length && noWhere) {            switch (chars[i]) {                case '\'':                    if (inString) {                        inString = false;                    }                    else {                        inString = true;                    }                    break;                default:                    if (!inString && chars[i] == whereChars[inWhere]) {                        inWhere++;                        if (inWhere == whereChars.length) {                            return i;                        }                    }            }            i++;        }        return -1;    }    /**     * @return extracts the parameters from the expression as a List     */    protected List getParameters(GString gstring) {        Object[] values = gstring.getValues();        List answer = new ArrayList(values.length);        for (int i = 0; i < values.length; i++) {            if (values[i] != null) {                answer.add(values[i]);            }        }        return answer;    }    /**     * Appends the parameters to the given statement     */    protected void setParameters(List params, PreparedStatement statement) throws SQLException {        int i = 1;        for (Iterator iter = params.iterator(); iter.hasNext();) {            Object value = iter.next();            setObject(statement, i++, value);        }    }    /**     * Strategy method allowing derived classes to handle types differently     * such as for CLOBs etc.     */    protected void setObject(PreparedStatement statement, int i, Object value)        throws SQLException {        if (value instanceof InParameter  || value instanceof OutParameter) {            if(value instanceof InParameter){                InParameter in = (InParameter) value;                Object val = in.getValue();                if (null == val) {                    statement.setNull(i, in.getType());                } else {                    statement.setObject(i, val, in.getType());                }            }            if(value instanceof OutParameter){                try{                    OutParameter out = (OutParameter)value;                    ((CallableStatement)statement).registerOutParameter(i,out.getType());                }catch(ClassCastException e){                    throw new SQLException("Cannot register out parameter.");                }            }        } else {            statement.setObject(i, value);        }    }    protected Connection createConnection() throws SQLException {        if (dataSource != null) {            //Use a doPrivileged here as many different properties need to be            // read, and the policy            //shouldn't have to list them all.            Connection con = null;            try {                con = (Connection) AccessController.doPrivileged(new PrivilegedExceptionAction() {                    public Object run() throws SQLException {                        return dataSource.getConnection();                    }                });            }            catch (PrivilegedActionException pae) {                Exception e = pae.getException();                if (e instanceof SQLException) {                    throw (SQLException) e;                }                else {                    throw (RuntimeException) e;                }            }            return con;        }        else {            //System.out.println("createConnection returning: " +            // useConnection);            return useConnection;        }    }    protected void closeResources(Connection connection, Statement statement, ResultSet results) {        if (results != null) {            try {                results.close();            }            catch (SQLException e) {                log.log(Level.SEVERE, "Caught exception closing resultSet: " + e, e);            }        }        closeResources(connection, statement);    }    protected void closeResources(Connection connection, Statement statement) {        if (statement != null) {            try {                statement.close();            }            catch (SQLException e) {                log.log(Level.SEVERE, "Caught exception closing statement: " + e, e);            }        }        if (dataSource != null) {            try {                connection.close();            }            catch (SQLException e) {                log.log(Level.SEVERE, "Caught exception closing connection: " + e, e);            }        }    }    private void warnDeprecated() {        if (!warned) {            warned = true;            log.warning("queryEach() is deprecated, please use eachRow() instead");        }    }    /**     * Provides a hook to be able to configure JDBC statements, such as to configure     *     * @param statement     */    protected void configure(Statement statement) {        if (configureStatement != null) {            configureStatement.call(statement);        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -