如何使用jdbc template查询数据,而用ibatis组装结果?
2011-01-07 11:28
931 查看
使用jdbc template链接数据库,必须提供连接数据库所需的地址、用户名、密码。这些信息可以从已有的ibatis sqlclient对象中获取。
然后从ibatis配置中获取需要执行的sql语句。但是ibatis每次执行sql都需要有一个RequestScope和SessionScope对象,所以我们手动生成这两个对象,传给ibatis。
在执行PreparedStatement 之前,必须先给PreparedStatement 绑定变量
ok,PreparedStatement对象已经准备完毕,可以执行了。
数据库返回了resultset,但是我们还需要让ibatis帮我们把结果组装成dto对象。
ok,大功告成,返回结果就是我们所需要的对像啦。
采用以上jdbc template 与ibatis结合的好处是,可以自己控制查询的过程。
当查询的数据结果比较大时,采用传统的ibatis查询,一般有两种方式:分页和不分页。如果分页,就需要排序,大数量的排序是比较耗时的,这样数据库总是在做重复的工作,增加了数据库的压力。如果不分页,jvm需要缓存大量的对象,占用大量的内存,并且可能导致内存溢出。
而查询工作由我们自己来做的话,我们就可以只做一次查询,并且不需要排序,可以将这个resultset对象缓存起来,每次从resultset中取一批数据,取完之后将这个对象释放掉。这种方法的缺点是,查询结果会在数据库中存在比较长的时间,一段时间内,占用内存无法释放。
// 2. 创建JDBC链接 */ Class.forName("oracle.jdbc.driver.OracleDriver"); DataSource dataSource = extSqlMapClient.getDataSource(); if (dataSource instanceof DelegatingDataSource) { dataSource = ((DelegatingDataSource) dataSource).getTargetDataSource(); } BasicDataSource basicDataSource = (BasicDataSource) dataSource; conn = DriverManager.getConnection(basicDataSource.getUrl(), basicDataSource.getUsername(), basicDataSource.getPassword());
然后从ibatis配置中获取需要执行的sql语句。但是ibatis每次执行sql都需要有一个RequestScope和SessionScope对象,所以我们手动生成这两个对象,传给ibatis。
// 1. 初始化 MappedStatment/requestScope 对象 */ mappedStatement = extSqlMapClient.getMappedStatement(NAME_SPACE_MJR_KNOWLEDGE + "." + SELECT_EX_BY_ROBOTCODE)); requestScope = new RequestScope(); mappedStatement.initRequest(requestScope); SessionScope session = new SessionScope(); session.reset(); session.setSqlMapClient(extSqlMapClient); session.setSqlMapExecutor(extSqlMapClient); session.setSqlMapTxMgr(extSqlMapClient); requestScope.setSession(session); Sql sql = mappedStatement.getSql();/*ibatis的sql对象*/ Map<String, Object> params = new HashMap<String, Object>(); params.put("robotCode", robotCode); params.put("lastFetchTimePoint", toSqlTimestamp(modifyTimeBegin)); params.put("currentFetchTimePoint", toSqlTimestamp(modifyTimeEnd)); String sqlString = sql.getSql(requestScope, params);/*ibatis根据参数,动态生成sql*/ PreparedStatement st = conn.prepareStatement(sqlString);/*生成jdbc template所需的PreparedStatement*/
在执行PreparedStatement 之前,必须先给PreparedStatement 绑定变量
// 4. 绑定变量给PreparedStatement */ ParameterMap pmap = sql.getParameterMap(requestScope, params); Object[] parameterObj = pmap.getParameterObjectValues(requestScope, params); if (parameterObj != null && parameterObj.length > 0) { for (int i = 0; i < parameterObj.length; i++) { st.setObject(i + 1, parameterObj[i]); } }
ok,PreparedStatement对象已经准备完毕,可以执行了。
// 5. 执行并设置结果集 */ resultSet = st.executeQuery(); requestScope.setResultSet(resultSet);
数据库返回了resultset,但是我们还需要让ibatis帮我们把结果组装成dto对象。
int resultsFetched = 0; ResultMap resultMap = requestScope.getResultMap(); LinkListRowHandler rh = new LinkListRowHandler(); RowHandlerCallback callback = new RowHandlerCallback(resultMap, null, rh); try { while ((resultsFetched < pageSize) && resultSet.next()) { Object[] columnValues = resultMap.resolveSubMap(requestScope, resultSet).getResults(requestScope, resultSet); callback.handleResultObject(requestScope, columnValues, resultSet); resultsFetched++; } } catch (SQLException e) { log.error("取数据出错", e); } return rh.getList();
ok,大功告成,返回结果就是我们所需要的对像啦。
采用以上jdbc template 与ibatis结合的好处是,可以自己控制查询的过程。
当查询的数据结果比较大时,采用传统的ibatis查询,一般有两种方式:分页和不分页。如果分页,就需要排序,大数量的排序是比较耗时的,这样数据库总是在做重复的工作,增加了数据库的压力。如果不分页,jvm需要缓存大量的对象,占用大量的内存,并且可能导致内存溢出。
而查询工作由我们自己来做的话,我们就可以只做一次查询,并且不需要排序,可以将这个resultset对象缓存起来,每次从resultset中取一批数据,取完之后将这个对象释放掉。这种方法的缺点是,查询结果会在数据库中存在比较长的时间,一段时间内,占用内存无法释放。
相关文章推荐
- awt可视化界面上传数据到mysql,jsp通过jdbc方式查询数据库,并将结果打印在网页上
- Spring-JDBC:在使用JdbcTemplate进行条件查询时没有返回数据,但是sql直接在数据库中执行是有数据返回的。
- 使用hibernate保存blob大数据,ibatis查询blob大数据
- SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中
- java使用jdbc查询mysql数据最简单的例子
- SQL中如何才能将查询的结果数据存在一个变量中???
- C++文本查询程序 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C#如何使用LINQ查询数据(一)
- 使用jpa hql语句查询关联多个表 如何用struts的iterator接受显示数据
- 如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据
- 如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据
- 如何使用沃顿研究数据中心(WRDS,CRSP)查询美股历史交易数据(R语言的调用方法以及代码示例)
- C++文本查询程序 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 使用jdbc更新数据时间时如何屏蔽各种数据库的差异性
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- JSP使用JDBC完成动态验证及采用MVC完成数据查询的方法
- 【转】PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理