spring 中使用jdbctemplate调用Oracle的存储过程

来源:互联网 发布:jhene aiko 知乎 编辑:程序博客网 时间:2024/04/29 16:51

RT,如果你的懂得编写Oracle的存储过程那就更好懂了,下面直接上代码


spring配置Oracle数据源

这个是properties文件的内容
jdbc.driverClassName2=oracle.jdbc.driver.OracleDriverjdbc.url2=jdbc\:oracle\:thin\:@192.168.202.129\:1521\:orcljdbc.username2=scottjdbc.password2=tiger<bean id="dataSource" destroy-method="close"class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${jdbc.driverClassName2}" /><property name="url" value="${jdbc.url2}" /><property name="username" value="${jdbc.username2}" /><property name="password" value="${jdbc.password2}" /></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource" /></bean><bean id="baseDao" class="com.will.userDao.BaseDao" abstract="true"><property name="jdbcTemplate" ref="jdbcTemplate" /></bean><bean id="userDao" class="com.will.userDao.UserDao" parent="baseDao" /></beans>

先写个BaseDao的抽象类,然后直接继承这个抽象类就可以使用通用的方法了

public abstract class BaseDao {private JdbcTemplate jdbcTemplate;public JdbcTemplate getJdbcTemplate() {return jdbcTemplate;}public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}}


继承这个抽象类使用jdbctemplate,这里有点不好的就是要对结果集映射实体,暂时不知有什么方法能像实现RowMapper的映射类写一次就能重复调用,知道的麻烦告诉我一下,先谢啦……

public class UserDaoImpl extends BaseDao{@SuppressWarnings("unchecked")public List<Emp> testProcedure2(String sql) {List<Emp> list = (List<Emp>) this.jdbcTemplate.execute(sql,new CallableStatementCallback() {public Object doInCallableStatement(CallableStatement cs)throws SQLException, DataAccessException {List<Emp> emps = new ArrayList<Emp>();// TODO Auto-generated method stubcs.setInt(1, 10);cs.registerOutParameter(2, OracleTypes.CURSOR);cs.execute();ResultSet rs = (ResultSet) cs.getObject(2);while (rs.next()) {Emp emp = new Emp();emp.setEmpno(rs.getInt("empno"));emp.setEname(rs.getString("ename"));emp.setJob(rs.getString("job"));emp.setMgr(rs.getInt("mgr"));emp.setHiredate(rs.getDate("hiredate"));emp.setSal(rs.getInt("sal"));emp.setComm(rs.getInt("comm"));emp.setDeptno(rs.getInt("deptno"));emps.add(emp);}return emps;}});return list;}


用junit测试是否调用成功,之间有通过server层再到dao层,

@Testpublic void testJTProcedure() {String sql = "{call sp_pro15(?,?)}";List<Emp> list = this.um.testProcedure2(sql);for (Emp emp : list) {System.out.println(emp.getEmpno() + " --- " + emp.getEname()+ " --- " + emp.getHiredate());}}

结果:

能成功的,我就不显示了,因为Oracle装置虚拟机里的Linux系统里面,请见谅……






原创粉丝点击