JDBC包,核心操作包
SQL class -> AbstractSQL class
AbstractSQL 包含两个内部类
1.SafeAppendable 内部类
作用: 拼接类
2.SQLStatement
作用: 可以完整的表述一条SQL语句
SQLRunner类
作用: SqlRunner 类时Mybatis提供的可以直接执行SQL语句的工具
SqlRunner->selectAll->getResults 结果处理流程
private List<Map<String, Object>> getResults(Resultset rs) throws SQLException { try { List<Map<String, Object>> list = new ArrayList<>(); // 返回结果的字段列表名称,按照字段顺序排序 List<String> columns = new ArrayList<>(); // 返回结果的类型处理器列表,按照字段顺序排列 List<TypeHandler<?>> typeHandlers = new ArrayList<>(); // 获取返回结果的表信息,字段信息等 ResultSetMetaData rsmd = rs.getMetaData(); for(int i = 0; n = rsmd.getColumnCount(); i++) { // 记录字段名 columns.add(rsmd.getColumnLabel(i + 1)); // 记录字段的对应类型处理器 try { Class<?> type = Resources.classForName(rsmd.getColumnClassName(i+ 1)); TypeHandler<?> typeHandler = typeHandlerRegistry.getTypeHandler(type); if(typeHandler == null) { typeHandler = typeHandlerRegistry.getTypeHandler(Object.class); } typeHandlers.add(typeHandler); }catch(Exception e) { // 默认的类型处理器是Object处理器 typeHandlers.add(typeHandlerRegistry.getTypeHandler(Object.class)); } } // 循环处理结果 while(rs.next()) { Map<String,Object> row = new HashMap<>(); for(int i = 0, n = columns.size(); i < n; i ++) { // 字段名 String name = columns.get(i); // 对应处理器 TypeHandler<?> handler = typeHandlers.get(i); // 放入结果中,key为字段名的大写,value为取出的结果值 row.put(name.toUpperCase(), handler.getResult(rs, name)); } list.add(row); } return list; }finally { if(rs != null) { try { rs.close(); }catch(Exception e) { } } } }
SriptRunner
作用:执行sql脚本,可以一次性执行多个SQL语句
ScriptRunner可以选择:全脚本、逐行执行两种模式
1.全脚本模式
private void executeFullScript(Reader reader) {
// 脚本全文
StringBuilder script = new StringBuilder();
try {
BufferedReader lineReader = new BufferedReader(reader);
String line;
while((line = lineReader.readLine()) != null) {
// 逐行读入脚本全文
script.apend(line);
script.append(LINE_SEPARATOR);
}
// 拼接为一条命令
String command = script.toString();
println(command);
// 执行命令
executeStatement(command);
// 如果没有启用自动提交, 则进行提交操作(脚本中可能修改了自动提交设置);
commitConnection();
}catch(Exception e) {
String mesage = "Error executing: " + script + ". Cause:" + e;
printlnError(message);
throw new RuntimeSqlException(message, e);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。