基于xml配置的方式,使用Mybatis-Spring整合Mybatis和Spring
前言
以下内容源于对狂神的Spring5视频P24的总结,参考链接:【狂神说Java】Spring5最新完整教程IDEA版通俗易懂
1.使用Mybatis的module结构
具体文件内容可以参考链接:基于Mybatis的jdbc使用
2.使用Spring的module结构
具体文件内容可以参考链接:Spring5框架IOC中Bean管理对象的创建的方式
一、Mybatis-Spring整合Mybatis和Spring
Mybatis-Spring中文文档地址:Mybatis-Spring中文文档
1.Mybatis-Spring的module结构
2.注入依赖
在maven的配置文件pom.xml中注入mysql、mybatis、spring-webmvc、spring-jdbc、aspectjweaver‘、mybatis-spring的依赖
代码如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<!--Spring操作数据库的话,还需要一个spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>
<!--代码织入需导入的包-->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
3.填写Mybatis-Spring的配置文件
(1)使用Bean管理对象的创建
这里使用Spring的Bean管理对象创建,来管理dataSource、sqlSessionFactory、sqlSession对象的创建,在mybatis-spring.xml文件中,注册上述bean,这里的mybatis-spring.xml代替了Spring中的applicationContext.xml文件。
代码如下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath*:com.scut.mapper/UserMapper.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
从代码中可以看到,sqlSession是SqlSessionTemplate类,它等同于sqlSession类,包含了sqlSessionFactory类作为它的属性,那它就可以在它的内部代码中直接用sqlSessionFactory来生成sqlSession对象,这部分原本在Mybatis中是使用工具类类实现的,代码如下:
//sqlSessionFactory --> sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static{
try {
//使用Mybatis第一步:获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们就可以从中获得 SqlSession 的实例了。
// SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
sqlSessionFactory类中包含了dataSource类、configLocation类、mapperLocations类作为它的属性。configLocation类其实用于加载mybatis-config.xml文件,使得它能像Mybatis一样加载它的配置文件。mapperLocations类其实用于加载UserMapper.xml文件,使得它能像Mybatis的mybatis-config.xml文件一样注册Mapper,而无需再在mybatis-config.xml文件中写如下代码:
<!-- 每一个Mapper.XML都需要在Mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="com/scut/mapper/UserMapper.xml"/>
<!--<mapper class="com.scut.mapper.UserMapper"/>-->
<!--<package name="com.scut.mapper"/>-->
</mappers>
当然,在mybatis-config.xml文件依旧可以配置其他属性。
dataSource类包含了jdbc.properties里面的配置信息,它等同于Mybatis的配置文件mybatis-config.xml中,<environments>标签中包含的代码,代码如下:
<!-- 环境选择 -->
<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>
(2)创建UserDao、pojo和Mapper.xml
UserMapper就是UserDao接口,在UserMapper.xml中编写SQL语句。
到这里,只要用Spring获取IOC容器里面的Bean就可以得到UserMapper接口的代理类实例mapper,mapper就可以实现接口中的增删改查方法,实现如下:
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("mybatis-spring.xml");
SqlSession sqlSession = context.getBean("sqlSession", SqlSessionTemplate.class);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
userList.forEach(System.out::println);
}
结果如下:
User{id=1, name='admin', pwd='1234567'}
User{id=2, name='赵四', pwd='1sdf5'}
Process finished with exit code 0
虽然能实现,但MVC三层结构里,Service层是不能直接获得sqlSession对象的,只能在Dao层进行获取,所以我们可以创建一个UserMapperImp类来装载sqlSession对象,这样实现jdbc的方法依然保留在Dao层,顺应Spring的IOC思想,可以把UserMapperImp类里面的属性sqlSession类的创建也交由Spring的Bean管理,只要在配置文件mybatis-spring.xml中添加如下代码即可:
<bean id="userMapperImp" class="com.scut.mapper.UserMapperImp">
<property name="sqlSession" ref="sqlSession"></property>
</bean>
UserMapperImp类的创建如下:
public class UserMapperImp implements UserMapper{
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<User> getUserList() {
return sqlSession.getMapper(UserMapper.class).getUserList();
}
@Override
public User getUserById(int id) {
return null;
}
@Override
public int addUser(User user) {
return 0;
}
@Override
public int updateUser(User user) {
return 0;
}
@Override
public int deleteUser(int id) {
return 0;
}
}
就可以在测试代码中测试UserMapperImp类的方法:
public class UserMapperTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper mapper = context.getBean("userMapperImp", UserMapper.class);
List<User> userList = mapper.getUserList();
userList.forEach(System.out::println);
}
}
结果如下:
User{id=1, name='admin', pwd='1234567'}
User{id=2, name='赵四', pwd='1sdf5'}
Process finished with exit code 0
总结
Mybatis中配置文件mybatis-config里面,jdbc的配置信息和Mapper.xml的注册语句都放到了Mybatis-Spring的配置文件mybatis-spring.xml中,再使用Spring的Bean管理,实现UserMapperImp对象的创建,同时也实现了其内部属性中的类,其内部属性中的类中的属性中的类等的对象创建,把这部分原本放在applicationContext.xml的Spring配置文件中的Bean管理的代码放到了Mybatis-Spring的配置文件mybatis-spring.xml中。