SpringMVC,Mybatis結(jié)合事務(wù)Transaction
SpringMVC,Mybatis結(jié)合事務(wù)Transaction
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203
前面講過(guò),Spring事務(wù)就是針對(duì)某一個(gè)方法,在頭和尾環(huán)繞上一對(duì)兒事務(wù)的開(kāi)始和結(jié)束語(yǔ)句段,方法里針對(duì)數(shù)據(jù)庫(kù)的操作就成為了一個(gè)事務(wù)。具體怎么樣訪問(wèn)數(shù)據(jù)庫(kù),是JDBC,還是Spring JDBC還是Mybatis,Spring的事務(wù)并不關(guān)心。所以mybatis這里的事務(wù)的配置和實(shí)驗(yàn)和前面的Spring JDBC是一樣的。
例 1.5
package com;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloWorldController {
@Resource
private ILoginService loginServic;
@RequestMapping("/helloa")
public void helloWorld(HttpServletResponse res) throws IOException {
loginServic.login();
res.sendRedirect("index.jsp");
}
}
package com;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.mapper.RegisterMapper;
@Service
public class LoginServiceImpl implements ILoginService {
@Resource
private RegisterMapper registerMapper;
public void login() {
updateRegister();
System.out.println("successfully update 1");
insertRegisterWrong();//duplicate key
System.out.println("successfully insert 2");
}
public void updateRegister() {
Register registerU = new Register();
registerU.setId(52);
registerU.setName("bbb2");
registerU.setAge(80);
System.out.println("registerMapper.updateByPrimaryKey 的返回值是 "+registerMapper.updateByPrimaryKey(registerU));
}
public void insertRegisterWrong() {
Register register = new Register();
register.setAge(80);
register.setId(50);
register.setName("aaa");
registerMapper.insert(register); }
}
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">
<context:component-scan
base-package="com" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName"
value="com.mysql.jdbc.Driver"></property>
<property name="url"
value="jdbc:mysql://localhost:3306/test"></property>
<property name="username"
value="root"></property>
<property name="password"
value="1234"></property>
</bean>
<!-- 通過(guò)掃描的模式,掃描目錄在com.mapper目錄下,把所有mapper都注入到Spring當(dāng)中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mapper" />
</bean>
<!-- 沒(méi)有以下的話,所有的mapper都不能創(chuàng)建,服務(wù)器啟動(dòng)過(guò)程報(bào)錯(cuò)-->
<bean id="sqlSessionFactoryqqqq" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置切面 這種寫法也正確"execution(* service.*.*(..))"-->
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.LoginServiceImpl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="login*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
package com;
public interface ILoginService {
/*在Controller當(dāng)中有iLoginService.login,所以在接口中必須有l(wèi)ogin方法*/
public void login();
}
package com.mapper;
import com.Register;
public interface RegisterMapper {
Register selectByPrimaryKey(Integer id);
int insert(Register record);
int updateByPrimaryKey(Register record);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.RegisterMapper">
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultType="com.Register">
select Id, Name, Age from register
where Id = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.Register">
insert into register (Id, Name, Age
)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}
)
</insert>
<update id="updateByPrimaryKey" parameterType="com.Register">
update register
set Name = #{name,jdbcType=VARCHAR},
Age = #{age,jdbcType=INTEGER}
where Id = #{id,jdbcType=INTEGER}
</update>
</mapper>
實(shí)驗(yàn)結(jié)果:
當(dāng)數(shù)據(jù)庫(kù)開(kāi)始有id52的數(shù)據(jù)時(shí),可以更新也可以添加。但同樣的程序第二次執(zhí)行時(shí),就報(bào)錯(cuò)了,因?yàn)閕d50的數(shù)據(jù)已經(jīng)有了,不能再次添加了。