Spring进行TestNG测试中无法插入、删除数据库数据(access)的解决

我的Spring项目在Eclipse上使用TestNG进行DAO的测试,也就是增删改查的过程中,发现可以正常从access数据库查询数据,但是无法正常插入和删除数据。console中没有报错,直接进入数据库看,确实没有修改的痕迹。可以正常查询说明JdbcTemplate的操作本身没有问题,但是不能修改数据库。
这是为什么?
遇到这个问题说明自己基础知识差。
我当时的思路是这样的:
可以查询但是不能删除和新增,说明我的sql语句没有提交(commit)。
这种思路源于直接使用java语言特性编写JDBC代码的经验,因为你需要在POJO中手动显式的调用下面的语句

setAutoCommit(false);
commit();

我当时的想法是,我的sql语句没有被手动提交或者自动提交,因此没有生效
这个想法是愚蠢的,因为,你并没有直接写POJO,你使用的是Spring提供的JdbcTemplate,你根本不用担心“提交”这个问题,因为Spring封装的JdbcTemplate让这个问题对你透明了。

然后我觉得,一定和“事务”有关。
很可能是我写的代码,使用了Spring的“事务”,但是事务本身没有被提交。
这样想,就接近了问题的起因了。

我们捋顺一下:
1.access数据库本身是不存在“事务”支持的(不同于Mysql的Innodb引擎)
2.Spring代码的事务支持

我查看自己的Spring配置文件,确实添加了事务管理器,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        classpath:/org/springframework/beans/factory/xml/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        classpath:/org/springframework/context/config/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">     

    <!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
    <context:component-scan base-package="com.infotech.access.dao"/>

    <!-- 配置ucanaccess数据源 -->
    <bean id="dsmysql" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close"
        p:driverClassName="net.ucanaccess.jdbc.UcanaccessDriver"
        p:url="jdbc:ucanaccess://\\\\172.16.30.106\\share\\data_be.mdb"
        p:username="admin"
        p:password="" />

    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        p:dataSource-ref="dsmysql" />

    <!-- 配置JdbcTemplate  -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dsmysql" />

</beans>

我们的Spring配置文件中,配置了一个dbcp管理的access数据库的数据源,而且,为这个数据源配置了JdbcTemplate和事务管理器。

那么我们为什么要进行这种配置呢?

因为我们想使用Spring的JdbcTemplate访问access数据库,那么为什么要配置事务管理器呢?

哈哈,这就是问题的实质了,原因是我们写完代码以后要使用TestNG进行测试。让我们重新看一看测试代码:

package com.infotech.access.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.testng.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;

import com.infotech.access.domain.CheckedList;
import static org.testng.Assert.*;

@ContextConfiguration("classpath*:/ruku-context.xml")
public class CheckedlistDaoTest extends <u>AbstractTransactionalTestNGSpringContextTests</u>{

    private CheckedlistDao cld;

    @Autowired
    public void setCheckedlistDao(CheckedlistDao cldlocal){
        this.cld = cldlocal;
    }

    @Test
    public void testAcess() {

       }

}

上面就是TestNG的测试代码,测试代码中首先导入Spring配置文件ruku-congtext.xml,然后让这个测试类extends AbstractTransactionalTestNGSpringContextTests
也就是让我们的测试类拥有事务。
http://www.iteye.com/problems/100963
这篇博文介绍了TestNG中有关于事务的内容。
继承AbstractTransactionalTestNGSpringContextTests类,test方法中的测试数据不会真的提交数据库,他将在test方法执行完毕后进行回滚。如果你希望控制测试代码的事务提交,可以通过一些annotation来完成。
如下代码:


@Rollback(false)
@Test
    public void testAcess() {

       }

在你的TestNG测试类中将测试方法标注如上所示的annotation,测试事务就提交了,就可以进行数据的插入和删除了哦

时间: 2024-08-27 17:38:58

Spring进行TestNG测试中无法插入、删除数据库数据(access)的解决的相关文章

