MyBatis和spring整合

简述

Mybatis将一些琐碎的事交给Spring来处理(像数据库链接,配置等),自身更加注重sql语句本身

整合思路
  • 需要spring来管理数据源信息。
  • 需要spring通过单例方式管理SqlSessionFactory。
  • 使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)
  • 持久层的mapper都需要由spring进行管理,spring和mybatis整合生成mapper代理对象。
集成的对象

1.jar包集成(主要导入Mybatis的jar包、spring的jar包、Mybatis-spring整合包、mysql的相关jar包,c3p0数据库连接池相关jar包,如果使用Junit测试的话,还要导入Junit的jar包,我用了)。

2.配置文件集成(两大配置文件,mybatis的全局配置文件SqlMapConfig.xml和spring的核心配置文件applicationContext.xml)。

3.SqlSessionFactory集成。

4.Mapper接口集成。

结构图

编写applicationContext.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
29
<?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"
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-3.2.xsd">
<!-- 加载 db.properties 中的参数设置,要引用db.properties中的参数,这句必须要有-->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 将数据库连接的操作交给spring,这里用的是c3p0连接池,需要导入c3p0的相关jar包-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置mybatis的SqlSessionFactory,需要注入全局配置文件和连接池 -->
<bean id="sqlSessionFactoryId" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="SqlMapConfig.xml"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置批量mapper代理开发模式,这里就不能指定id了,而是通过引用具体的 mapper类名来获取mapper对象,进而操作函数-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.qqq.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryId"></property>
</bean>
</beans>
dao设计–UserMapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.qqq.dao.UserMapper">
<!-- 这里只是举例了查询的例子 -->
<select id="findUserById" parameterType="int" resultType="com.qqq.domain.User">
select * from user where id=#{id}
</select>
<select id="findUserAll" resultType="com.qqq.domain.User">
select * from user
</select>
</mapper>
dao设计–UserMapper.java 接口
1
2
3
4
5
6
7
8
9
package com.qqq.dao;

import java.util.List;
import com.qqq.domain.User;

public interface UserMapper {
public User findUserById(int id);
public List<User> findUserAll();
}
在SqlMapconfig.xml中加载UserMapper.xml
1
2
3
4
5
6
7
8
9
10
<?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>
<!-- 如果mapper.xml和mapper.java接口在同一个目录,此处也可不用定义mappers -->
<mappers>
<mapper resource="com/qqq/dao/UserMapper.xml"/>
</mappers>
</configuration>
主体类–User.java
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
package com.qqq.domain;

import javax.swing.Spring;

public class User {
private int id;
private String username;
private int userage;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String toString() {
return "User [id=" + id + ", username=" + username + ", userage=" + userage + "]";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getUserage() {
return userage;
}
public void setUserage(int userage) {
this.userage = userage;
}
}
db.properties
1
2
3
4
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=123
log4j.properties
1
2
3
4
5
6
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
测试类 Test1.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.qqq.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.qqq.dao.UserMapper;
import com.qqq.domain.User;

public class Test1 {
//这里用了Junit 所以不能忘记加 @Test
@Test
public void testMultiMapper(){
String springxml="applicationContext.xml";
ApplicationContext context=new ClassPathXmlApplicationContext(springxml);
UserMapper userMapper=(UserMapper) context.getBean("userMapper");

//查找id号为2的用户信息

User user=userMapper.findUserById(2);
System.out.println(user);
}
}
数据库表

测试结果

0%