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);
        }
    } 

叮咚_打地鼠
0 声望0 粉丝

docker docker docker ing