h2database 原始碼分析1-核心類
阿新 • • 發佈:2019-06-26
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