Spring4️⃣整合MyBatis

SSM 整合

  • 原始方式:MyBatis 相关配置文件、Spring 相关配置文件。
  • Spring 整合 MyBatis:在 Spring 配置文件中配置MyBatis 的配置。
    (即:由 Spring 完成 MyBatis 的工作)

回顾

1、环境搭建

1.1、业务实体

以 user(id, name, password) 为例

  • user 表

    image-20220405234013153

  • User 类

    public class User {
        private String userId;
        private String name;
        private String password;
        // 构造方法
        // toString()、getter、setter
    }
    

1.2、项目依赖

核心项目依赖

  • Spring:导入 webmvc 即可引入相关 Spring 依赖。

  • MyBatis:MySQL 驱动、MyBatis 依赖

    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.9</version>
    </dependency>
    <!-- MyBatis -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    

2、原始方式

在项目中使用两个框架,二者互不依赖。

2.1、MyBatis 环境

  • 配置文件:数据源、日志等
  • 核心配置文件:通常命名 SqlMapConfig 或 mybatis-config
  • 工具类:生成 sqlSession

2.1.1、数据源配置文件

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://数据库名:端口号?参数
jdbc.username=用户名
jdbc.password=密码

2.1.2、核心配置文件

mybatis-config.xml

  • 引入数据源配置文件

  • 命名映射:将数据库列名(xxx_yyy)自动映射为 Java 属性名(xxxYyy)

  • 类型别名:pojo

  • 环境配置

  • 注册 Mapper

    <?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>
        <properties resource="jdbc.properties"/>
    
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>     </settings>
    
        <typeAliases>
            <package name="indi.jaywee.pojo"/>
        </typeAliases>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="映射文件的路径"/>
            <mapper class="Mapper接口的全限类名"/>
        </mappers>
    </configuration>
    

2.1.3、工具类

MyBatisUtils

public class MyBatisUtils {
    private static final SqlSessionFactory SQL_SESSION_FACTORY;

    static {
        String resource = "mybatis-config.xml";
        InputStream is = null;
        try {
            // 加载核心配置文件
            is = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 构建sqlSessionFactory
        SQL_SESSION_FACTORY = new SqlSessionFactoryBuilder().build(is);
    }

    public static SqlSession getSqlSession() {
        // 创建sqlSession实例
        return SQL_SESSION_FACTORY.openSession();
    }
}

2.2、Spring 环境

Spring 核心配置文件:applicationContext.xml

注解扫描:dao、pojo、service

<context:component-scan base-package="indi.jaywee.mapper"/>
<context:component-scan base-package="indi.jaywee.pojo"/>
<context:component-scan base-package="indi.jaywee.service"/>

2.3、Mapper 开发及测试

2.3.1、UserMapper

  • Mapper 接口

    public interface UserMapper {
        User getUserByUserId(String userId);
        int insertUser(User user);
    }
    
  • Mapper.xml:存放在 resouces 目录,Mapper 接口的同级包下。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="indi.jaywee.mapper.UserMapper">
        <select id="getUserByUserId" parameterType="string" resultType="user">
            SELECT user_id, name, password
            FROM study_mysql.t_user
            WHERE user_id = #{userId}
        </select>
        
        <insert id="insertUser" parameterType="user">
            INSERT INTO study_mysql.t_user(user_id, name, password)
            VALUE (#{userId}, #{name}, #{password})
        </insert>
    </mapper>
    

2.3.2、测试

模拟 Service 层,调用 Mapper 层方法

  1. 获得 sqlSession 对象

  2. 通过 sqlSession 对象获取 Mapper 接口的动态代理实现类。

  3. 调用 Mapper 接口方法。

  4. 关闭 sqlSession。

    private UserMapper mapper;
    
    @Test
    public void testGetUserByUserId() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserByUserId("u_jaywee");
        System.out.println(user);
    
        sqlSession.close();
    }
    

2.4、分析

原始方式整合,没有体现 Spring 容器的优势。

  • 配置文件:创建 MyBatis 和 Spring 的配置文件,各自进行配置。
  • 获取 Mapper:需手动获取
    1. 在工具类中加载核心配置文件,构造 sqlSessionFactory,创建 sqlSession。
    2. 从工具类中获取 sqlSession,获取 Mapper 接口。
  • 事务:由 MyBatis 控制事务。

优化

  • 配置文件:在 Spring 配置文件中配置 MyBatis 的配置。
  • 获取 Mapper:配置后自动注入
    1. sqlSessionFactoryBean:用于创建 sqlSession。
    2. Mapper 扫描配置器:扫描 Mapper 并创建实现类,注入依赖。
  • 事务:Spring 声明式事务控制。

3、Spring 整合 MyBatis(❗)

由 Spring 容器完成 MyBatis 的工作,关键在于配置文件。

3.1、导入依赖

  • 框架整合:mybatis-spring

  • 获取数据源:spring-jdbc

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.9</version>
    </dependency>
    

3.2、整合配置文件(❗)

Spring 可完成所有 MyBatis 的相关配置。

  • 为区分职责,通常会保留 mybatis-config,进行 settings 和 typeAliases 的配置。
  • 其余配置由 Spring 完成。

3.2.1、mybatis-config

保留 settings 和 typeAliases 的配置。

<?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>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <package name="indi.jaywee.pojo"/>
    </typeAliases>
</configuration>

3.2.2、mybatis-spring

  • 引入数据源配置文件

  • 数据源:在 MyBatis 中的 mybatis-config 设置

  • sqlSessionFactory:绑定数据源、MyBatis 配置文件。

  • Mapper 扫描配置器:扫描 Mapper,生成动态代理实现类。

    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="mybatis-config.xml"/>
    </bean>
    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="indi.jaywee.mapper"/>
    </bean>
    

applicationContext.xml

导入整合配置文件。

<import resource="mybatis-spring.xml"/>

3.3、测试

Service 层

专注于调用 Mapper 接口方法,由 Spring 加载配置文件、获取 sqlSession 等。

  • 接口

    public interface UserService {
        User getUserByUserId(String userId);
        int insertUser(User user);
    }
    
  • 实现类:定义成员变量 UserMapper,自动注入依赖。

    @Service
    public class UserServiceImpl implements UserService {
        @Resource
        private UserMapper mapper;
    
        @Override
        public User getUserByUserId(String userId) {
            return mapper.getUserByUserId(userId);
        }
    
        @Override
        public int insertUser(User user) {
            return mapper.insertUser(user);
        }
    }
    
posted @ 2021-08-02 20:19  Jaywee  阅读(101)  评论(0编辑  收藏  举报

👇