Excel中轻松查找删除重复数据(Excel 2007)

  由于重复输入或粘贴等原因,Excel 2007工作表往往存在重复的数据或记录.如果工作表的规模比较大,手工查找和删除重复数据很难做到"完全彻底".不过这个问题对Excel 2007来说则是"小菜一碟",下面就为大家介绍Excel中轻松查找删除重复数据 的技巧. 1.标识重复数据 打开工作表,选中可能存在重复数据或记录的区域.单击"开始"选项卡中的"条件格式"打开菜单,在"突出显示单元格规则"子菜单下选择

代码-本地测试中,客户端可以发送数据,但是服务端接收不到数据,具体如下:

问题描述 本地测试中,客户端可以发送数据,但是服务端接收不到数据,具体如下: vs2008,用C++写了一个服务端和一个客户端,本地测试中,客户端可以发送数据,但是服务端接收不到数据. 现在怀疑很可能是内存分配的问题,但是也怀疑是其他问题. 由于代码有点长就不贴上来了,我想请问一下,造成这种情况的可能原因是什么? 解决方案 想要测出原因就要利用好调试工具:可以在百度里搜索"tcp串口调试助手" 1.判断你写的客户端(命名为C)是否存在问题,"tcp串口调试助手"建立

软件-蓝牙数据中被插入了其他数据

问题描述 蓝牙数据中被插入了其他数据 太奇怪了,今天客户反应用我们的软件和智能硬件同步的时候同步失败.我让他发了连接日志. 奇怪的是日志里竟然过出来一些数据,这些数据竟然还是软件的包名 怎么回事 解决方案 批量将数据插入MySQL数据库的PHP代码

Java插入修改删除数据库数据的基本方法_java

Java数据库之插入记录 插入数据表记录有3种方案 一.使用Statement对象 实现插入数据表记录的SQL语句的语法是: insert into 表名(字段名1,字段名2,--)value (字段值1,字段值2,--) 例如:   insert into ksInfo(考号,姓名,成绩,地址,简历)value('200701','张大卫'534,'上海欧阳路218弄4-1202','') 实现同样功能的Java程序代码是: sql = "insert intoksIno(考号,姓名,成绩,地

sql server-用jsp删除数据库数据时数据库无返回。但是如果SQL语句直接写出变量,返回删除成功了。

问题描述 用jsp删除数据库数据时数据库无返回.但是如果SQL语句直接写出变量,返回删除成功了. <% response.setContentType(""text/html""); request.setCharacterEncoding(""GBK""); response.setCharacterEncoding(""GBK""); String name = new Str

Spring集成TestNg测试

1,在eclipse中安装TestNg插件,这里省略.. 2,编写测试spring Dao层的代码 package test.com.smart.dao; import com.smart.dao.UserDao; import com.smart.domain.User; import com.smart.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.

在删除数据库数据后如何刷新Datagridview中的数据(Datagridview与数据库绑定)

问题描述 Datagridview控件与数据源绑定后,再删除数据库中的数据后,如何能够即时显示数据库中的数据? 解决方案 解决方案二:委托,去刷新dgv数据解决方案三:引用1楼chinajiyong的回复: 委托,去刷新dgv数据 或者一般的思路重新绑定

sql server 2008 R2中如何插入多行数据

插入多行数据时,可以不用写N多的insert into. SELECT DISTINCT ' ('+'''' +loginip  +''''+') '+',' FROM dbo.Login WHERE loginname  IN ( SELECT  DISTINCT loginname FROM dbo.Login WHERE loginip='61.170.245.61' ) go --获得这样的结果 ('61.61.245.243'), ('61.61.245.61'), 这样直接 inse

Mysql中查找并删除重复数据的方法

  (一)单个字段 1.查找表中多余的重复记录,根据(question_title)字段来判断  代码如下   select * from questions where question_title in (select question_title from peoplegroup by question_title having count(question_title) > 1) 2.删除表中多余的重复记录,根据(question_title)字段来判断,只留有一个记录  代码如下