Spring jdbcTemplate调用Oracle存储过程返回List集合

合集下载

springjdbctemplate调用存储过程,返回list对象

springjdbctemplate调用存储过程,返回list对象

springjdbctemplate调⽤存储过程,返回list对象注:本⽂来源于《》spring jdbctemplate调⽤存储过程,返回list对象⽅法:/*** 调⽤存储过程* @param spName*/@SuppressWarnings("unchecked")public List<HashMap<String, Object>> executeSP(String procedure) {//procedure = "{call WCITY2_STATISTIC.sp_uservisit_stat(?)}";return (List<HashMap<String, Object>>) jdbcTemplate.execute(procedure,new CallableStatementCallback() {public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();cs.registerOutParameter(1, OracleTypes.CURSOR);cs.execute();ResultSet rs = (ResultSet) cs.getObject(1);while (rs.next()) {HashMap<String, Object> dataMap = new HashMap<String, Object>();ResultSetMetaData rsMataData = rs.getMetaData();for (int i = 1; i <= rsMataData.getColumnCount(); i++) {dataMap.put(rsMataData.getColumnName(i), rs.getString(rsMataData.getColumnName(i)));}list.add(dataMap);}return list;}});}存储过程:replace package WCITY2_STATISTIC-- Author : ADMINISTRATOR-- Created : 2012/10/24 9:48:34-- Purpose :type Ref_Cursor ref ;--sp_pager_stats;--访问信息sp_uservisit_stat(c_uservisit out Ref_Cursor);WCITY2_STATISTIC;replace package body WCITY2_STATISTIC--页⾯信息sp_pager_stats-- cur_page as select * from OMS_WIRELESS. TEMPLATE_FILE_WORKING;;sp_pager_stats;--访问信息sp_uservisit_stat(c_uservisit out Ref_Cursor)--定义游标/*cursor c_uservisit isselect t.city,ername,ername as telphone,'' as ipfrom INTERFACE_ER_LOGIN_LOG t ;*/c_uservisitt.city, ername, ername telphone, '' ipINTERFACE_ER_LOGIN_LOG t;;WCITY2_STATISTIC;调⽤⽅法:@SuppressWarnings("rawtypes")String getUserVisitStat(){//List lst=jdbcService.executeSP("");String = "{call WCITY2_STATISTIC.sp_uservisit_stat(?)}";List lst=spService.executeSP();(lst!=){System.out.println(lst.());}SUCCESS;}⾃⼰编写的代码import java..CallableStatement;import java..ResultSet;import java..ResultSetMetaData;import java..SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.CallableStatementCallback;import org.springframework.jdbc.core.JdbcTemplate;import com.tt.pwp.framework.data.dao.DaoFactory;import oracle.jdbc.OracleTypes;class FuncReportTaskService {protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowiredprivate DaoFactory daoFactory;/*** 调⽤存储过程* @param spName*/@SuppressWarnings("unchecked")List<HashMap<String, Object>> executeSP(String ) {JdbcTemplate jdbcTemplate = daoFactory.getDao().getJdbcTemplate(); // = "{call WCITY2_STATISTIC.sp_uservisit_stat(?)}";(List<HashMap<String, Object>>) jdbcTemplate.(,new CallableStatementCallback() {Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); cs.registerOutParameter(1, OracleTypes.);cs.();ResultSet rs = (ResultSet) cs.getObject(1);(rs.()) {HashMap<String, Object> dataMap = new HashMap<String, Object>();ResultSetMetaData rsMataData = rs.getMetaData();( i = 1; i <= rsMataData.getColumnCount(); i++) {dataMap.put(rsMataData.getColumnName(i), rs.getString(rsMataData.getColumnName(i)));}list.(dataMap);}list;}});}}。

jdbctemplate queryforlist 参数 -回复

jdbctemplate queryforlist 参数 -回复

jdbctemplate queryforlist 参数-回复JdbcTemplate是Spring Framework中的一个重要组件,用于简化Java 应用程序与数据库之间的交互。

queryForList方法是JdbcTemplate的一个查询方法,用于执行一个SQL语句并返回结果集合。

在这篇文章中,我们将一步一步地回答关于queryForList方法的参数问题。

1. JdbcTemplate是什么?JdbcTemplate是Spring Framework中的一个核心类,封装了对数据库的常见操作,如查询、插入、更新、删除等。

它简化了与数据库的交互,提供了一种更简单、更灵活的方式来访问数据库。

2. queryForList方法是用来做什么的?queryForList方法用于执行一个查询SQL语句,并返回结果集合。

该方法将查询结果封装为一个List对象,每一行的数据都被封装为一个Map 对象。

这个Map对象中的key是列名,value是对应的数据值。

3. queryForList方法的参数有哪些?queryForList方法有两个重载版本,其中一个版本有两个参数,另一个版本有三个参数。

我们首先来看一下有两个参数的版本。

- SQL语句:第一个参数是要执行的SQL语句。

这个SQL语句可以包含占位符,JdbcTemplate会根据给定的参数值替换占位符。

- 参数列表:第二个参数是一个可变参数,用于替换SQL语句中的占位符。

如果SQL语句包含多个占位符,那么参数列表中的参数值必须按照占位符的顺序进行传递。

下面是一个示例代码:javaString sql = "SELECT name, age FROM users WHERE gender = ?"; List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, "female");接下来,我们来看一下有三个参数的版本。

