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

时间:2021-11-10 04:25:54

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


spring配置Oracle数据源

这个是properties文件的内容
jdbc.driverClassName2=oracle.jdbc.driver.OracleDriver
jdbc.url2=jdbc\:oracle\:thin\:@192.168.202.129\:1521\:orcl
jdbc.username2=scott
jdbc.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 stub
						cs.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层,

@Test
	public 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系统里面,请见谅……