2Y-

导航

spring整合mybatis的两种方法

Spring整合Mybatis

 (本文是我看着官方文档写的,建议对照官方文档食用,香惨了http://mybatis.org/spring/zh/index.html)

打开官方文档会发现会先找到一段话“MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。”,这便是Mybatis-Spring的作用。

1.版本问题:

在官方文档的简介,基础知识部分有了详细介绍:

Mybatis-Spring Mybatis Spring框架 Spring Batch Java
2.0 3.5+ 5.0+ 4.0+ Java8+
1.3 3.4+ 3.2.2+ 2.1+ Java6+


2.入门:

如果使用的是Maven,直接在pom.xml中加入一下依赖即可。

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.5</version>
</dependency>

(这只是mybatis-spring的依赖,还需要junit、mysql、spring-mvc、spring-jdbc<会在文末给出代码>,同时为了方便也可以导入lombok使用注解开发)

在包导入完之后,官方文档里快速上手部分写了一句话,“至少配置两样东西:一个SqlSessionFactory和至少一个数据映射器”,再往下看有一个注意后面有一句话“SqlSessionFactory需要一个DataSource(数据源)”反观之前,所有数据源的配置都是交给mybatis配置死的,SqlSessionFactory是用冗长的代码来实现的。

 

以上是官方文档里面的入门部分的内容。

以下是我对入门的理解:

 

首先在resoures文件中建立一个application.xml文件;(resources右键--->New--->XML Configeration File--->Spring Config,直接有spring的配置,不用再去导入)

根据官方文档所提供的信息,起码需要两个部分DataSource(数据源)和sqlSessonFactory

 

DataSource:

首先要用Spring的数据源替换掉Mybatis自己写死的配置,数据源选择什么都无所谓,什么c3p0、dbcp、druid都可以,以Spring的Jdbc为例(DriverManagerDataSource,驱动管理数据源

<bean id="dateSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSLL=true&amp;useUnicode=true&amp;charaterEnocding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>

driverClassName、url、username、password等都是自带的属性,切勿乱改

可以把DriverManagerDataSource点进去看源码,里面都已经定义好的,包括什么driverClassName不为空之类的,在此不多做赘述,源码很强大,可以自行查看。

 

sqlSessonFactory:

这部分官方文档(sqlSessonFactoryBean)很详细,直接给了相应的配置,直接复制就好

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

但是在这段代码中,还可以进行mybatis配置文件的绑定,不加也没事(官方文档中,设置下面的属性)

点开property name,可以发现它拥有很多跟mybatis有的配置,这时候,mybatis的xml文件基本是没用了,包括configLocation、mapperLocation等,都可以进行配置(星号代表所有xml文件,同时原本的mybatis的xml最好保留,用于放置日志,缓存,别名等配置)

 

<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/yu/mapper/*.xml"/>

 

 

完成以上之后,再回头看官方文档--->入门--->快速上手

 

看文档可知,所有的SqlSession都有一个SqlSessionTemplate对象,Template百度翻译给我的翻译是“样板; 模板; 型板; 模框; 标准”,我们得再xml文件中自己配置一个,代码(官方文档--->使用SqlSession--->SqlSessionTemplate中有这段代码)如下:

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用构造器注入sqlSessionFactory,因为没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

这段代码一开始我有个疑问,为啥只能用构造器注入,点开了这个类才知道,整个类里面并没有set方法,因此只能使用构造器注入

 

继续读官方文档,下面有一行@Bean的代码,我不使用这种方法,我换一种方法,使用实现类。

创造一个实现类MapperImpl,直接让它 implement Mapper,没整合两个框架之前,操作是用sqlSession来执行,现在整合之后,则使用SqlSessionTemplate来实现,然后使用set方法将他注入到Spring,最后返回到自己的增删改查操作就好,代码如下:

 

package com.yu.mapper;

import com.yu.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class UserMapperImpl implements UserMapper{
//原来我们的所有操作都是用sqlSession执行,现在都是用sqlSessionTemplate
private SqlSessionTemplate sqlsession;
//spring万物都注入,直接一个set方法
public void setSqlsession(SqlSessionTemplate sqlsession) {
this.sqlsession = sqlsession;
}
//alt+enter
public List<User> selectUser() {
//相当于之前用sqlSession的时候的getmapper
UserMapper mapper = sqlsession.getMapper ( UserMapper.class );
return mapper.selectUser ();
}
}

 

在xml文件中注入impl,即可使用,代码如下:

 

<bean id="userMapper" class="com.yu.mapper.UserMapperImpl">
<property name="sqlsession" ref="sqlSession"/>
</bean>

 

测试类:

 

import com.yu.mapper.UserMapper;
import com.yu.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class MyTest {
@Test
public void test() throws IOException {

ApplicationContext context = new ClassPathXmlApplicationContext ( "applicationContext.xml" );

UserMapper userMapper = context.getBean ( "userMapper", UserMapper.class );
for(User user : userMapper.selectUser ()){
System.out.println (user);
}
}
}

 

<注:usermapper后面的UserMapper.class是为了避免强制类型转化>

 

步骤总结:

1.配置数据源

2.sqlSessionFactory

3.sqlSessionTemplate

4.给接口增加实现类,即Impl

5.把Impl注入到Spring中

6.测试

注:SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSessionSqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。这句话是SqlSessionTemplate部分的第一句话

 

以上是第一种方法,下面是第二种方法

 

 

使用SqlSessionDaoSupport(终极简化,香惨了)

 

这部分官方文档没有过多的赘述,只有两段代码,看代码发现,Impl继承了一个类SqlSessionDaoSupport,然后xml中sqlSessionFactory一放,就啥都能用。

代码如下:

 

package com.yu.mapper;

import com.yu.pojo.User;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{

public List<User> selectUser() {
return getSqlSession ().getMapper ( UserMapper.class ).selectUser ();
}
}

点开SqlSessionDaoSupport,其实只做了一些支持,其实就是刚才方法一的代码被一个类简化了

xml文件配置如下:

 

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

 

为什么注入sqlSessionFactory:虽然它现在不需要注入,但是它的父类是需要的,左键点开看源码,打开新世界。而且自动提示的emm,应该不会错吧(?)。同时,在方法一中的注入sqlSessionFactory都可以直接省略。

 

前文提到的junit、mysql、spring-mvc、spring-jdbc依赖

 

dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>3.1.14</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>

posted on 2020-09-11 17:47  2Y-  阅读(1065)  评论(0编辑  收藏  举报