Java调用Oracle存储过程返回结果集

Java调用Oracle存储过程返回结果集

Java调⽤Oracle存储过程返回结果集CREATE OR REPLACE PACKAGE typesASTYPE ref_cursor IS REF CURSOR;END;/CREATE TABLE STOCK_PRICES(RIC VARCHAR(6) PRIMARY KEY,PRICE NUMBER(7,2),UPDATED DATE );/CREATE OR REPLACE FUNCTION sp_get_stocks(v_price IN NUMBER)RETURN types.ref_cursorASstock_cursor types.ref_cursor;BEGINOPEN stock_cursor FORSELECT ric,price,updated FROM stock_prices WHERE price < v_price;RETURN stock_cursor;END;2. ⽤ sqlplus 测试过程SQL> var results refcursorSQL> exec :results := sp_get_stocks(20.0)SQL> print results3. 从 Java 调⽤import java.sql.*;import java.io.*;import oracle.jdbc.driver.*;public class JDBCDemo {/*** Compile-time flag for deciding which query to use*/private boolean useOracleQuery = true;/*** Class name of Oracle JDBC driver*/private String driver = "oracle.jdbc.driver.OracleDriver";/*** Initial url fragment*/private String url = "jdbc:oracle:thin:@";/*** Standard Oracle listener port*/private String port = "1521";/*** Oracle style of calling a stored procedure*/private String oracleQuery = "begin ? := sp_get_stocks(?); end;";/*** JDBC style of calling a stored procedure*/private String genericQuery = "{ call ? := sp_get_stocks(?) }";/*** Connection to database*/private Connection conn = null;/*** Constructor. Loads the JDBC driver and establishes a connection** @param host the host the db is on* @param db the database name* @param user user's name* @param password user's password*/public JDBCDemo(String host, String db, String user, String password) throws ClassNotFoundException, SQLException {// construct the urlurl = url + host + ":" + port + ":" + db;// load the Oracle driver and establish a connectiontry {Class.forName(driver);conn = DriverManager.getConnection(url, user, password);}catch (ClassNotFoundException ex) {System.out.println("Failed to find driver class: " + driver);throw ex;}catch (SQLException ex) {System.out.println("Failed to establish a connection to: " + url);throw ex;}}/*** Execute the stored procedure** @param price price parameter for stored procedure*/private void execute(float price)throws SQLException {String query = useOracleQuery ? oracleQuery : genericQuery;System.out.println("Query: " + query + "n");CallableStatement stmt = conn.prepareCall(query);// register the type of the out param - an Oracle specific typestmt.registerOutParameter(1, OracleTypes.CURSOR);// set the in paramstmt.setFloat(2, price);// execute and retrieve the result setstmt.execute();ResultSet rs = (ResultSet)stmt.getObject(1);// print the resultswhile (rs.next()) {System.out.println(rs.getString(1) + "t" +rs.getFloat(2) + "t" +rs.getDate(3).toString());}rs.close();stmt.close();}/*** Cleanup the connection*/private void cleanup() throws SQLException {if (conn != null)conn.close();}/*** Prints usage statement on stdout*/static private void usage() {System.out.println("java com.enterprisedt.demo.oracle.JDBCDemo " + " host db user password price");}/*** Runs the class*/public static void main(String[] args) throws Exception {if (args.length != 5) {age();System.exit(1);}else {try {// assign the args to sensible variables for clarityString host = args[0];String db = args[1];String user = args[2];String password = args[3];float price = Float.valueOf(args[4]).floatValue();// and execute the stored procJDBCDemo jdbc = new JDBCDemo(host, db, user, password); jdbc.execute(price);jdbc.cleanup();}catch (ClassNotFoundException ex) {System.out.println("Demo failed");}catch (SQLException ex) {System.out.println("Demo failed: " + ex.getMessage());}}}}。

用java调用oracle存储过程总结3-返回列表-偶爱老婆-搜狐博客

用java调用oracle存储过程总结3-返回列表-偶爱老婆-搜狐博客

用java调用oracle存储过程总结3-返回列表-偶爱老婆-搜狐博客三:返回列表由于oracle存储过程没有返回值,它的所有返回值都是通过out 参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1,建一个程序包。

如下:CREATE OR REPLACE PACKAGE TESTPACKAGE ASTYPE Test_CURSOR IS REF CURSOR;end TESTPACKAGE;2,建立存储过程,存储过程为:CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.T est_CURSOR) ISBEGINOPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;END TESTC;可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

在java里调用时就用下面的代码:package com.hyq.src;import java.sql.*;import java.io.OutputStream;import java.io.Writer;import java.sql.PreparedStatement;import java.sql.ResultSet;import oracle.jdbc.driver.*;public class TestProcedureTHREE {public TestProcedureTHREE() {}public static void main(String[] args ){String driver = "oracle.jdbc.driver.OracleDriver";String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";Statement stmt = null;ResultSet rs = null;Connection conn = null;try {Class.forName(driver);conn = DriverManager.getConnection(strUrl, "hyq", "hyq");CallableStatement proc = null;proc = conn.prepareCall("{ call hyq.testc(?) }");proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURS OR);proc.execute();rs = (ResultSet)proc.getObject(1);while(rs.next()){System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");}}catch (SQLException ex2) {ex2.printStackTrace();}catch (Exception ex2) {ex2.printStackTrace();}finally{try {if(rs != null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch (SQLException ex1) { }}}}。

