由于项目里需要装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>