1. 程式人生 > >h2database 原始碼分析1-核心類

h2database 原始碼分析1-核心類

DataChangeStatement類表示資料修改的類。

預編譯物件,包括比較重要的select

命令執行CommandInterface,比較重要的介面是ResultInterface executeQuery(int maxRows, boolean scrollable);

解析Expression表示式

資料型別VersionedValue

結果集,其中繼承ResultSet的是JdbcResultSet,ResultInterface不是一個根。但JdbcResultSet種包括ResultInterface物件

jdbcdemo

        Class.forName("com.mysql.jdbc.Driver");
 
        //獲取連線
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String user = "root";
        String password = "password";
        Connection conn = DriverManager.getConnection(url, user, password);
 
        //得到執行環境
        Statement st = conn.createStatement();
 
        //執行SQL
        String sql = "select * from myuser";
        ResultSet rs = st.executeQuery(sql);

我們看下核心的方法st.executeQuery(sql),在h2中如何實現的

    public ResultSet executeQuery(String sql) throws SQLException {
        try {
            int id = getNextId(TraceObject.RESULT_SET);
            if (isDebugEnabled()) {
                debugCodeAssign("ResultSet", TraceObject.RESULT_SET, id,
                        "executeQuery(" + quote(sql) + ")");
            }
            synchronized (session) {
                checkClosed();
                closeOldResultSet();
                sql = JdbcConnection.translateSQL(sql, escapeProcessing);
                CommandInterface command = conn.prepareCommand(sql, fetchSize);
                ResultInterface result;
                boolean lazy = false;
                boolean scrollable = resultSetType != ResultSet.TYPE_FORWARD_ONLY;
                boolean updatable = resultSetConcurrency == ResultSet.CONCUR_UPDATABLE;
                setExecutingStatement(command);
                try {
                    result = command.executeQuery(maxRows, scrollable);
                    lazy = result.isLazy();
                } finally {
                    if (!lazy) {
                        setExecutingStatement(null);
                    }
                }
                if (!lazy) {
                    command.close();
                }
                resultSet = new JdbcResultSet(conn, this, command, result, id,
                        closedByResultSet, scrollable, updatable);
            }
            return resultSet;
        } catch (Exception e) {
            throw logAndConvert(e);
        }
    }

查詢的呼叫關係如下:

st.executeQuery(sql)->CommandInterface.executeQuery(maxRows, scrollable)->Prepared.query(maxrows)->Select.queryWithout