spring-mybatis

1、整合方式共有四种,这里总结了三种。

2、通用配置

2.1、依赖包:

在导依赖包时,不能导入

1
2
3
4
5
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>5.0.3</version>
</dependency>

此包,否则会报方法找不到的异常,其实是 jar 包中的类冲突。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lin</groupId>
<artifactId>spring-mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- spring -->
<dependency>
<artifactId>org.springframework</artifactId>
<groupId>spring-jdbc</groupId>
<version>3.2.7.RELEASE</version>
</dependency>
<dependency>
<artifactId>org.springframework</artifactId>
<groupId>spring-core</groupId>
<version>3.2.7.RELEASE</version>
</dependency>
<dependency>
<artifactId>org.springframework</artifactId>
<groupId>spring-context</groupId>
<version>3.2.7.RELEASE</version>
</dependency>
<dependency>
<artifactId>org.springframework</artifactId>
<groupId>spring-beans</groupId>
<version>3.2.7.RELEASE</version>
</dependency>
<dependency>
<artifactId>org.springframework</artifactId>
<groupId>spring-tx</groupId>
<version>3.2.7.RELEASE</version>
</dependency>
<dependency>
<artifactId>org.springframework</artifactId>
<groupId>spring-expression</groupId>
<version>3.2.7.RELEASE</version>
</dependency>
<dependency>
<artifactId>org.springframework</artifactId>
<groupId>spring-aop</groupId>
<version>3.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>com.springsource.org.aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>
<!-- mybatis-spring桥接 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.6</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
<!-- c3p0连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.15</version>
</dependency>
<dependency>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
<version>1.1</version>
</dependency>
</dependencies>
</project>

2.2、spring-mybatis.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 开启spring注解扫描 -->
<context:component-scan base-package="service"></context:component-scan>
<!-- 配置数据源,使用c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://192.168.20.40:3306/swan?characterEncoding=utf-8"></property>
<property name="user" value="devswan"></property>
<property name="password" value="DEVswan123!"></property>
</bean>
</beans>

2.3、Service 接口

1
2
3
4
5
package service;
public interface ILinBookService {
LinBook getLinBook();
void addBook(LinBook linBook);
}

2.4、实体类

1
2
3
4
5
6
7
package bean;
public class LinBook {
private int bookId;
private String bookName;
private int bookNum;
private String bookCategory;
}

2.5、测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class JTest {
ILinBookService bean =null;
@Before
public void fun() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml");
bean = (ILinBookService) applicationContext.getBean("ILinBookService");
}
@Test
public void fun1() {
LinBook linBook2 = bean.getLinBook();
System.out.println(linBook2);
}
}

3、第一种:使用 org.mybatis.spring.mapper.MapperScannerConfigurer

3.1、创建 sqlSessionFactory

1
2
3
4
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="dao/ILinBook.xml"></property>
</bean>

3.2、sqlSession

1
2
3
4
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

3.3、ILinBook.xml 文件

1
2
3
4
5
6
7
8
9
10
<?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="dao.ILinBook">
<select id="getBookById" parameterType="Integer" resultType="bean.LinBook" statementType="PREPARED">
select * from linbook where bookid=#{v}
</select>
<insert id="addLinBook" parameterType="bean.LinBook">
insert into linbook values(#{bookId},#{bookName},#{bookNum},#{bookCategory})
</insert>
</mapper>

3.4、Service 类

1
2
3
4
5
6
7
8
9
10
11
12
13
package service;
@Component("ILinBookService")
public class LinBookService implements ILinBookService {
// MapperScannerConfigurer
@Resource
private ILinBook ilinbook;
public LinBook getLinBook() {
return ilinbook.getBookById(1);
}
public void addBook(LinBook linBook) {
ilinbook.addLinBook(linBook);
}
}

3.5、Dao 层接口

1
2
3
4
5
6
package dao;
@MapperScan
public interface ILinBook {
LinBook getBookById(int bookId);
void addLinBook(LinBook linBook);
}

4、第二种:采用 org.mybatis.spring.mapper.MapperFactoryBean

4.1、创建 sqlSessionFactory

1
2
3
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>

4.2、sqlSession

1
2
3
4
<bean id="ILinBook" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="dao.ILinBook" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

4.3、Service 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package service;
@Component("ILinBookService")
public class LinBookService implements ILinBookService {
// MapperFactoryBean
@Resource
private ILinBook ilinbook;
public LinBook getLinBook() {
return ilinbook.getBookById(1);
}
// @Transactional(rollbackFor=Throwable.class)
public void addBook(LinBook linBook) {
ilinbook.addLinBook(linBook);
}
}

4.4、Dao 层接口

1
2
3
4
5
6
7
8
package dao;
@MapperScan
public interface ILinBook {
// 注解用于第二种,不需要xml文件
@Select("select * from linbook where bookid=#{v}")
LinBook getBookById(@Param("v") int bookId);
void addLinBook(LinBook linBook);
}

5、第三种:采用 org.mybatis.spring.SqlSessionTemplate

5.1、创建 sqlSessionFactory

1
2
3
4
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="dao/ILinBook.xml"></property>
</bean>

5.2、sqlSession

1
2
3
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>

5.3、ILinBook.xml

1
2
3
4
5
6
7
8
9
10
<?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="dao.ILinBook">
<select id="getBookById" parameterType="Integer" resultType="bean.LinBook" statementType="PREPARED">
select * from linbook where bookid=#{v}
</select>
<insert id="addLinBook" parameterType="bean.LinBook">
insert into linbook values(#{bookId},#{bookName},#{bookNum},#{bookCategory})
</insert>
</mapper>

5.4、Service 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package service;
@Component("ILinBookService")
public class LinBookService implements ILinBookService {
// SqlSessionTemplate
@Resource
private SqlSessionTemplate sqlSessionTemplate;
public LinBook getLinBook() {
//以下二选一
return sqlSessionTemplate.getMapper(ILinBook.class).getBookById(1);
return sqlSessionTemplate.selectOne("dao.ILinBook.getBookById", 1);
}
// @Transactional(rollbackFor=Throwable.class)
public void addBook(LinBook linBook) {
ilinbook.addLinBook(linBook);
}
}

5.5、Dao 层接口

1
2
3
4
5
6
package dao;
@MapperScan
public interface ILinBook {
LinBook getBookById(int bookId);
void addLinBook(LinBook linBook);
}

6、总结

三种方式采用不同的 spring 提供的工厂,生成 sqlSession,使得集成后的 spring 和 mybatis 中,mybatis 又将一些东西交由 spring 管理。

6.1、事务

6.1.1、spring-mybatis.xml

加入

1
2
3
4
<!-- 配置事务控制器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

6.1.2、不使用注解时

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 不使用注解,aop控制事务 -->
<tx:advice id="iccardTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- read-only:只读事务,事务中没有对数据库修改,mysql会进行优化 -->
<!-- propagetion:事务传播, -->
<tx:method name="add*" rollback-for="java.lang.Exception" read-only="false" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 把事务控制在service层 -->
<aop:config>
<aop:pointcut id="iccardTerm" expression="execution(public * service.*.*(..))" />
<aop:advisor pointcut-ref="iccardTerm" advice-ref="iccardTxAdvice" />
</aop:config>

6.1.3、使用注解时

1
2
<!-- 使用注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />

需要在 service 中的方法上加入注解,如:
rollbackFor 是回滚情况

1
2
3
4
@Transactional(rollbackFor=Throwable.class)
public void addBook(LinBook linBook) {
ilinbook.addLinBook(linBook);
}