在网上查了MyBatis+Spring的结合,真的是太多太多了,可是没有几个代码是完整的..这两项整合花了我两天时间,终于被我整合完成...其实也很简单,原因:JAR包的问题...
Service层接口:EmpService.java
由于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;
}
}
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 getAllEmp();
Emp getById(String id);
void deleteEmp(String id);
void updateEmp(Map map);
}
import java.util.List;
import java.util.Map;
import com.lixing.scm.entity.Emp;
public interface EmpMapper {
void insertEmp(Emp emp);
List
Emp getById(String id);
void deleteEmp(String id);
void updateEmp(Map
}
定义实体类操作接口的映射文件:EmpMapper.xml
xml
version
="1.0"
encoding
="UTF-8"
?>
"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 >
"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.*" />
< 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 >
< bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" >
< property name ="dataSource" ref ="MyDataSource" />
bean >
< 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.*.*(..))" />
< aop:advisor pointcut-ref ="pc" advice-ref ="userTxAdvice" />
aop:config >
< 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 >
< 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.*" />
< 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 >
< bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" >
< property name ="dataSource" ref ="MyDataSource" />
bean >
< 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.*.*(..))" />
< aop:advisor pointcut-ref ="pc" advice-ref ="userTxAdvice" />
aop:config >
< 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 getAllEmp();
Emp getById(String id);
void deleteEmp(String id);
void updateEmp(Map map);
}
import java.util.List;
import java.util.Map;
import com.lixing.scm.entity.Emp;
public interface EmpDao {
void insertEmp(Emp emp);
List
Emp getById(String id);
void deleteEmp(String id);
void updateEmp(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 getAllEmp() {
return this.empMapper.getAllEmp();
}
@Override
public Emp getById(String id) {
return this.empMapper.getById(id);
}
@Override
public void updateEmp(Map map) {
this.empMapper.updateEmp(map);
}
public EmpMapper getEmpMapper() {
return empMapper;
}
public void setEmpMapper(EmpMapper empMapper) {
this.empMapper = empMapper;
}
}
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
return this.empMapper.getAllEmp();
}
@Override
public Emp getById(String id) {
return this.empMapper.getById(id);
}
@Override
public void updateEmp(Map
this.empMapper.updateEmp(map);
}
public EmpMapper getEmpMapper() {
return empMapper;
}
public void setEmpMapper(EmpMapper empMapper) {
this.empMapper = empMapper;
}
}
package com.lixing.scm.test.service;
import com.lixing.scm.entity.Emp;
public interface EmpService {
void insertEmp(Emp emp);
}
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;
}
}
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);
}
}
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);
}
}