MyBatis+Spring 事务管理

  • Post author:
  • Post category:其他



在网上查了MyBatis+Spring的结合,真的是太多太多了,可是没有几个代码是完整的..这两项整合花了我两天时间,终于被我整合完成…其实也很简单,原因:

JAR包的问题



由于Ibatis被改名为MyBatis,所以,网上很多都是有关Ibatis而MyBatis却很少很少…

本文以

MyBatis3.0.6 + Spring3.0.6

为例结合(一定要这个版本才行):

定义一个实体类:


Emp.java


package

com.lixing.scm.entity;


public


class

Emp {


private

String id;


private

String name;


private

String sex;


private


int

age;


private

String phone;


public

String getId() {


return

id;

}


public


void

setId(String id) {


this

.id = id;

}


public

String getName() {


return

name;

}


public


void

setName(String name) {


this

.name = name;

}


public

String getSex() {


return

sex;

}


public


void

setSex(String sex) {


this

.sex = sex;

}


public


int

getAge() {


return

age;

}


public


void

setAge(

int

age) {


this

.age = age;

}


public

String getPhone() {


return

phone;

}


public


void

setPhone(String phone) {


this

.phone = phone;

}

}


定义实体内操作接口:EmpMapper.java


package

com.lixing.scm.test.mapper;


import

java.util.List;


import

java.util.Map;


import

com.lixing.scm.entity.Emp;


public


interface

EmpMapper {


void

insertEmp(Emp emp);

List<Emp> getAllEmp();

Emp getById(String id);


void

deleteEmp(String id);


void

updateEmp(Map<String,Object> map);

}


定义实体类操作接口的映射文件:EmpMapper.xml


<?


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.lixing.scm.test.mapper.EmpMapper”


>



<


parameterMap


type


=”com.lixing.scm.entity.Emp”


id


=”parameterMapEmp”


>



<


parameter


property


=”id”


/>



<


parameter


property


=”name”


/>



<


parameter


property


=”sex”


/>



<


parameter


property


=”age”


/>



<


parameter


property


=”phone”


/>



</


parameterMap


>


<


resultMap


type


=”com.lixing.scm.entity.Emp”


id


=”resultMapEmp”


>



<


result


property


=”id”


column


=”id”


/>



<


result


property


=”name”


column


=”name”


/>



<


result


property


=”sex”


column


=”sex”


/>



<


result


property


=”age”


column


=”age”


/>



<


result


property


=”phone”


column


=”phone”


/>



</


resultMap


>


<


insert


id


=”insertEmp”


parameterMap


=”parameterMapEmp”


>


INSERT INTO emp(id,name,sex,age,phone)

VALUES(?,?,?,?,?)


</


insert


>



<


select


id


=”getAllEmp”


resultMap


=”resultMapEmp”


>


SELECT * FROM emp


</


select


>



<


select


id


=”getById”


parameterType


=”String”


resultMap


=”resultMapEmp”


>


SELECT * FROM emp

WHERE id=#{value}


</


select


>



<


delete


id


=”deleteEmp”


parameterType


=”String”


>


DELETE FROM emp

WHERE id=#{value}


</


delete


>



<


update


id


=”updateEmp”


parameterType


=”java.util.Map”


>


UPDATE emp

SET name=#{name},sex=#{sex},age=#{age},phone=#{phone}

WHERE id=#{id}


</


update


>



</


mapper


>


Spring3.0.6定义:


applicationContext.xml


<?


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: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

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/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd”

>

<!–


–>


<


context:annotation-config


/>



<


context:component-scan


base-package


=”com.lixing.scm.test.*”


/>

<!–

jdbc.propertis Directory

–>


<


bean



class


=”org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”


>



<


property


name


=”locations”


value


=”classpath:jdbc.properties”


/>



</


bean


>


<


bean


id


=”MyDataSource”


destroy-method


=”close”



class


=”org.apache.commons.dbcp.BasicDataSource”


>



<


property


name


=”driverClassName”


value


=”${jdbc.driverClassName}”


/>



<


property


name


=”url”


value


=”${jdbc.url}”


/>



<


property


name


=”username”


value


=”${jdbc.username}”


/>



<


property


name


=”password”


value


=”${jdbc.password}”


/>



</


bean


>

<!–

SqlSessionFactory

–>


<


bean


id


=”sqlSessionFactory”


class


=”org.mybatis.spring.SqlSessionFactoryBean”


>



<


property


name


=”dataSource”


ref


=”MyDataSource”


/>



</


bean


>


<!–

ScanMapperFiles

–>


<


bean


class


=”org.mybatis.spring.mapper.MapperScannerConfigurer”


>



<


property


name


=”basePackage”


value


=”com.lixing.scm.test.mapper”


/>



</


bean


>

<!–

================================事务相关控制=================================================

–>


<


bean


name


=”transactionManager”


class


=”org.springframework.jdbc.datasource.DataSourceTransactionManager”


>



<


property


name


=”dataSource”


ref


=”MyDataSource”


>


</


property


>



</


bean


>


