一、问题
在用户使用系统过程中,同一查询条件在一小时前和一小时后的结果是不一样的,在一小时后查出的数据在一小时内未发现任何改变。此过程有录屏为证。
二、分析
为查证问题在每次查询的时候记录ibatis产生的sql,在事后根据oracle 缓存进行查询,比对未查询到数据的sql 和查询到数据的sql,以及缓存中的数据变化。
三、实现
public String getExecSql(String sqlId,EXAMPLE example) {
SqlMapClientImpl sqlMapClient = (SqlMapClientImpl) this.getSqlMapClient();
String sqlString = "";
try {
MappedStatement stmt = sqlMapClient.getMappedStatement(sqlId);
if (stmt != null) {
Sql sql = stmt.getSql();
SessionScope sessionScope = new SessionScope();
// sessionScope.setSqlMapClient(sqlMapClient);
sessionScope.incrementRequestStackDepth();
StatementScope statementScope = new StatementScope(sessionScope);
stmt.initRequest(statementScope);
stmt.getCacheKey(statementScope, example);
sqlString = sql.getSql(statementScope, example);
Object[] parameters =
sql.getParameterMap(statementScope, example).getParameterObjectValues(statementScope, example);
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (Object parameter : parameters) {
if ("java.lang.String".equals(parameter.getClass().getName()))
sqlString = sqlString.replaceFirst("\\?", "'" + parameter.toString() + "'");
else if ("java.util.Date".equals(parameter.getClass().getName()))
sqlString =
sqlString.replaceFirst("\\?", "to_date('" + sdf.format(parameter)
+ "','yyyy-mm-dd hh24:mi:ss')");
else
sqlString = sqlString.replaceFirst("\\?", parameter.toString());
}
}
} catch (Exception e) {
logger.error("getExecSql:" + e.getMessage());
}
return sqlString;
}
获取sql,记录到日志表中,事后查询。
分享到:
相关推荐
- `<isGreaterEqual>`:用于判断一个值是否大于等于另一个值,如果是则执行相应的SQL语句。 - `<isLessThan>`:用于判断一个值是否小于另一个值,如果是则执行相应的SQL语句。 - `<isLessEqual>`:用于判断一个值...
至此,你应该能在控制台或指定的日志文件中看到iBatis执行的SQL语句,包括参数信息。 除了默认的日志实现外,MyBatis也支持其他日志实现,例如SLF4J,配置方法类似。只需将`logImpl`设置为对应的值,如`LOG4J`、`...
部分内容:这段部分提供了ibatis用户指南的警告,关于从文档复制代码的问题,以及ibatis的概述、如何开始使用ibatis、构建SqlSessionFactory的方法(包括通过XML和不使用XML的方式)、获取SqlSession的过程、探索...
总的来说,这个“SQL参数自动填充工具”是一个针对iBatis框架,用于自动处理和填充SQL语句中参数的实用工具,尤其适用于需要频繁调试SQL日志的开发者。通过使用这个工具,开发者可以从繁琐的手动参数替换工作中解放...
### SQL参数化查询的概念 参数化查询允许将变量值插入到SQL语句中,而不是直接将它们拼接到字符串中。问号是大多数数据库系统用来表示这些参数的占位符。例如,以下是一个简单的参数化SELECT语句: ```sql SELECT *...
创建一个测试类,如`TestIbatis.java`,并使用Ibatis API执行SQL查询: ```java import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis....
通过JDBC,我们可以执行SQL查询,获取数据库元数据(如表结构),从而实现自动化生成SQLMap文件。 生成SQLMap文件的过程通常包括以下步骤: 1. **建立数据库连接**:使用JDBC的`DriverManager.getConnection()`...
还有ExecutorFactory,它负责创建执行SQL的实例。配置文件通常会包含多个SqlMap的引用,这些SqlMap对应于不同的数据库表或者业务对象。 SqlMap.xml文件则是具体的SQL映射文件,它是iBATIS的核心,定义了SQL语句、...
Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让你直接编写原生态SQL,可以严格控制SQL执行性能,灵活度极高,尤其适合对SQL有特殊需求的项目。 ### SQL语句详解 #### 1. 删除...
`SqlSession`则代表与数据库的一次会话,通过它执行SQL语句并获取结果。 5. 实体类与结果映射:在Java源代码中,你会找到与数据库表对应的实体类,如`User.java`,这些类定义了数据库表字段的Java表示。MyBatis通过...
iBATIS-SqlMaps开发指南是一本专注于介绍如何使用iBATIS框架进行SqlMap开发的专业教程。iBATIS,一个由Apache基金会维护的开源Java库,最初由James Roper开发,旨在提供一种将SQL查询与Java应用程序解耦的机制。在...
2. SqlSession:代表一个数据库会话,可以在其中执行SQL命令并获取结果。SqlSession支持事务管理,包括开启、提交和回滚。 3. Mapper:Ibatis中的Mapper接口是与数据库交互的桥梁。开发者可以定义自己的Mapper接口...
4. 参数绑定:Ibatis将方法的参数值与SQL语句中的占位符进行匹配和绑定。 5. 数据库交互:Ibatis执行SQL语句,与数据库进行交互。 6. 结果映射:将数据库返回的结果自动映射到Java对象,无需手动处理ResultSet。 ...
2. 执行映射的Statement,iBATIS创建PreparedStatement,填充参数,执行SQL并从结果集中构建返回对象。 3. 返回结果,对于更新操作,返回受影响的行数;对于查询,返回对象或对象集合。 基础知识点包括: 1. ...
2.2 SQL 执行:通过 SqlSession 接口,开发者可以获取 SqlSession 对象,执行 SQL 映射文件中的 SQL 语句。SqlSession 提供了 CRUD 方法,如 `selectOne()`, `selectList()`, `insert()`, `update()` 和 `delete()`...
ja.pdf》可能包含以下内容:基础安装和配置、SqlMap配置详解、数据源的设置、SQL映射文件的编写、动态SQL的使用、事务管理、结果集映射、参数映射、自定义类型处理器、异常处理以及如何在实际项目中集成iBATIS等。...
它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。iBatis提供了一个SQL地图文件,可以将SQL与Java代码分离,使得开发者能够专注于编写高质量的SQL语句,同时保持良好的可维护性。 在iBatis的源码分析中,...
3. 动态SQL:iBATIS支持动态构建SQL语句,可以根据传入的参数灵活地调整查询条件。这在处理条件复杂的查询时非常有用,避免了编写大量硬编码的SQL语句。 4. 事务管理:iBATIS提供了事务管理功能,可以在应用级别...
SqlSessionFactory是整个Ibatis的核心,负责创建SqlSession对象,而SqlSession则是执行SQL和获取结果的接口。 2. **Mapper XML文件**:每个Mapper对应一个数据库表,其中包含了SQL查询、插入、更新和删除语句。通过...