Mybatis执行ReuseExecutor(五)
来源:互联网 发布:招聘java程序员 编辑:程序博客网 时间:2024/06/05 00:38
ReuseExecutor顾名思义就是重复使用执行,其定义了一个Map<String, Statement>,将执行的sql作为key,将执行的Statement作为value保存,这样执行相同的sql时就可以使用已经存在的Statement,就不需要新创建了,源码及分析如下:
/** * @author Clinton Begin */public class ReuseExecutor extends BaseExecutor { private final Map<String, Statement> statementMap = new HashMap<String, Statement>(); public ReuseExecutor(Configuration configuration, Transaction transaction) { super(configuration, transaction); } @Override public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {//获得配置文件 Configuration configuration = ms.getConfiguration();//获得statementHandler 包括插件内容 StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);//转换为PrepareStatement Statement stmt = prepareStatement(handler, ms.getStatementLog()); return handler.update(stmt); } @Override public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { Configuration configuration = ms.getConfiguration(); StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql); Statement stmt = prepareStatement(handler, ms.getStatementLog()); return handler.<E>query(stmt, resultHandler); } @Override public List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException { for (Statement stmt : statementMap.values()) { //关闭Statement closeStatement(stmt); }//清空sql statementMap.clear(); return Collections.emptyList(); } private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { Statement stmt; BoundSql boundSql = handler.getBoundSql();//获得sql语句 String sql = boundSql.getSql();//查看是否存在Statement if (hasStatementFor(sql)) { //如果存在就获取Statement stmt = getStatement(sql); } else { Connection connection = getConnection(statementLog); //否则通过连接创建一个Statement stmt = handler.prepare(connection); //将sql语句及对应的Statement 保存到map中 putStatement(sql, stmt); } handler.parameterize(stmt); return stmt; } private boolean hasStatementFor(String sql) { try { //查看map中是否含有sql语句对应的Statement return statementMap.keySet().contains(sql) && !statementMap.get(sql).getConnection().isClosed(); } catch (SQLException e) { return false; } } private Statement getStatement(String s) {//获得Sql语句对应的Statement return statementMap.get(s); } private void putStatement(String sql, Statement stmt) {//将sql语句及对应的Statement保存到map中 statementMap.put(sql, stmt); }}
0 0
- Mybatis执行ReuseExecutor(五)
- mybati源码之ReuseExecutor
- 读mybatis源码之五:执行器Executor创建
- mybatis学习(五)--spring整合mybatis
- MyBatis学习笔记(五)--MyBatis杂项
- mybatis学习(五)MyBatis主配置文件
- mybatis学习笔记(五)
- MyBatis学习(五)- ResultMap
- Mybatis学习笔记(五)
- Mybatis学习笔记(五)
- Mybatis学习笔记(五)
- Spring(五):使用mybatis
- mybatis-动态 SQL(五)
- Mybatis执行BaseExecutor(二)
- Mybatis执行SimpleExecutor(三)
- Mybatis执行BatchExecutor(四)
- Mybatis执行CachingExecutor(六)
- Mybatis执行Executor(一)
- mysql日志配置
- getclass()与getsuperclass() (2)
- 端口:区分不同服务
- 树莓派3初次使用
- Android稳定性问题分析时获取手机状态的ADB命令
- Mybatis执行ReuseExecutor(五)
- Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结
- bzoj 3747: [POI2015]Kinoman(线段树)
- MP3Stego的打开方式与使用方法
- 把字符串转换成整数——剑指offer
- Java的数据类型
- I2S音频总线学习(一)数字音频技术
- javascript表单
- HDU 1864 最大报销额 .