<


tx:advice


id


=”userTxAdvice”


transaction-manager


=”transactionManager”


>



<


tx:attributes


>



<


tx:method


name


=”delete*”


propagation


=”REQUIRED”


read-only


=”false”



rollback-for


=”java.lang.Exception”


no-rollback-for


=”java.lang.RuntimeException”


/>



<


tx:method


name


=”insert*”


propagation


=”REQUIRED”


read-only


=”false”



rollback-for


=”java.lang.RuntimeException”


/>



<


tx:method


name


=”update*”


propagation


=”REQUIRED”


read-only


=”false”



rollback-for


=”java.lang.Exception”


/>


<


tx:method


name


=”find*”


propagation


=”SUPPORTS”


/>



<


tx:method


name


=”get*”


propagation


=”SUPPORTS”


/>



<


tx:method


name


=”select*”


propagation


=”SUPPORTS”


/>



</


tx:attributes


>



</


tx:advice


>


<


aop:config


>



<


aop:pointcut


id


=”pc”


expression


=”execution(public * com.lixing.scm.test.service.*.*(..))”


/> <!–把事务控制在Service层–>



<


aop:advisor


pointcut-ref


=”pc”


advice-ref


=”userTxAdvice”


/>



</


aop:config


>

<!–

以下为自定义Bean

–>


<


bean


id


=”empDao”


class


=”com.lixing.scm.test.dao.impl.EmpDaoImpl”



autowire


=”byName”


/>



<


bean


id


=”empService”


class


=”com.lixing.scm.test.service.impl.EmpServiceImpl”


autowire


=”byName”


/>



</


beans


>


DAO接口:EmpDAO.java


package

com.lixing.scm.test.dao;


import

java.util.List;


import

java.util.Map;


import

com.lixing.scm.entity.Emp;


public


interface

EmpDao {


void

insertEmp(Emp emp);

List<Emp> getAllEmp();

Emp getById(String id);


void

deleteEmp(String id);


void

updateEmp(Map<String, Object> map);

}


DAO接口实现类:EmpDaoImpl.java



package

com.lixing.scm.test.dao.impl;


import

java.util.List;


import

java.util.Map;


import

com.lixing.scm.entity.Emp;


import

com.lixing.scm.test.dao.EmpDao;


import

com.lixing.scm.test.mapper.EmpMapper;


public


class

EmpDaoImpl

implements

EmpDao {



private

EmpMapper empMapper;


//在此处注入一个empMapper



//这个empMapper由 Spring自动生成


//不需要我们自己手工去定义


@Override


public


void

insertEmp(Emp emp) {


this

.empMapper.insertEmp(emp);


throw


new

RuntimeException(

“Error”

);

//测试抛出RuntimeException


//异常查看数据库是否存在记录


}

@Override


public


void

deleteEmp(String id) {


this

.empMapper.deleteEmp(id);

}

@Override


public

List<Emp> getAllEmp() {


return


this

.empMapper.getAllEmp();

}

@Override


public

Emp getById(String id) {


return


this

.empMapper.getById(id);

}

@Override


public


void

updateEmp(Map<String, Object> map) {


this

.empMapper.updateEmp(map);

}


public

EmpMapper getEmpMapper() {


return

empMapper;

}


public


void

setEmpMapper(EmpMapper empMapper) {


this

.empMapper = empMapper;

}

}

Service层接口:EmpService.java



package

com.lixing.scm.test.service;


import

com.lixing.scm.entity.Emp;


public


interface

EmpService {


void

insertEmp(Emp emp);

}


Service层接口实现类:EmpServiceImpl.java


package

com.lixing.scm.test.service.impl;


import

com.lixing.scm.entity.Emp;


import

com.lixing.scm.test.dao.EmpDao;


import

com.lixing.scm.test.service.EmpService;


public


class

EmpServiceImpl

implements

EmpService {


private

EmpDao empDao;

@Override


public


void

insertEmp(Emp emp) {

empDao.insertEmp(emp);

}


public

EmpDao getEmpDao() {


return

empDao;

}


public


void

setEmpDao(EmpDao empDao) {


this

.empDao = empDao;

}

}


测试类:TestEmpService.java


import

org.junit.Test;


import

org.springframework.context.ApplicationContext;


import

org.springframework.context.support.ClassPathXmlApplicationContext;


import

com.lixing.scm.entity.Emp;


import

com.lixing.scm.test.service.EmpService;


public


class

TestEmpService {

@Test


public


void

testTrasaction(){

Emp emp=

new

Emp();

emp.setId(

“00000003”

);

emp.setName(

“某某某”

);

emp.setAge(50);

emp.setSex(

“男”

);

emp.setPhone(

“566666”

);

ApplicationContext ctx=

new

ClassPathXmlApplicationContext(

“classpath:applicationContext.xml”

);

EmpService service=ctx.getBean(EmpService.

class

);

service.insertEmp(emp);

}

}



本文出自 “

李新博客

” 博客,请务必保留此出处

http://kinglixing.blog.51cto.com/3421535/723870