jdbctemplate返回对象集合

jdbctemplate返回对象集合

jdbctemplate返回对象集合JdbcTemplate是Spring Framework提供的一种 JDBC 抽象框架,它可以大量简化JDBC应用程序的开发过程。

其中包括了大量的面向对象手段,极大的提高了安全性和可维护性。

JdbcTemplate具有JDBC操作中的所有功能,包括基本的CRUD操作,批处理,对象映射等。

在JdbcTemplate 中,我们通常使用三个主要接口:JdbcOperations,PreparedStatementSetter和ResultSetExtractor。

它们用来处理不同的DML操作,例如查询、插入、更新和删除。

在JdbcTemplate的操作之中,有时我们需要返回一批对象集合,例如一张表的所有数据,或者是根据某些搜索条件返回的一些对象列表。

JdbcTemplate提供了一种便捷的方式来实现这个功能,这就是返回对象集合。

本文将介绍JdbcTemplate如何返回对象集合,以及如何使用这个功能来提高我们应用程序的效率。

1.查询操作一般情况下,我们在使用JdbcTemplate进行查询操作时,都是返回一个ResultSet结果集,然后通过循环遍历结果集得到每行数据。

这种操作方式虽然能够满足我们的需求,但是在数据量比较大的情况下,效率较低。

因此,使用JdbcTemplate返回对象集合是一种非常好的选择。

首先,我们需要先定义一个对象,它代表了表中的一行数据:``` public class User { private int id; private String name; private String gender; private String email; // getter and setter }```然后,我们需要定义一个接口,用来映射数据库中的表和我们定义的对象:``` public interface UserDao { List<User> findByGender(String gender); } ```在实现Dao接口时,我们可以使用JdbcTemplate进行操作数据库,从而返回一个包含所有符合条件的User对象集合。

jdbctemplate调用存储过程返回多行

jdbctemplate调用存储过程返回多行

jdbctemplate调用存储过程返回多行在Spring 的JdbcTemplate 中,如果要调用存储过程并返回多行结果,可以使用`query` 方法,并通过`RowMapper` 将每行结果映射到相应的对象。

