由于项目里需要装excel里的数据导入到数据库中,本来一开始直接打算有jdbc来做的。直接生成insert语句的,但在后来发现有些字段实在太大了。而数据库中我将字段设置为nvarchar(2000)或varchar(4000)就不可以再增大了。用的是oracle数据库,不知道是什么原因,可能是甲公司出于性能方面的考虑吧!如果将字段改为bolb这样的话,sql又不知道如何写,哎...所以最后都系改为用hibernate算了,因为用这个我知道如何保存blob.
用反射将每一行的数据保存至javabean里,然后就对javabean进行save操作,问题又出现了。因为excel表里,有些字段可以保存到数据库里,有些因为数据库字段长度的原因,保存时出错,因为excel里那个字段的长度估计有5-6K个字左右。唯有改成用blob这个了。问题是,因为前面的有些数据已经成功导入到数据库了。如果再重新导入的话就会变左有重复的数据了。hibernate报错只是将出错的那一条没有保存到数据库里,其它的都保存了。于是想如何才能确保如果有一条出错就全部不保存呢,第一时间想到的就是用事务了。但又不知如何做,上网搜也没有搜到比较满意的答案。于是就看了看spring技术手册。再测试一下,实现到我想要的效果了。为了不让自己忘记,将步骤写在这里,如果你有更好的办法,不妨话我知,我相信一定有的,只不过是我的理解能力差就知道这样可以实现我的要求罢了。
spring applictionContext.xml
<!--设置dataSource--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/mywebspace?useUnicode=true&characterEncoding=utf8"></property> <property name="username" value="root"></property> <property name="password" value="790731"></property> </bean> <!--设置jdbcTemplate操作模板,用构造注入方式注入dataSource--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg> <ref bean="dataSource" /> </constructor-arg> </bean> <!-- 设置Hibernate对Lob的支持,lazy-int:延迟加载 如果是oracle9i要改为org.springframework.jdbc.support.lob.OralceLobHandler --> <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" /> <!-- 设置SessionFactory,注入dataSource,lobHandler, 其中 mappingDirectoryLocations:是设置一次性指定在某个路径下的所有.hbm.xml文件 hibernate.dialect: 是表示将使用哪一种数据库产生SQL语句进行搞作 hibernate.show_sql: 在后台打开Hibernate产生的SQL语句 --> <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" > <property name="dataSource" ref="dataSource"></property> <property name="lobHandler" ref="lobHandler"></property> <property name="mappingDirectoryLocations"> <list> <value>/WEB-INF/classes/com/mywebspace/bo</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> <!-- 指定数据库方言 --> <!-- MSSQL2000 --> <!-- org.hibernate.dialect.SQLServerDialect --> <!-- MYSQL --> org.hibernate.dialect.MySQLDialect <!-- ORACLE --> <!-- org.hibernate.dialect.OracleDialect --> </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.jdbc.use_scrollable_resultset">false</prop> <prop key="hibernate.use_outer_join">true</prop> <prop key="hibernate.jdbc.fetch_size">100</prop> <prop key="hibernate.jdbc.batch_size">20</prop> <prop key="hibernate.c3p0.min_size">20</prop> <prop key="hibernate.c3p0.maxPoolSize">80</prop> <prop key="hibernate.c3p0.max_statements">50</prop> <prop key="hibernate.c3p0.timeout">1500</prop> <!-- 查询语句里有中文时会出错乱码,解决方法加以下这行代码! --> <prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop> </props> </property> </bean> <!-- Hibernate事务,注入SessionFactory --> <bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="mySessionFactory" /> </property> </bean> <!-- 事务处理的AOP配置(代理) 将Hibernate事务类注入,同时指定事务策略 transactionAttributes:指定事务策略 abstract="true" :设置为抽象类,启动时不实例化 --> <bean id="myProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref local="myTransactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="init*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="convert*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean>