`
Java_Fan
  • 浏览: 81650 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Spring JdbcTemplate实现有java.sql.ResultSet结果集返回的存储过程调用

 
阅读更多

一、调用存储过程

方式一:

/**
	 * 方法功能说明:通过存储过程分页,获取分页信息以及查询记录(装在list中);
	 * 	List.get(0)= hsTable; //存放分页信息(tableName/token/pageNo/pageSize/recordsCount/pagesCount)--hsTable.get(key)
	 * 	List.get(1)= recordsList; //存放分页查询所获的记录--遍历记录(每一条记录是一个map)
	 * 创建:2012-10-16 by hsy 
	 * 修改:日期 by 修改者
	 * 修改内容:
	 * @参数: @param inputXML
	 * @参数: @return    
	 * @return List   
	 * @throws
	 */
	private List getOutputRecords(String inputXML)throws Exception{
		List list = new ArrayList();
		try {
			String[] params = xxm.parseXml4GetPageRecords(inputXML);//{tableName,sqlWhere,orderColumn,orderType,pageSize,pageNo,token};
			final String tableName = params[0];
			final String sqlWhere = params[1];
			final String orderColumn = params[2];
			final String orderType = params[3];
			final int pageSize = Integer.parseInt(params[4]);
			final int pageNo = Integer.parseInt(params[5]);
			final String token = params[6];
			String procedure = "{call prc_query(?,?,?,?,?,?,?,?,?)}"; 
			
			list = (List) this.getJdbcTemplate().execute(procedure,new CallableStatementCallback(){
				public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
					cs.setString(1, tableName);
					cs.setString(2, sqlWhere);
					cs.setString(3, orderColumn);
					cs.setString(4, orderType);
					cs.setInt(5, pageNo);
					cs.setInt(6, pageSize);
					cs.registerOutParameter(5,OracleTypes.INTEGER);//OracleTypes.INTEGER  java.sql.Types.INTEGER
					cs.registerOutParameter(6,OracleTypes.INTEGER);
					cs.registerOutParameter(7,OracleTypes.INTEGER);
					cs.registerOutParameter(8,OracleTypes.INTEGER);
					cs.registerOutParameter(9,OracleTypes.CURSOR);
					cs.execute();
					List newList = new ArrayList();
					Hashtable hsTable = new Hashtable();
					hsTable.put("tableName", tableName);
					hsTable.put("token", token);
					String pageNo = cs.getObject(5).toString();
					hsTable.put("pageNo", pageNo+"");
					String pageSize = cs.getObject(6).toString();
					hsTable.put("pageSize", pageSize+"");
					String recordsCount = cs.getObject(7).toString();
					hsTable.put("recordsCount", recordsCount);
					String pagesCount = cs.getObject(8).toString();
					hsTable.put("pagesCount", pagesCount);
					ResultSet rs = (ResultSet)cs.getObject(9);
					newList.add(hsTable);
					//每循环一次遍历出来1条记录,记录对应的所有列值存放在map中(columnName:columnValue)
					List recordsList = getResultSet(rs);
					newList.add(recordsList);
					return newList;
				}
			});
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

方式二:

/**
	 * 方法功能说明:通过存储过程分页,获取分页信息以及查询记录(装在list中);
	 * 	List.get(0)= hsTable; //存放分页信息(tableName/token/pageNo/pageSize/recordsCount/pagesCount)--hsTable.get(key)
	 * 	List.get(1)= recordsList; //存放分页查询所获的记录--遍历记录(每一条记录是一个map)
	 * 创建:2012-10-16 by hsy 
	 * 修改:日期 by 修改者
	 * 修改内容:
	 * @参数: @param inputXML
	 * @参数: @return    
	 * @return List   
	 * @throws
	 */
	private List getOutputRecords(String inputXML)throws Exception{
		List list = new ArrayList();
		try {
			String[] params = xxm.parseXml4GetPageRecords(inputXML);//{tableName,sqlWhere,orderColumn,orderType,pageSize,pageNo,token};
			final String tableName = params[0];
			final String sqlWhere = params[1];
			final String orderColumn = params[2];
			final String orderType = params[3];
			final int pageSize = Integer.parseInt(params[4]);
			final int pageNo = Integer.parseInt(params[5]);
			final String token = params[6];
			String procedure = "{call prc_query(?,?,?,?,?,?,?,?,?)}"; 
			
			list = (List) this.getJdbcTemplate().execute(new CallableStatementCreator(){
				public CallableStatement createCallableStatement(Connection conn) throws SQLException {
					CallableStatement cs = conn.prepareCall(procedure);
					cs.setString(1, tableName);
					cs.setString(2, sqlWhere);
					cs.setString(3, orderColumn);
					cs.setString(4, orderType);
					cs.setInt(5, pageNo);
					cs.setInt(6, pageSize);
					cs.registerOutParameter(5,OracleTypes.INTEGER);//OracleTypes.INTEGER  java.sql.Types.INTEGER
					cs.registerOutParameter(6,OracleTypes.INTEGER);
					cs.registerOutParameter(7,OracleTypes.INTEGER);
					cs.registerOutParameter(8,OracleTypes.INTEGER);
					cs.registerOutParameter(9,OracleTypes.CURSOR);
					return cs;
				}
			},new CallableStatementCallback(){
				public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
					cs.execute();
					List newList = new ArrayList();
					Hashtable hsTable = new Hashtable();
					hsTable.put("tableName", tableName);
					hsTable.put("token", token);
					String pageNo = cs.getObject(5).toString();
					hsTable.put("pageNo", pageNo+"");
					String pageSize = cs.getObject(6).toString();
					hsTable.put("pageSize", pageSize+"");
					String recordsCount = cs.getObject(7).toString();
					hsTable.put("recordsCount", recordsCount);
					String pagesCount = cs.getObject(8).toString();
					System.out.println("\n");
					hsTable.put("pagesCount", pagesCount);
					ResultSet rs = (ResultSet)cs.getObject(9);
					newList.add(hsTable);
					//每循环一次遍历出来1条记录,记录对应的所有列值存放在map中(columnName:columnValue)
					List recordsList = getResultSet(rs);
					newList.add(recordsList);
					return newList;
				}
			});
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}


二:取结果集方法

/**
	 * 方法功能说明:将分页取出的结果集ResultSet对象组装成 List<--Map<--(columnName:columnValue),
	 * 每一个map对应一条记录,map长度 == column数量
	 * 创建:2012-10-16 by hsy 
	 * 修改:日期 by 修改者
	 * 修改内容:
	 * @参数: @param rs
	 * @参数: @return    
	 * @return Map   
	 * @throws
	 */
	private List getResultSet(ResultSet rs)throws SQLException{
		List list = new ArrayList();
		try {
			ResultSetMetaData rsmd = rs.getMetaData();
			//每循环一次遍历出来1条记录,记录对应的所有列值存放在map中(columnName:columnValue)
			while(rs.next()){
				Map map = new HashMap(); 
				int columnCount = rsmd.getColumnCount();
				for(int i=0;i<columnCount;i++){
					String columnName = rsmd.getColumnName(i+1);
					map.put(columnName, rs.getObject(i+1));
				}
				list.add(map);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}
希望对大家有用!

分享到:
评论

相关推荐

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    我们使用 `CallableStatement` 对象调用存储过程,并使用 `ResultSet` 对象处理结果集。 对于 `P_EMP_SELECT` 存储过程,我们使用 `CallableStatementCallback` 对象调用存储过程,并将结果集处理到 `List` 集合中...

    jdbcTemplate分页彻底解决,使用游标滚动

    例如,可以创建一个存储过程,该过程返回一个可滚动的结果集。然后,`JdbcTemplate`会使用`ResultSetExtractor`接口来处理这个结果集。`SplitPageResultSetExtractor`可能就是这样一个自定义的提取器,用于分割结果...

    Spring JdbcTemplate 常用方法整理

    本文将深入探讨Spring JdbcTemplate的常用方法,并结合提供的`JsonBean.java`和`JdbcUtils.java`文件,来理解其在实际应用中的使用。 首先,JdbcTemplate的核心功能在于它提供了一系列的方法来执行SQL语句,包括...

    Spring 学习 JdbcTemplate,模板模式,回调

    在Spring中,JdbcTemplate就是一个典型的模板类,它实现了数据库操作的基本流程,如创建Connection、PreparedStatement、处理结果集等。用户可以通过扩展或自定义模板方法来实现特定的数据库操作逻辑。 **3. 回调...

    spring jdbctemplate实例

    此外,JdbcTemplate还提供了其他高级功能,如批量操作、分页查询、存储过程调用等。同时,它也支持PreparedStatement,可以防止SQL注入攻击。对于性能要求较高的互联网应用,JdbcTemplate的这些特性使其成为理想的...

    使用JdbcTemplate操作数据库.zip

    在Spring Boot框架中,JdbcTemplate是一个非常重要的组件,它提供了简化数据库操作的API,使得开发者可以更加方便地执行SQL语句。本项目旨在利用JdbcTemplate进行数据库操作,从而实现一些常见的数据库交互功能。 ...

    day4-Spring JdbcTemplate & 声明式事务.md

    ### Spring JdbcTemplate与声明式事务知识点详解 #### JdbcTemplate基本使用概述 JdbcTemplate是Spring框架提供的用于简化JDBC API操作的对象。它通过提供一个高级抽象层来减少编码工作量,并帮助开发者避免处理...

    Sql-Server-2000-JDBC.rar_java sql server

    JDBC提供了一组Java API,主要包括`java.sql.DriverManager`、`java.sql.Connection`、`java.sql.Statement`、`java.sql.ResultSet`等类,它们分别是数据库驱动管理器、数据库连接、SQL语句执行对象和查询结果集。...

    spring自带的jdbcTemplate查询、插入预编译使用

    无论是查询、插入还是调用存储过程,`jdbcTemplate`都能提供简洁且安全的API,使得数据库操作变得更加便捷。在实际开发中,结合自定义的映射器和回调处理器,我们可以构建出高效且灵活的数据库访问层。

    Spring-JdbcTemplate

    - `call`:用于执行存储过程调用。 通过这些方法,开发者可以轻松地进行数据库操作,无需关注底层的资源管理和异常处理,从而提高了开发效率和代码质量。 总之,Spring-JdbcTemplate通过其简洁的API和强大的功能,...

    简单介绍如何使用Spring Boot使用JdbcTemplate与MySQL进行数据库操作

    在本文中,我们将深入探讨如何使用Spring Boot集成JdbcTemplate与MySQL数据库进行数据操作。Spring Boot以其简化配置和快速启动的特点,已经成为Java开发者的首选框架。而JdbcTemplate是Spring框架的一部分,它提供...

    JdbcTemplate.jar

    - **queryForObject()**:执行查询并期望返回单个对象,如果结果集为空或有多个结果,会抛出异常。 - **update()**:用于执行更新、插入、删除等操作,返回受影响的行数。 - **execute()**:可以执行任意的SQL语句,...

    Spring中文帮助文档

    使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...

    JdbcTemplate查询

    `JdbcTemplate`作为Spring JDBC的核心类,主要负责执行SQL语句并处理结果集。通过使用不同的方法,它可以支持各种类型的数据库查询和更新操作。这些方法通常被设计为易于理解和使用,同时提供了良好的错误处理机制。...

    java读取数据库表中内容转存sql文件,然后解析执行此文件

    3. **遍历结果集**:`ResultSet`是迭代器,用于逐行读取查询结果。通过调用`next()`方法移动到下一行,并使用`getString()`, `getInt()`等方法获取列值。 4. **构建SQL文件**:将查询结果转化为INSERT INTO语句,...

    Spirng-JdbcTemplate资料.docx

    对于查询操作,JdbcTemplate提供了query方法,可以接收一个SQL查询语句和一个RowCallbackHandler,后者会在每处理一行结果集时被调用。例如,从数据库中查询ID小于20的所有用户: ```java List&lt;User&gt; users = new ...

    sql_sever_driver_for_java.rar

    此外,了解一些高级特性也很重要,如事务管理、批处理、预编译的SQL语句(提高性能)、游标处理、存储过程调用等。对于大数据量的操作,优化JDBC配置,比如设置合适的连接池,可以显著提升性能。 在实际开发中,你...

Global site tag (gtag.js) - Google Analytics