在网上查了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);
}
}