10 mybatis-spring
mybatis-spring官网:http://mybatis.org/spring/zh/index.html
这是spring如何整合mybatis的官网,和mybatis官网有点类似
10.1 回顾Mybatis
实例
搭建数据库环境
- 创建数据库
spring_mybatis
mysql> CREATE DATABASE spring_mybatis;
Query OK, 1 row affected (0.08 sec)
- 创建测试表
user
mysql> USE spring_mybaits;
mysql> CREATE TABLE user(
-> user_id INT PRIMARY KEY AUTO_INCREMENT,
-> user_name VARCHAR(20),
-> user_pwd VARCHAR(20)
-> )ENGINE=InnoDB, CHARSET=utf8;
Query OK, 0 rows affected, 1 warning (0.18 sec)
- 插入测试数据
mysql> INSERT INTO user
-> SELECT '张三','123456';
mysql> INSERT INTO user(user_name,user_pwd)
-> SELECT '李四','123456';
mysql> SELECT * FROM user;
+---------+-----------+----------+
| user_id | user_name | user_pwd |
+---------+-----------+----------+
| 1 | 张三 | 123456 |
| 2 | 李四 | 123456 |
+---------+-----------+----------+
先搭建一下
4. 在pom.xml中导入依赖
<dependencies>
<!-- spring的包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<!-- AspectJ的包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!-- mybatis的包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- MySQL连接的包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
Maven可能会到处资源错误,需要在pom.xml中加入
<!-- 在build中配置resources,来防止我们资源导出失败的问题 -->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 创建实体类
User
@Data
public class User {
private int id;
private String name;
private String pwd;
}
- 新建一个Dao层的测试接口
UserMapping
public interface UserMapping {
List<User> getAllUser();
}
7.配置核心文件mybatis-config.xml
和配置文件db.properties
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties" />
<typeAliases>
<package name="com.cap.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/cap/dao/UserMapping.xml"/>
</mappers>
</configuration>
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/spring_mybatis?serverTimezone=UTC
username=root
password=mysql
- 编写映射文件
UserMapping.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.cap.dao.UserMapping">
<resultMap id="getAllUserResultMap" type="user">
<id property="id" column="user_id" />
<result property="name" column="user_name" />
<result property="pwd" column="user_pwd" />
</resultMap>
<select id="getAllUser" resultMap="getAllUserResultMap">
SELECT * FROM user;
</select>
</mapper>
- 编写测试方法
@Test
public void test(){
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapping mapper = sqlSession.getMapper(UserMapping.class);
List<User> list = mapper.getAllUser();
for (User user : list) {
System.out.println(user);
}
} catch (IOException e) {
e.printStackTrace();
}
}
测试可得
User(id=1, name=张三, pwd=123456)
User(id=2, name=李四, pwd=123456)
10.2 Spring整合MyBatis方式一
1、引入Spring配置文件beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
2、配置数据源替换mybaits的数据源
<!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
这里使用Spring提供的JDBC支持,需要导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
也可以使用Druid,需要导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<!-- 配置数据源,这里我们使用阿里巴巴的Druid德鲁伊 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring_mybatis?serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="mysql" />
</bean>
3、配置SqlSessionFactory,关联MyBatis
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="mapperLocations" value="classpath:com/cap/dao/*.xml" />
</bean>
</bean>
4、注册sqlSessionTemplate,关联sqlSessionFactory;
<!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--利用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
5、增加Dao接口的实现类;私有化sqlSessionTemplate
public class UserMappingImpl implements UserMapping {
SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> getAllUser() {
UserMapping mapper = sqlSession.getMapper(UserMapping.class);
return mapper.getAllUser();
}
}
6、注册bean实现
<bean id="UserMappingImpl" class="com.cap.dao.UserMappingImpl" >
<property name="sqlSession" ref="sqlSession" />
</bean>
7、测试
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserMapper mapper = (UserMapper) context.getBean("userDao");
List<User> user = mapper.selectUser();
System.out.println(user);
}
结果成功输出!现在我们的Mybatis配置文件的状态!发现都可以被Spring整合!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.cap.pojo"/>
</typeAliases>
</configuration>
SqlSessionTemplate
它实现了SqlSession,是 MyBatis-Spring的核心
线程安全
10.3 Spring整合MyBatis方式二
mybatis-spring1.2.3版以上的才有这个 .
官方文档截图 :
dao继承Support类 , 直接利用 getSqlSession() 获得 , 然后直接注入SqlSessionFactory . 比起方式1 , 不需要管理SqlSessionTemplate , 而且对事务的支持更加友好 . 可跟踪源码查看
1、将我们上面写的UserDaoImpl修改一下
public class UserMappingImpl extends SqlSessionDaoSupport implements UserMapping {
@Override
public List<User> getAllUser() {
UserMapping mapper = getSqlSession().getMapper(UserMapping.class);
return mapper.getAllUser();
}
}
2、修改bean的配置
<bean id="UserMappingImpl" class="com.cap.dao.UserMappingImpl" >
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
3、测试
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapping userMapping = context.getBean(UserMapping.class);
List<User> list = userMapping.getAllUser();
for (User user : list) {
System.out.println(user);
}
}
结果得到:
User(id=1, name=张三, pwd=123456)
User(id=2, name=李四, pwd=123456)