哈哈我是灵魂画手(我就这个图都能画半个小时😅

Spring + Mybatis

学习了框架Spring和Mybatis 那我们需要把他们两个合并起来一起用 因为在Spring中的对象交予Spring容器管理 Mybatis原版的用法就无法与Spring契合 但是官方提供了一种无缝契合到Spring中的方法

首先导入包: 注意 包是有要求的 不同版本需要使用的包也不同 但是用法是一样的

MyBatis-SpringMyBatisSpring FrameworkSpring BatchJava
2.03.5+5.0+4.0+Java 8+
1.33.4+3.2.2+2.1+Java 6+

整合两个框架的方式有两种,但是第二种只是第一种的简化版 实现原理和过程还是第一种

所以第一种要掌握透彻

导包:

<dependencies>
    <!--    Spring + Mybatis整合的依赖包    -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.7</version>
    </dependency>
    <!--    Mybatis包    -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!--    SpringJDBC包 spring框架连接数据库用到    -->
    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.17</version>
        </dependency>
    <!--    lombok包 工具包 主要是使用到创建实体类    -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </dependency>
    <!--    mysql和java的连接包 jdbc    -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
    <!--    单元测试    -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

规则:

<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

package cn.mianju.pojo;


import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

接口:UserMapper

package cn.mianju.mapper;

import cn.mianju.pojo.User;

import java.util.List;

public interface UserMapper {
    List<User> getUsers();
}

然后在编写 Mybatis 的配置和方法

UserMapper.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="cn.mianju.mapper.UserMapper">
    <select id="getUsers" resultType="cn.mianju.pojo.User">
        select * from user;
    </select>
</mapper>

mybatis-config.xml:

<?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">

<!--    大部分配置都在Spring的applicationContext.xml中配置 所以这里这需要注册mapper就好    -->
<configuration>
    <mappers>
        <mapper resource="cn/mianju/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

配置Spring 配置文件

相比于普通的mybatis 这里多一个接口的实现类 UserMapperImpl

UserMapperImpl:

package cn.mianju.mapper;

import cn.mianju.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class UserMapperImpl implements UserMapper{
    SqlSessionTemplate sqlSession;

    //声明set方法后使用set注入
    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    //方法的运行就在这里 Spring需要调用实现类的对象就是这个
    @Override
    public List<User> getUsers() {
        //而这里调用的则是Mybatis中xml配置实现的方法
        return sqlSession.getMapper(UserMapper.class).getUsers();
    }
}

applicationContext.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">

<!--    数据源配置 这就是原本在mybatis-config.xml中配置的-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.117.128:3306/mybatis?useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

<!--    mybatis的sqlSeesion工厂类注册-->
    <bean id="sqlSeesionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="mybatis-config.xml"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!--    将工厂类传入 用构造器注入方式-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSeesionFactory"/>
    </bean>

<!--    实现类 一定要把 SqlSessionTemplate 给注入进去 我第一次就忘记了 😅-->
    <bean id="userMapper" class="cn.mianju.mapper.UserMapperImpl">
        <property name="sqlSession" ref="sqlSession"/>
    </bean>

</beans>

测试

MyTest:

import cn.mianju.mapper.UserMapper;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
        System.out.println(userMapper.getUsers());
    }
}

解析:

  • 首先正常new出一个 context 来get他的bean

  • get的bean是实现类 但是类型是接口的 applicationContext.xml 中的配置如下

    • <!--    实现类 一定要把 SqlSessionTemplate 给注入进去 我第一次就忘记了 😅-->
      <bean id="userMapper" class="cn.mianju.mapper.UserMapperImpl">
          <property name="sqlSession" ref="sqlSession"/>
      </bean>
      
  • 然后获得到 这个接口实现类的对象后 调用这个实现类的方法

    • //方法的运行就在这里 Spring需要调用实现类的对象就是这个
          @Override
          public List<User> getUsers() {
              //而这里调用的则是Mybatis中xml配置实现的方法
              return sqlSession.getMapper(UserMapper.class).getUsers();
          }
      
  • 而这个实现类中的 sqlSession.getMapper(UserMapper.class).getUsers(); 的方法调用的是Mybatis的xml的实现

    • <mapper namespace="cn.mianju.mapper.UserMapper">
          <select id="getUsers" resultType="cn.mianju.pojo.User">
              select * from user;
          </select>
      </mapper>
      

方式二:

方式一的底层和实现原理和方式一 是一样的 只是在方式一的基础上简化了不少

使用非常简单 首先我们来看官网的介绍 就两块代码

Spring+Mybatis

实现类和接口

首先 实现类和接口 必须要有

接口 UserMapper2

package cn.mianju.mapper2;

import cn.mianju.pojo.User;

import java.util.List;

public interface UserMapper2 {
    List<User> getUsers();

}

实现类 UserMapper2Impl

package cn.mianju.mapper2;

import cn.mianju.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

public class UserMapper2Impl extends SqlSessionDaoSupport implements UserMapper2 {
    @Override
    public List<User> getUsers() {
        return getSqlSession().getMapper(UserMapper2.class).getUsers();
    }
}

注意 现在这里不再需要创建 SqlSessionTemplate 这个对象了,只需要继承 SqlSessionDaoSupport 这个类

就能调用这个类中的 getSqlSession 方法

Mybatis的相关配置

UserMapper2.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">
<!--  Dao(mapper)的实现 namespace是接口的位置 resultType是返回类型 -->
<mapper namespace="cn.mianju.mapper2.UserMapper2">
    <select id="getUsers" resultType="cn.mianju.pojo.User">
        select * from user;
    </select>
</mapper>

这一块和上面是一样的

然后就是在mybatis-config.xml中注册

<?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>
    <mappers>
        <mapper resource="cn/mianju/mapper/UserMapper.xml"/>
        <mapper resource="cn/mianju/mapper2/UserMapper2.xml"/>
    </mappers>
</configuration>

Spring的相关配置

还有 applicationContext.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">

<!--    数据源配置-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.117.100:3306/mybatis?useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

<!--    mybatis的sqlSeesion工厂类注册-->
    <bean id="sqlSeesionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="mybatis-config.xml"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!--    注册这个实现类 并且将sqlSessionFactory这个类给他注入进去-->
    <bean id="userMapper2" class="cn.mianju.mapper2.UserMapper2Impl">
        <property name="sqlSessionFactory" ref="sqlSeesionFactory"/>
    </bean>

</beans>

相比于方式一 在这里不需要再定义sqlSession的bean 就只需要将sqlSessionFactory这个工厂类给他赋值就可以

测试类

MyTest:

import cn.mianju.mapper.UserMapper;
import cn.mianju.mapper2.UserMapper2;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper2 userMapper = context.getBean("userMapper2", UserMapper2.class);
        System.out.println(userMapper.getUsers());
    }
}

和之前的一样

总结

要将Spring和Mybatis整合起来

  • 首先要导入对应的包 根据版本号导包
  • 整合方式有两种
    • 方式一会更全面更详细
    • 方式二会更简便 但是实现的过程也是方式一
  • 方式一需要掌握熟练
上一篇 下一篇