今天照着黑马视频练习Spring事务,使用jdbc模板的时候,传参时会报错,希望能告知,拜托
public class AccountDaoIpml extends JdbcDaoSupport implements AccountDao {
@Override
public int outMoney(String outAccount,Double money) {
// TODO Auto-generated method stub
return this.getJdbcTemplate().update("update T_AccountTransfer set FMoney=FMoney-? where FAccount=?",money,outAccount);
}
@Override
public int inMoney(String inAccount,Double money) {
return this.getJdbcTemplate().update("update T_AccountTransfer set FMoney=FMoney+? where FAccount=?",money,inAccount);
}
}
报错信息
org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [update T_AccountTransfer set FMoney=FMoney-? where FAccount=?];
索引 1 超出范围。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围。
如果改为直接执行sql,没有传参就测试通过,这能判断是我传参方式有问题
return this.getJdbcTemplate().update("update T_AccountTransfer set FMoney=FMoney-1000 where FAccount='account1'");
还达不到看源码能力,不能发现这个变量传参有什么问题
@Override
public int update(String sql, Object... args) throws DataAccessException {
return update(sql, newArgPreparedStatementSetter(args));
}
而且和老师的代码一样,为什么他就没错呢
代码:
1、Dao
public class AccountDaoIpml extends JdbcDaoSupport implements AccountDao {
@Override
public int outMoney(String outAccount,Double money) {
// TODO Auto-generated method stub
return this.getJdbcTemplate().update("update T_AccountTransfer set FMoney=FMoney-? where FAccount=?",money,outAccount);
}
@Override
public int inMoney(String inAccount,Double money) {
return this.getJdbcTemplate().update("update T_AccountTransfer set FMoney=FMoney+? where FAccount=?",money,inAccount);
}
}
2、Service
public class AccountServiceIpml implements AccountService{
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
@Override
public void accountTransfer(String outAccount, String inAccount, double money) {
// TODO Auto-generated method stub
accountDao.outMoney(outAccount, money);
accountDao.inMoney(inAccount, money);
}
}
3、test
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TranTest1 {
@Resource(name="accountService")
public AccountService accountService;
@Test
public void demo1() {
accountService.accountTransfer("account1","account2",1000d);
// ApplicationContext applictionContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}