下面是一个简单的示例:假设有一个存储过程,接收输入参数,并返回多行结果:```sqlCREATE PROCEDURE getEmployees(IN departmentId INT)BEGINSELECT * FROM employees WHERE department_id = departmentId;END;```然后,你可以使用JdbcTemplate 来调用这个存储过程:```javaimport org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;@Repositorypublic class EmployeeRepository {private final JdbcTemplate jdbcTemplate;public EmployeeRepository(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public List<Employee> getEmployeesByDepartment(int departmentId) {String sql = "CALL getEmployees(?)";// 使用query 方法调用存储过程,通过RowMapper 映射结果到Employee 对象return jdbcTemplate.query(sql, new Object[]{departmentId}, new EmployeeRowMapper());}private static class EmployeeRowMapper implements RowMapper<Employee> {@Overridepublic Employee mapRow(ResultSet resultSet, int i) throws SQLException {// 将查询结果映射到Employee 对象Employee employee = new Employee();employee.setId(resultSet.getInt("id"));employee.setName(resultSet.getString("name"));// 其他属性的映射...return employee;}}}```在上述示例中,`EmployeeRepository` 类通过`jdbcTemplate.query` 方法调用存储过程,并使用`EmployeeRowMapper` 将查询结果映射到`Employee` 对象。

Spring jdbcTemplate调用Oracle存储过程返回List集合

Spring jdbcTemplate调用Oracle存储过程返回List集合

