21、MyBatis源码 - MyBatis-Spring入门案例

来自于官方文档

简介

MyBatis-Spring 会帮助你将 MyBatis 无缝地整合到 Spring 中。它允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

版本匹配

MyBatis-Spring 需要以下版本:
 

入门案例

注意事项

要和Spring 一起使用 MyBatis,需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类(Mapper接口)。所指定的映射器类必须是一个接口,而不是具体的实现类。

在MyBatis-Spring 中,可使用 SqlSessionFactoryBean来创建 SqlSessionFactory,SqlSessionFactory 需要一个 DataSource(数据源)。

配置好之后,你就可以像 Spring 中普通的 bean 注入方法那样,将映射器注入到你的业务或服务对象中。MapperFactoryBean 将会负责 SqlSession 的创建和关闭。 如果使用了 Spring 的事务功能,那么当事务完成时,session 将会被提交或回滚。最终任何异常都会被转换成 Spring 的 DataAccessException 异常。

1. 环境搭建

创建一个普通的Maven工程,引入Spring、Mybatis、日志等相关依赖:

    <dependencies>
        <!--mybatis核心-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--Mysql 驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <!--logback日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>
        <!--Mysql 驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <!--spring 整合mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <!--数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <!-- spring  context-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.10</version>
        </dependency>
        <!--Spring  事务-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.10 </version>
        </dependency>
    </dependencies>
        <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <!--idea默认不会编译src的java目录的xml文件-->
                <includes>
                    <!--配置将src源代码下的xml等资源文件编译进classes文件夹-->
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

执行Sql脚本(创建一个简单的用户表即可),并创建响应的实体类、Mapper接口及XML文件。

在UserMapper,添加一个查询接口

public interface UserMapper {
   
     

    @Select("SELECT * FROM base_user WHERE user_id ={userId}")
    User getUser(@Param("userId") Long userId);

}

2. 基于XML 方式注入Bean

resources目录下创建mysql.properties文件,配置自己的数据库连接及用户信息:

db.url=jdbc:mysql://127.0.0.1:3306/demo_user?serverTimezone=Asia/Shanghai
db.driver=com.mysql.cj.jdbc.Driver
db.username=root
db.password=123456

接着创建spring-mybatis.xml文件,注入数据库连接池、SqlSessionFactoryBean对象、以及userMapper,交给Spring容器管理:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd">

    <!--配置读取mysql.properties数据库配置文件-->
    <context:property-placeholder location="classpath:mysql.properties"/>

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- 连接数据库的驱动,连接字符串,用户名和登录密码-->
        <property name="driverClassName" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
        <!-- 数据池中最大连接数和最小连接数-->
        <property name="maxActive" value="10"/>
        <property name="minIdle" value="5"/>
    </bean>

    <!--SqlSessionFactoryBean对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!-- 注入 映射文件 mapper-->
        <property name="mapperLocations" value="classpath:org/pearl/spring/mybatis/demo/dao/*.xml"/>
    </bean>

    <!--注入userMapper-->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="org.pearl.spring.mybatis.demo.dao.UserMapper"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
</beans>

测试,从xml文件中创建IOC容器,并在IOC中获取UserMapper Bean对象,进行查询操作。

public class SpringTest {
   
     
    public static void main(String[] args) {
   
     
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-mybatis.xml");
        UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
        User user = userMapper.getUser(12L);
        System.out.println(user);
    }
}

执行结果如下图所示:

 

3. 基于注解的方式注入Bean

添加MyBatisConfig ,使用@Bean注解注入数据源、SqlSessionFactoryBean,配置@MapperScan扫描Mapper接口,生成代理对象。

@Configuration
@MapperScan(basePackages = {
   
     "org.pearl.spring.mybatis.demo.dao"})
public class MyBatisConfig {
   
     

    /**
     * 注入SqlSessionFactoryBean
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
   
     
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource());
        return factoryBean.getObject();
    }

    /**
     * 设置Druid数据源,配置相关属性
     */
    @Bean
    public DataSource dataSource() {
   
     
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/demo_user?serverTimezone=Asia/Shanghai");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("123456");
        return druidDataSource;
    }
}

在IOC中获取Mapper生成的代理Bean 对象,就可以进行DAO操作了:

        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyBatisConfig.class);
        UserMapper userMapper11 = annotationConfigApplicationContext.getBean("userMapper", UserMapper.class);
        User user = userMapper11.getUser(12L);
        System.out.println(user);