文章分为2大部分,第1部分谈Spring对ibatis的整合,第2部分谈谈Spring事务管理,第一部分成功实现了,第二部分在实现的时候出现了问题,希望各位高手能多多指点。
一 spring整合ibatis
1 创建ibatis功能类
由于ibatis是基于半自动ORM框架的,对于每个DAO都需要手动编写功能类和xml配置文件,写起来是很费事的。所以,我们选用ibatis的代码自动生成器去生成具体的功能类。
下面是用代码自动生成器生成的功能类:
abatorConfig.xml文件,这个配置文件是ibatis的代码自动生成器需要配置的文件。
Java代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE abatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN" "http://ibatis.apache.org/dtd/abator-config_1_0.dtd" >
<abatorConfiguration >
<abatorContext >
<jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver" connectionURL="jdbc:sqlserver://localhost:1433;databaseName=mydb" userId="sa" password="841026" >
<classPathEntry location="F:/Program Files/workspace/SpringTranslateDemo/driver/sqljdbc.jar" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.whpu.computershop.ibatis.pojo" targetProject="SpringTranslateDemo" />
<sqlMapGenerator targetPackage="com.whpu.upanddown.ibatis.config" targetProject="SpringTranslateDemo" />
<daoGenerator targetPackage="com.whpu.upanddown.ibatis.dao" targetProject="SpringTranslateDemo" type="GENERIC-CI" />
<table schema="dbo" tableName="student" >
</table>
</abatorContext>
</abatorConfiguration>
自动生成的pojo:
package com.whpu.computershop.ibatis.pojo;
Java代码
public class Student {
/**
* This field was generated by Abator for iBATIS.
* This field corresponds to the database column dbo.student.stuid
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
private Integer stuid;
/**
* This field was generated by Abator for iBATIS.
* This field corresponds to the database column dbo.student.stuname
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
private String stuname;
/**
* This field was generated by Abator for iBATIS.
* This field corresponds to the database column dbo.student.stusex
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
private String stusex;
/**
* This field was generated by Abator for iBATIS.
* This field corresponds to the database column dbo.student.stuage
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
private Integer stuage;
/**
* This field was generated by Abator for iBATIS.
* This field corresponds to the database column dbo.student.stuclass
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
private String stuclass;
/**
* This method was generated by Abator for iBATIS.
* This method returns the value of the database column dbo.student.stuid
*
* @return the value of dbo.student.stuid
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public Integer getStuid() {
return stuid;
}
/**
* This method was generated by Abator for iBATIS.
* This method sets the value of the database column dbo.student.stuid
*
* @param stuid the value for dbo.student.stuid
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public void setStuid(Integer stuid) {
this.stuid = stuid;
}
/**
* This method was generated by Abator for iBATIS.
* This method returns the value of the database column dbo.student.stuname
*
* @return the value of dbo.student.stuname
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public String getStuname() {
return stuname;
}
/**
* This method was generated by Abator for iBATIS.
* This method sets the value of the database column dbo.student.stuname
*
* @param stuname the value for dbo.student.stuname
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public void setStuname(String stuname) {
this.stuname = stuname;
}
/**
* This method was generated by Abator for iBATIS.
* This method returns the value of the database column dbo.student.stusex
*
* @return the value of dbo.student.stusex
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public String getStusex() {
return stusex;
}
/**
* This method was generated by Abator for iBATIS.
* This method sets the value of the database column dbo.student.stusex
*
* @param stusex the value for dbo.student.stusex
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public void setStusex(String stusex) {
this.stusex = stusex;
}
/**
* This method was generated by Abator for iBATIS.
* This method returns the value of the database column dbo.student.stuage
*
* @return the value of dbo.student.stuage
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public Integer getStuage() {
return stuage;
}
/**
* This method was generated by Abator for iBATIS.
* This method sets the value of the database column dbo.student.stuage
*
* @param stuage the value for dbo.student.stuage
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public void setStuage(Integer stuage) {
this.stuage = stuage;
}
/**
* This method was generated by Abator for iBATIS.
* This method returns the value of the database column dbo.student.stuclass
*
* @return the value of dbo.student.stuclass
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public String getStuclass() {
return stuclass;
}
/**
* This method was generated by Abator for iBATIS.
* This method sets the value of the database column dbo.student.stuclass
*
* @param stuclass the value for dbo.student.stuclass
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public void setStuclass(String stuclass) {
this.stuclass = stuclass;
}
}
自动生成的studao接口和studaoimpl实现类:
Java代码
package com.whpu.upanddown.ibatis.dao;
import com.whpu.computershop.ibatis.pojo.Student;
import com.whpu.computershop.ibatis.pojo.StudentExample;
import java.sql.SQLException;
import java.util.List;
public interface StudentDAO {
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
void insert(Student record) ;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
int updateByPrimaryKey(Student record) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
int updateByPrimaryKeySelective(Student record) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
List selectByExample(StudentExample example) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
Student selectByPrimaryKey(Integer stuid) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
int deleteByExample(StudentExample example) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
int deleteByPrimaryKey(Integer stuid) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
int countByExample(StudentExample example) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
int updateByExampleSelective(Student record, StudentExample example) throws SQLException;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
int updateByExample(Student record, StudentExample example) throws SQLException;
List selectByname(String name) throws SQLException;
List selectByclassname(String classname) throws SQLException;
}
Java代码
package com.whpu.upanddown.ibatis.dao;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.whpu.computershop.ibatis.pojo.Student;
import com.whpu.computershop.ibatis.pojo.StudentExample;
import java.sql.SQLException;
import java.util.List;
public class StudentDAOImpl implements StudentDAO {
/**
* This field was generated by Abator for iBATIS.
* This field corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
private SqlMapClient sqlMapClient;
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public StudentDAOImpl(SqlMapClient sqlMapClient) {
super();
this.sqlMapClient = sqlMapClient;
}
public StudentDAOImpl(){
super();
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public void insert(Student record) {
try {
sqlMapClient.insert("dbo_student.abatorgenerated_insert", record);
sqlMapClient.insert("dbo_student.abatorgenerated_insert", record);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public int updateByPrimaryKey(Student record) throws SQLException {
int rows = sqlMapClient.update("dbo_student.abatorgenerated_updateByPrimaryKey", record);
return rows;
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public int updateByPrimaryKeySelective(Student record) throws SQLException {
int rows = sqlMapClient.update("dbo_student.abatorgenerated_updateByPrimaryKeySelective", record);
return rows;
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public List selectByExample(StudentExample example) throws SQLException {
List list = sqlMapClient.queryForList("dbo_student.abatorgenerated_selectByExample", example);
return list;
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public Student selectByPrimaryKey(Integer stuid) throws SQLException {
Student key = new Student();
key.setStuid(stuid);
Student record = (Student) sqlMapClient.queryForObject("dbo_student.abatorgenerated_selectByPrimaryKey", key);
return record;
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public int deleteByExample(StudentExample example) throws SQLException {
int rows = sqlMapClient.delete("dbo_student.abatorgenerated_deleteByExample", example);
return rows;
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public int deleteByPrimaryKey(Integer stuid) throws SQLException {
Student key = new Student();
key.setStuid(stuid);
int rows = sqlMapClient.delete("dbo_student.abatorgenerated_deleteByPrimaryKey", key);
return rows;
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public int countByExample(StudentExample example) throws SQLException {
Integer count = (Integer) sqlMapClient.queryForObject("dbo_student.abatorgenerated_countByExample", example);
return count.intValue();
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public int updateByExampleSelective(Student record, StudentExample example) throws SQLException {
UpdateByExampleParms parms = new UpdateByExampleParms(record, example);
int rows = sqlMapClient.update("dbo_student.abatorgenerated_updateByExampleSelective", parms);
return rows;
}
/**
* This method was generated by Abator for iBATIS.
* This method corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
public int updateByExample(Student record, StudentExample example) throws SQLException {
UpdateByExampleParms parms = new UpdateByExampleParms(record, example);
int rows = sqlMapClient.update("dbo_student.abatorgenerated_updateByExample", parms);
return rows;
}
/**
* This class was generated by Abator for iBATIS.
* This class corresponds to the database table dbo.student
*
* @abatorgenerated Thu Feb 11 21:34:33 CST 2010
*/
private static class UpdateByExampleParms extends StudentExample {
private Object record;
public UpdateByExampleParms(Object record, StudentExample example) {
super(example);
this.record = record;
}
public Object getRecord() {
return record;
}
}
public List selectByname(String stuname) throws SQLException
{
List list=sqlMapClient.queryForList("dbo_student.selectbystuname", stuname);
return list;
}
public List selectByclassname(String classname) throws SQLException
{
List list=sqlMapClient.queryForList("dbo_student.selectbyclassname", classname);
return list;
}
public void setSqlMapClient(SqlMapClient sqlMapClient) {
this.sqlMapClient = sqlMapClient;
}
}
自动生成的studao配置文件,当然SqlMapConfig.xml文件需要手动去编写的。
Java代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="dbo_student" >
<resultMap id="abatorgenerated_StudentResult" class="com.whpu.computershop.ibatis.pojo.Student" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
<result column="stuid" property="stuid" jdbcType="INTEGER" />
<result column="stuname" property="stuname" jdbcType="VARCHAR" />
<result column="stusex" property="stusex" jdbcType="VARCHAR" />
<result column="stuage" property="stuage" jdbcType="INTEGER" />
<result column="stuclass" property="stuclass" jdbcType="VARCHAR" />
</resultMap>
<sql id="abatorgenerated_Example_Where_Clause" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
<iterate property="oredCriteria" conjunction="or" prepend="where" removeFirstPrepend="iterate" >
<isEqual property="oredCriteria[].valid" compareValue="true" >
(
<iterate prepend="and" property="oredCriteria[].criteriaWithoutValue" conjunction="and" >
$oredCriteria[].criteriaWithoutValue[]$
</iterate>
<iterate prepend="and" property="oredCriteria[].criteriaWithSingleValue" conjunction="and" >
$oredCriteria[].criteriaWithSingleValue[].condition$
#oredCriteria[].criteriaWithSingleValue[].value#
</iterate>
<iterate prepend="and" property="oredCriteria[].criteriaWithListValue" conjunction="and" >
$oredCriteria[].criteriaWithListValue[].condition$
<iterate property="oredCriteria[].criteriaWithListValue[].values" open="(" close=")" conjunction="," >
#oredCriteria[].criteriaWithListValue[].values[]#
</iterate>
</iterate>
<iterate prepend="and" property="oredCriteria[].criteriaWithBetweenValue" conjunction="and" >
$oredCriteria[].criteriaWithBetweenValue[].condition$
#oredCriteria[].criteriaWithBetweenValue[].values[0]# and
#oredCriteria[].criteriaWithBetweenValue[].values[1]#
</iterate>
)
</isEqual>
</iterate>
</sql>
<select id="abatorgenerated_selectByPrimaryKey" resultMap="abatorgenerated_StudentResult" parameterClass="com.whpu.computershop.ibatis.pojo.Student" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
select stuid, stuname, stusex, stuage, stuclass
from dbo.student
where stuid = #stuid:INTEGER#
</select>
<select id="abatorgenerated_selectByExample" resultMap="abatorgenerated_StudentResult" parameterClass="com.whpu.computershop.ibatis.pojo.StudentExample" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
select stuid, stuname, stusex, stuage, stuclass
from dbo.student
<isParameterPresent >
<include refid="dbo_student.abatorgenerated_Example_Where_Clause" />
<isNotNull property="orderByClause" >
order by $orderByClause$
</isNotNull>
</isParameterPresent>
</select>
<delete id="abatorgenerated_deleteByPrimaryKey" parameterClass="com.whpu.computershop.ibatis.pojo.Student" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
delete from dbo.student
where stuid = #stuid:INTEGER#
</delete>
<delete id="abatorgenerated_deleteByExample" parameterClass="com.whpu.computershop.ibatis.pojo.StudentExample" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
delete from dbo.student
<include refid="dbo_student.abatorgenerated_Example_Where_Clause" />
</delete>
<insert id="abatorgenerated_insert" parameterClass="com.whpu.computershop.ibatis.pojo.Student" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
insert into dbo.student (stuid, stuname, stusex, stuage, stuclass)
values (#stuid:INTEGER#, #stuname:VARCHAR#, #stusex:VARCHAR#, #stuage:INTEGER#,
#stuclass:VARCHAR#)
</insert>
<update id="abatorgenerated_updateByPrimaryKey" parameterClass="com.whpu.computershop.ibatis.pojo.Student" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
update dbo.student
set stuname = #stuname:VARCHAR#,
stusex = #stusex:VARCHAR#,
stuage = #stuage:INTEGER#,
stuclass = #stuclass:VARCHAR#
where stuid = #stuid:INTEGER#
</update>
<update id="abatorgenerated_updateByPrimaryKeySelective" parameterClass="com.whpu.computershop.ibatis.pojo.Student" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
update dbo.student
<dynamic prepend="set" >
<isNotNull prepend="," property="stuname" >
stuname = #stuname:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="stusex" >
stusex = #stusex:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="stuage" >
stuage = #stuage:INTEGER#
</isNotNull>
<isNotNull prepend="," property="stuclass" >
stuclass = #stuclass:VARCHAR#
</isNotNull>
</dynamic>
where stuid = #stuid:INTEGER#
</update>
<select id="abatorgenerated_countByExample" parameterClass="com.whpu.computershop.ibatis.pojo.StudentExample" resultClass="java.lang.Integer" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
select count(*) from dbo.student
<include refid="dbo_student.abatorgenerated_Example_Where_Clause" />
</select>
<update id="abatorgenerated_updateByExampleSelective" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
update dbo.student
<dynamic prepend="set" >
<isNotNull prepend="," property="record.stuid" >
stuid = #record.stuid:INTEGER#
</isNotNull>
<isNotNull prepend="," property="record.stuname" >
stuname = #record.stuname:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="record.stusex" >
stusex = #record.stusex:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="record.stuage" >
stuage = #record.stuage:INTEGER#
</isNotNull>
<isNotNull prepend="," property="record.stuclass" >
stuclass = #record.stuclass:VARCHAR#
</isNotNull>
</dynamic>
<isParameterPresent >
<include refid="dbo_student.abatorgenerated_Example_Where_Clause" />
</isParameterPresent>
</update>
<update id="abatorgenerated_updateByExample" >
<!--
WARNING - This element is automatically generated by Abator for iBATIS, do not modify.
This element was generated on Thu Feb 11 21:34:33 CST 2010.
-->
update dbo.student
set stuid = #record.stuid:INTEGER#,
stuname = #record.stuname:VARCHAR#,
stusex = #record.stusex:VARCHAR#,
stuage = #record.stuage:INTEGER#,
stuclass = #record.stuclass:VARCHAR#
<isParameterPresent >
<include refid="dbo_student.abatorgenerated_Example_Where_Clause" />
</isParameterPresent>
</update>
<select id="selectbystuname" resultMap="abatorgenerated_StudentResult" parameterClass="java.lang.String" >
select stuid, stuname, stusex, stuage, stuclass
from dbo.student where stuname=#name#
</select>
<select id="selectbystuclass" resultMap="abatorgenerated_StudentResult" parameterClass="java.lang.String" >
select * from dbo.student as stu where stu.stuclass=#stuclass#
</select>
</sqlMap>
配置spring的配置文件去整合IBatis的功能类
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 利用spring的DriverManagerDataSource类配置数据源 -->
<bean id="datasource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://localhost:1433;databaseName=mydb">
</property>
<property name="username" value="sa"></property>
<property name="password" value="841026"></property>
</bean>
<!-- 利用spring的SqlMapClientFactoryBean类生成sqlmapclient工厂-->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref bean="datasource" />
</property>
<property name="configLocation"
value="com/hjy/SpringTranslateDemo/core/SqlMapConfig.xml">
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="datasource" />
</property>
</bean>
<bean id="studentdaoimpl"
class="com.whpu.upanddown.ibatis.dao.StudentDAOImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<!-- 利用spring的TransactionProxyFactoryBean去对事务进行自动管理 -->
<!--
<bean id="studao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="studentdaoimpl" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
-->
<bean id="stu1" class="com.whpu.computershop.ibatis.pojo.Student">
<property name="stuid" value="23"></property>
<property name="stuage" value="12"></property>
<property name="stuclass" value="1班"></property>
<property name="stusex" value="男"></property>
</bean>
<bean id="stu2" class="com.whpu.computershop.ibatis.pojo.Student">
<property name="stuid" value="1"></property>
<property name="stuage" value="13"></property>
<property name="stuclass" value="2班"></property>
<property name="stusex" value="女"></property>
</bean>
</beans>
上面注释掉的部分是spring的事务管理,本来想用spring去控制ibatis的事务管理,但没用成功,希望各位高手能看看,问题出在哪里?
测试类:
Java代码
package com.hjy.SpringTranslateDemo.Test;
import java.sql.SQLException;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.whpu.computershop.ibatis.pojo.Student;
import com.whpu.upanddown.ibatis.dao.StudentDAO;
import com.whpu.upanddown.ibatis.dao.StudentDAOImpl;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml");
SqlMapClient sqlmap = (SqlMapClient) ac.getBean("sqlMapClient");
// StudentDAO studao = (StudentDAO) ac.getBean("studao");
// studentdaoimpl
StudentDAO studao = (StudentDAO) ac.getBean("studao");
List list;
try {
list = studao.selectByname("张三");
Student stu = (Student) list.iterator().next();
System.out.println(stu.getStuname());
System.out.println(stu.getStusex());
System.out.println(stu.getStuclass());
System.out.println(stu.getStuage());
} catch (SQLException e) {
e.printStackTrace();
}
}
}
下面是测试结果:
张三
男
1班
20
二 Spring事务管理
Spring事务管理可以让我们的事务在失败时能自动回滚,Spring的事务管理主要有两种实现方式,编程式和声明式。对于编程式,可以用统一的模版去处理事务,但个人感觉违背了侵入式的编程思想。声明式是很现在用的最多的事务处理方式,只需要配置spring的配置文件就可以了,很方便。spring2.x和spring1.x的配置方式是不一样的。
我用的是spring1.x的配置方式,但在实现时出了问题,也不知道为什么,希望高手指出。
Spring application.xml文件
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 利用spring的DriverManagerDataSource类配置数据源 -->
<bean id="datasource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://localhost:1433;databaseName=mydb">
</property>
<property name="username" value="sa"></property>
<property name="password" value="841026"></property>
</bean>
<!-- 利用spring的SqlMapClientFactoryBean类生成sqlmapclient工厂-->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref bean="datasource" />
</property>
<property name="configLocation"
value="com/hjy/SpringTranslateDemo/core/SqlMapConfig.xml">
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="datasource" />
</property>
</bean>
<bean id="studentdaoimpl"
class="com.whpu.upanddown.ibatis.dao.StudentDAOImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<!-- 利用spring的TransactionProxyFactoryBean去对事务进行自动管理 -->
<bean id="studao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="studentdaoimpl" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="stu1" class="com.whpu.computershop.ibatis.pojo.Student">
<property name="stuid" value="23"></property>
<property name="stuage" value="12"></property>
<property name="stuclass" value="1班"></property>
<property name="stusex" value="男"></property>
</bean>
<bean id="stu2" class="com.whpu.computershop.ibatis.pojo.Student">
<property name="stuid" value="1"></property>
<property name="stuage" value="13"></property>
<property name="stuclass" value="2班"></property>
<property name="stusex" value="女"></property>
</bean>
</beans>
在成功插入第一条数据后,插入第二条会失败,我想失败后事务自动回滚,但第一条的数据依然成功插入了。感觉是配置文件有问题,但具体也不太清楚。