jdbcTemplate调用Oracle存储过程返回List集合作者:xyzc(cr10210206@)1.编写存储过程-- 模糊查询返回多条数据CREATE OR REPLACE PROCEDURE P_EMP_SELECT(RESULTLIST OUT SYS_REFCURSOR,V_ID IN NUMBER,V_NAME IN VARCHAR2)ISSQL_STR VARCHAR2(500);BEGINSQL_STR:='SELECT * FROM EMP WHERE 1=1 ';DBMS_OUTPUT.put_line('V_ID='||V_ID ||' V_NAME='||V_NAME);IF(V_ID<>0)THENBEGINSQL_STR:=SQL_STR ||' AND EMPNO>= '|| V_ID;END;END IF;IF(V_NAME IS NOT NULL)THEN-- 判断字符串是否为空BEGINSQL_STR:=SQL_STR ||' AND ENAME LIKE '''||V_NAME ||'%'' ';-- 字符串是四个单引号 ''A%'' END;END IF;DBMS_OUTPUT.put_line(' SQL_STR:'||SQL_STR);-- 输出SQL语句OPEN RESULTLIST FOR SQL_STR;END;-- 测试DECLAREMYCRS SYS_REFCURSOR;-- 注意这里用分号;V_EMP EMP%ROWTYPE;BEGIN-- 调用过程,返回的是已经打开的CURSORP_EMP_SELECT(MYCRS,7900,'');LOOPFETCH MYCRS INTO V_EMP;EXIT WHEN MYCRS%NOTFOUND;DBMS_OUTPUT.put_line(V_EMP.EMPNO||' '||V_EMP.ENAME);END LOOP;CLOSE MYCRS;END;2.编写Java代码package com.zc.test;import java.sql.CallableStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import oracle.jdbc.driver.OracleTypes;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.JdbcTemplate;/*** 测试Oracle存储过程* */public class TestOraclePro {private static JdbcTemplate jdbcTemplate= TestDao.getJdbcTemplateOracle();/*** 测试* */public static void main(String[] args) {TestOraclePro test = new TestOraclePro();List<HashMap<String, Object>> result = test.testPro();System.out.println("\nresult:\n" + result);/*** 返回的结果:** [{DEPTNO=20, COMM=null, HIREDATE=1980-12-17 00:00:00.0, MGR=7902, SAL=800, JOB=CLERK, ENAME=SMITH, EMPNO=7369},* {DEPTNO=30, COMM=300, HIREDATE=1981-02-20 00:00:00.0, MGR=7698, SAL=1600, JOB=SALESMAN, ENAME=ALLEN, EMPNO=7499}, * {DEPTNO=30, COMM=500, HIREDATE=1981-02-22 00:00:00.0, MGR=7698, SAL=1250, JOB=SALESMAN, ENAME=WARD, EMPNO=7521},* {DEPTNO=20, COMM=null, HIREDATE=1981-04-02 00:00:00.0,MGR=7839, SAL=2975, JOB=MANAGER, ENAME=JONES, EMPNO=7566},* {DEPTNO=30, COMM=1400, HIREDATE=1981-09-28 00:00:00.0, MGR=7698, SAL=1250, JOB=SALESMAN, ENAME=MARTIN, EMPNO=7654}, * {DEPTNO=30, COMM=null, HIREDATE=1981-05-01 00:00:00.0, MGR=7839, SAL=2850, JOB=MANAGER, ENAME=BLAKE, EMPNO=7698},* {DEPTNO=10, COMM=null, HIREDATE=1981-06-09 00:00:00.0, MGR=7839, SAL=2450, JOB=MANAGER, ENAME=CLARK, EMPNO=7782},* {DEPTNO=20, COMM=null, HIREDATE=1987-04-19 00:00:00.0, MGR=7566, SAL=3000, JOB=ANALYST, ENAME=SCOTT, EMPNO=7788},* {DEPTNO=10, COMM=null, HIREDATE=1981-11-17 00:00:00.0, MGR=null, SAL=5000, JOB=PRESIDENT, ENAME=KING, EMPNO=7839}, * {DEPTNO=30, COMM=0, HIREDATE=1981-09-08 00:00:00.0, MGR=7698, SAL=1500, JOB=SALESMAN, ENAME=TURNER, EMPNO=7844}, * {DEPTNO=20, COMM=null, HIREDATE=1987-05-23 00:00:00.0, MGR=7788, SAL=1100, JOB=CLERK, ENAME=ADAMS, EMPNO=7876},* {DEPTNO=30, COMM=null, HIREDATE=1981-12-03 00:00:00.0, MGR=7698, SAL=950, JOB=CLERK, ENAME=JAMES, EMPNO=7900},* {DEPTNO=20, COMM=null, HIREDATE=1981-12-03 00:00:00.0, MGR=7566, SAL=3000, JOB=ANALYST, ENAME=FORD, EMPNO=7902},* {DEPTNO=10, COMM=null, HIREDATE=1982-01-23 00:00:00.0, MGR=7782, SAL=1300, JOB=CLERK, ENAME=MILLER, EMPNO=7934}]* */}/*** 调用存储过程返回 List<HashMap<String, Object>>* */@SuppressWarnings({ "unchecked", "rawtypes" })public List<HashMap<String, Object>> testPro(){final String sql = "{call P_EMP_SELECT(?,?,?)}";List<HashMap<String, Object>> result = (List<HashMap<String, Object>>) jdbcTemplate.execute(sql,new CallableStatementCallback(){ public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();cs.registerOutParameter(1, OracleTypes.CURSOR); //输出参数:游标cs.setInt(2, 2000);//输入参数cs.setString(3, "");//输入参数cs.execute();//执行ResultSet rs = null;try {rs = (ResultSet) cs.getObject(1);//获取结果集while (rs.next()) {HashMap<String, Object> dataMap = new HashMap<String, Object>();ResultSetMetaData rsMataData = rs.getMetaData();for(int i = 1; i <= rsMataData.getColumnCount(); i++) {dataMap.put(rsMataData.getColumnName(i),rs.getString(rsMataData.getColumnName(i)));}list.add(dataMap);}} catch (Exception e) {e.printStackTrace();}finally{if(rs != null){rs.close();}}return list;}});return result;}}。

jdbctemplate调用返游标的存储过程

jdbctemplate调用返游标的存储过程

JdbcTemplate是Spring框架中用于简化数据库操作的一个工具类,通过JdbcTemplate可以方便地进行数据库操作,包括执行SQL语句、调用存储过程等。

在实际应用中,经常需要调用返回游标的存储过程,本文将详细介绍如何使用JdbcTemplate来调用返回游标的存储过程。

存储过程是在数据库中预先编译好的一组SQL语句,通过存储过程可以方便地实现复杂的业务逻辑。

有些存储过程会返回游标,用于返回查询结果集。

在使用JdbcTemplate调用返回游标的存储过程时,需要注意以下几点:1. 编写存储过程需要在数据库中编写一个返回游标的存储过程。

存储过程的语法和数据库的类型有关,这里以Oracle数据库为例,假设有一个名为“get_users”的存储过程,用于返回用户表中的所有用户信息。

```CREATE OR REPLACE PROCEDURE get_users (p_cursor OUTSYS_REFCURSOR) ASBEGINOPEN p_cursor FORSELECT * FROM users;END;```在这个存储过程中,定义了一个输出参数p_cursor,用于返回游标。

游标的类型为SYS_REFCURSOR,可以用于返回查询结果集。

2. 定义JdbcTemplate bean在Spring的配置文件中,需要定义一个JdbcTemplate的bean,并配置数据源等信息。

```<bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>```这里假设数据源的名称为dataSource,需要在配置文件中定义数据源的相关信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档