本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9717793
建立时间:2004年12月20日




[java语言]spring如何使用sqlserver存储过程
原创空间,  软件技术

邢红瑞 发表于 2006/4/2 11:31:11

这个问题有人问了很久,StoredProcedure instances是线程安全的,一次初始化,可以多次重用。发个sqlserver的例子java代码import org.springframework.jdbc.core.support.JdbcDaoSupport;import org.springframework.jdbc.core.CallableStatementCallback;import org.springframework.dao.DataAccessException;import org.springframework.core.CollectionFactory;import java.util.List;import java.util.Map;import java.util.ArrayList;import java.util.Collection;import java.sql.*; public class EbookProcedureDaoJdbc extends JdbcDaoSupport {    private String procedureName;     public List getSqlvalues() {        return sqlvalues;    }     public void setSqlvalues(List sqlvalues) {        this.sqlvalues = sqlvalues;    }     private List sqlvalues;     public String getProcedureName() {        return procedureName;    }     public void setProcedureName(String procedureName) {        this.procedureName = procedureName;    }     public List execute() {        final ArrayList list = new ArrayList();        Object o = getJdbcTemplate().execute(genSqlStrig(), new CallableStatementCallback() {            public Object doInCallableStatement(CallableStatement arg0) throws SQLException, DataAccessException {                arg0.registerOutParameter(1, Types.INTEGER);                for (int i = 0; i < sqlvalues.size(); i++) {                    arg0.setObject(i + 2, sqlvalues.get(i));                }                ResultSet rs = arg0.executeQuery();                ListResultSetExtractor ls = new ListResultSetExtractor();                list.addAll((Collection) ls.extractData(rs));                return null;            }         });        return list;    }     private String genSqlStrig() {        StringBuffer sb = new StringBuffer();        sb.append("{?= call ");        sb.append(procedureName);        sb.append("( ");        if (sqlvalues != null && sqlvalues.size() > 0) {            for (int i = 0; i < sqlvalues.size(); i++) {                if (i == sqlvalues.size() - 1) {                    sb.append("?");                } else {                    sb.append("?");                }            }         }        sb.append(")}");        return sb.toString();    }     private static class ListResultSetExtractor  {         public Object extractData(ResultSet rs) throws SQLException {            List listOfRows = new ArrayList();            ResultSetMetaData rsmd = null;            int numberOfColumns = -1;            while (rs.next()) {                if (rsmd == null) {                    rsmd = rs.getMetaData();                    numberOfColumns = rsmd.getColumnCount();                }                Map mapOfColValues = CollectionFactory.createLinkedMapIfPossible(numberOfColumns);                for (int i = 1; i <= numberOfColumns; i++) {                    switch (rsmd.getColumnType(i)) {                        case java.sql.Types.TIMESTAMP:                            mapOfColValues.put(rsmd.getColumnName(i), rs.getTimestamp(i));                            break;                        default:                            mapOfColValues.put(rsmd.getColumnName(i), rs.getObject(i));                    }                }                listOfRows.add(mapOfColValues);            }            return listOfRows;        }    }}配置文件<bean id="EbookProcedureDaoJdbc" class="com.ebook.dao.jdbc.EbookProcedureDaoJdbc" >        <property name="dataSource">            <ref local="dataSource1"/>        </property>        <property name="procedureName">        <value>getzhongtubook</value>        </property>    </bean>传入的存储过程的名字,返回一个list。测试用例import junit.framework.TestCase;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.ebook.dao.jdbc.EbookProcedureDaoJdbc; import java.util.ArrayList;import java.util.List;import java.util.Iterator;import java.util.Map;import java.sql.ResultSet; public class testDAO extends TestCase {    private ApplicationContext context;     protected void setUp() throws Exception {       context = new ClassPathXmlApplicationContext("test.xml");    }     public void testProcedureDAO()    {      EbookProcedureDaoJdbc epd=(EbookProcedureDaoJdbc) context.getBean("EbookProcedureDaoJdbc");      ArrayList ls=new ArrayList();        List ls1=new ArrayList();        ls.add("%001");        epd.setSqlvalues(ls);        ls1=epd.execute();        Iterator it=ls1.iterator();        while(it.hasNext())        {          Map map=(Map) it.next();            System.out.println(map.get("bkname"));        }    }} 使用jdbctemplate可以使用Stored procedures,有以下几种情况: 用 PreparedStatement使用RowMapper, ResultSetHandler, RowCallbackHandler得到list,唯一缺点只能返回一个result set,而且不能使用output parameters,这不是spring的问题,是PreparedStatement的限制。 例子 final String sql = "{ call UpdateStoredProcedure(?, ?, ?) }"; JdbcTemplate.update(sql, new Object[] { new Integer(5), "a", new Double(7.0) }); 使用CallableStatements,例如 call(CallableStatementCreator csc, List declaredParameters),使用CallableStatementCreator创建CallableStatement,declaredParameters可以用 input/output参数。 StoredProcedure可以得到多个 resultsets,并且重新排列output parameters。 oracle的例子看我以前的blog。


阅读全文(10663) | 回复(2) | 编辑 | 精华
 


回复:spring如何使用sqlserver存储过程
原创空间,  软件技术

邢红瑞发表评论于2006/7/11 17:47:45

这是我原创的


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:spring如何使用sqlserver存储过程
原创空间,  软件技术

帅哥(游客)发表评论于2006/5/16 0:03:55

使用spring 的mvc方式,在点击ie的后退按钮时,为什么会看不到以前浏览过的内容,求助啊

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.078 second(s), page refreshed 144799311 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号