首先通过 SqlMapClientBuilder.buildSqlMapClient(reader);得到sqlMapClientImpl实例,然后调用自身的update(String id, Object param),它调用SqlMapSessionImpl的update(id, param),然后它调用delegate的update(sessionScope, id, param)方法,通过参数id得到delegate中的statement,然后调用statement的executeUpdate(StatementScope statementScope, Transaction trans, Object parameterObject)。在这个方面里面有一些关键逻辑需要陈述。
(1) Sql sql = getSql();//得到的sql为StaticSql,SimpleDynamicSql或DynamicSql
(2) 调用sql的getParameterMap得到parameterMap实例
(3) 调用sql的getResultMap的得到resultMap实例
(4) 我们把入参对象解析成入参数组,供设置到ps中
Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject);
(5) 从sql对象解析成真正的sql语句
String sqlString = sql.getSql(statementScope, parameterObject);
//如果原来sql中含有#,则一律转换成?
//如果原来sql中含有$,则直接用值进行替换
//如果是动态sql,则根据参数情况,转换成最终运行时的sql
(6) 然后执行sqlExecuteUpdate(statementScope, trans.getConnection(), sqlString, parameters);
它调用sqlMapClient的getSqlExecutor,然后sqlMapClient再调用delegate的getSqlExecutor得到最终的数据库执行工具类
SqlExecutor
(7) 在sqlExecutor的sqlExecuteUpdate方法里,statementScope.getParameterMap().setParameters(statementScope, ps,parameters);对ps进行设置入参,最后执行sql语句