练习Spring事务管理,使用jdbc模板的时候,传参提示索引超出

今天照着黑马视频练习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");
    }
}

1个回答

Humman_an
拾慧 谢谢你,不过他这里 String sql = "update stock set number=number+? where stockName=? and userName=?"; this.getJdbcTemplate().update(sql,count,stockName,username); 也是这么写的,我只是不明白为什么我的一直索引超出,已暂时跳过这一段在学习后面的,或许后面有惊喜能明白
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