MyBatis和Spring整合
Spring支持对MyBatis进行IOP与AOP等操作,这也是SSM框架被使用的基础 。想要Spring能对MyBatis进行支持的话,需要导入相对应的jar包,这里使用maven导入
Maven jar包:
<dependencies>
<!-- 支持@Text的包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 支持Mybatis的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- 支持mysql的包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!--支持Spring的包1 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.5</version>
</dependency>
<!--支持Spring的包2 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.6</version>
</dependency>
<!--支持AOP织入器的包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!--支持MyBatis和Spring连接的包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
Spring配置
在单独使用MyBatis时,我们需要对MyBatis中的JDBC的连接进行专门的XML配置,还有sqlSessionFactory繁琐的实例化。
在我们使用Spring来连接MyBatis时,我们就可以让Spring来对这些内容进行Bean配置,也就是ioc注入等。非常方便。
bean.xml配置:
1: 头文件配置
先导入Spring的配置头文件:
<?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 https://www.springframework.org/schema/context/spring-context.xsd">
2:数据源配置
而后我们配置数据源,也就是配置MyBatis连接数据库的数据源:
它可以大大简化我们MyBatis的配置,需要MyBatis中等连接池等设置,我们还是可以在MyBatis-config.xml中配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"/>
<property name="username" value="root"/>
<property name="password" value="123321"/>
</bean>
3:sqlSessionFactory配置
我们还需要在Spring中配置sqlSessionFactory,并且关联MyBatis来进行操作。
然后把数据源也就是dataSource导入到sqlSessionFactory中.
当我们配置这个连接时,mybatis-config.xml就不能再去连接Mapper.xml,它们之间就不能有任何连接,如果一定有连接,只需要再bean中配置一个就行。
<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:Mapper.xml"/>
</bean>
4:sqlSessionTemplate配置
sqlSessionTemplate配置需要把sqlSessionFactory传入到SqlSessionTemplate类中,但SqlSessionTemplate是拥有有参构造所以只能使用构造器注入(constructor-arg)
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
5:实例化sqlSessionTemplate
先建立一个mapper接口:
package com.nicht.mapper;
import com.nicht.pojo.User;
import java.util.List;
public interface UserMapper {
//简单查询功能
List<User> selectUser();
}
在我们Spring中配置完了SqlSessionTemplate,我们就可以在这里调用了,但要想调用的话,我们需要在Spring的配置中把sqlSessionTemplate注入。
注入sqlSessionTemplate:
<bean id="userMapper" class="com.nicht.mapper.UserMapperImpl">
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
实现mapper接口:
package com.nicht.mapper;
import com.nicht.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate){
this.sqlSessionTemplate = sqlSessionTemplate;
}
@Override
public List<User> selectUser() {
UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
这样我们调用时,就无需再去创建sqlSessionFactory等繁琐的java类了
6:测试
public class MyTest {
@Test
public void test() throws IOException{
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserMapper mapper = (UserMapper) context.getBean("userMapper");
for (User user : mapper.selectUser()) {
System.out.println(user);
}
}
}
升级简化版:依靠sqlSessionDaoSupport类
使用sqlSessionDaoSupport 就不需要去实例化且配置sqlSessionTemplate,,只需要把sqlSessionFactory传给sqlSessionDaoSupport就行了
我们让实现Mapper接口类 继承一个 SqlSessionDaoSupport父类
package com.nicht.mapper;
import com.nicht.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
@Override
public List<User> selectUser() {
return getSqlSession().getMapper(UserMapper.class).selectUser();
}
}
虽然实现类没有定义sqlSessionFactory类,但因为我们继承了sqlSessionDaoSupport父类。所以我们可以直接把sqlSessionFactory传进去。
<bean id="userMapper1" class="com.nicht.mapper.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
这样我们就完成了,也省略了许多关于sqlSessionTemplate的步骤。