zoukankan      html  css  js  c++  java
  • 【Java】MyBatis与Spring框架整合(一)

    本文将利用 Spring 对 MyBatis 进行整合,在对组件实现解耦的同时,还能使 MyBatis 框架的使用变得更加方便和简单。

    整合思路

    作为 Bean 容器,Spring 框架提供了 IoC 机制,可以接管所有组件的创建工作并进行依赖管理,因为整合的主要工作就是把 MyBatis 框架使用中所涉及的核心组件配置到 Spring 容器中,交给 Spring 来创建和管理。

    具体来说,业务逻辑对象依赖基于 MyBatis 技术实现的 DAO 对象,核心是获取 SqlSession 实例。要获得 SqlSession 实例,则需要依赖 SqlSessionFactory 实例。而 SqlSessionFactory 是 SqlSessionFactoryBuilder 依据 MyBatis 配置文件中的数据源、Sql映射文件等信息来构建的。

    现在,我们只需把以上流程全部移交给 Spring,发挥 Spring 框架 Bean 容器的作用,就能接管组件的创建工作,管理组件的生命周期,并对组件之间的依赖关系进行解耦合管理。

    准备工作

    1.在项目中加入 Spring、MyBatis 及整合相关的 JAR 文件

    Spring 整合 MyBatis 所需 jar 包

    我已上传到百度云网盘,大家可以点击这里下载,密码: xlk3 

    2.建立开发目录结构,创建实体类

    3.创建数据访问接口

    4.配置 SQL 映射文件

    为 IUserMapper 配置 SQL 语句映射文件 IUserMapper.xml,实现指定的查询映射。

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="cn.xxxx.mapper.IUserMapper">
        <select id="queryAll" resultType="USER">
            select * from user
        </select>
    </mapper>
    复制代码

    5.配置 MyBatis 配置文件

    编写 MyBatis 配置文件 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>
        <!-- 类型别名 -->
        <typeAliases>
            <package name="cn.xxxx.pojo" />
        </typeAliases>
    </configuration>
    复制代码

    这里的 MyBatis 配置文件内容与之前相比简单了许多,这是因为 Spring 可以接管 MyBatis 配置信息的维护工作。我们选择把数据源配置和 SQL 映射信息转移至 Spring 配置文件中进行管理。

    实现整合

    Spring 需要依次完成加载 MyBatis 配置信息、构建 SqlSessionFactory 和 SqlSession 实例,完成对业务逻辑对象的依赖注入等工作。这些工作大多以配置文件的方式实现,无须编写相关类。

    配置数据源

    对于任何持久化解决方案,数据库连接都是首先要解决的问题。在 Spring 中,数据源作为一个重要的组件可以单独进行配置和维护。我们将 MyBatis 配置文件中有关数据源的配置移除,转移到 Spring 配置文件中进行维护。

    这里以配置 dbcp 数据源为例

    复制代码
         <!-- 数据源 —— 数据库连接池管理 dbcp -->
         <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
             <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
             <property name="url" value="jdbc:mysql://localhost:3306/smbms"></property>
             <property name="username" value="root"></property>
             <property name="password" value="ok"></property>
         </bean>
    复制代码

    配置 SqlSessionFactoryBean

    在 MyBatis 中,SqlSessionFactory 的实例需要使用 SqlSessionFactoryBuilder 创建;而在集成环境中,则可以使用 MyBatis-Spring 整合包中的 SqlSessionFactoryBean 来代替。SqlSessionFactoryBean 封装了使用 SqlSessionFactoryBuilder 创建 SqlSessionFactory 的过程,我们可以在 Spring 中以配置文件的形式,通过配置 SqlSessionFactoryBean 获得 SqlSessionFactory 实例。

    复制代码
         <!-- sqlSession工厂 -->
         <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <!-- 引用数据源组件 --> <property name="dataSource" ref="dataSource"></property>
          <!-- 引用 MyBatis 配置文件中的配置 --> <property name="configLocation" value="classpath:mybatis_config.xml"></property>
          <!-- 配置 SQL 映射文件信息 --> <property name="mapperLocations" value="classpath:cn/xxxx/mapper/*.xml"></property> </bean>
    复制代码

     通过上个示例配置的 id 为 SqlSessionFactory 的 Bean 即可获得 SqlSessionFactory 实例。

    示例中 "classpath:cn/xxxx/mapper/*.xml" 表示扫描 cn.xxxx.mapper 包及其任意层级的子包中,任意名称的 xml 类型的文件。

    使用 SqlSessionTemplate 实现数据库的操作

    对于 MyBatis 而言,得到 SqlSessionFactory 实例,就可以进一步获取 SqlSession 实例进行数据库操作。而在集成环境中,为了更好地使用 SqlSession,充分利用 Spring 框架提供的服务,MyBatis-Spring 整合包提供了 SqlSessionTemplate 类。

    SqlSessionTemplate 类实现了 MyBatis 的 SqlSession 接口,可以替换 MyBatis 中原有的 SqlSession 实现类提供数据库访问操作。

    配置 SqlSessionTemplate

    在 IUserMapper 实现类使用注解进行注入,代码如下

    复制代码
     1 @Repository("userMapper")
     2 public class UserMapper implements IUserMapper {
     3 
     4     @Resource(name="sqlSessionTemplate")
     5     private SqlSessionTemplate template;
     6     
     7     @Override
     8     public List<USER> queryAll() {
     9         return template.getMapper(IUserMapper.class).queryAll();
    10     }
    11     
    12 }
    复制代码

    Spring 配置文件代码如下:

    1      <!-- 配置 SqlSessionTemplate -->
    2      <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    3          <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
    4 </bean> 5 <context:component-scan base-package="cn.xxxx.*" />
    6 <aop:aspectj-autoproxy />

    注意:

    1)创建 SqlSessionTemplate 实例时,需要通过其构造方法注入 SqlSessionFactory 实例。这里引用的是前文配置过的 id 为 SqlSessionFactory 的 Bean。

    2)与 MyBatis 中默认的 SqlSession 实现不同,SqlSessionTemplate 是线程安全的,可以以单例模式配置并被多个 DAO 对象共用,而不必为每个 DAO 单独配置一个 SqlSessionTemplate 实例。

    编写业务逻辑代码

    复制代码
     1 import java.util.List;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.beans.factory.annotation.Qualifier;
     5 import org.springframework.stereotype.Service;
     6 import cn.xxxx.mapper.IUserMapper;
     7 import cn.xxxx.pojo.USER;
     8 import cn.xxxx.service.IUserService;
     9 
    10 @Service("userSerivce")
    11 public class UserService implements IUserService{
    12     
    13     @Autowired
    14     @Qualifier("userMapper")
    15     private IUserMapper userMapper;
    16 
    17     @Override
    18     public List<USER> queryAll() {
    19         return userMapper.queryAll();
    20     }
    21 }
    复制代码

    这里使用注解实现组件注入,测试方法省略。。。。

    下次更新注入映射器实现和事务功能

  • 相关阅读:
    C# 使用IComparer自定义List类的排序方案
    ubuntu的vim模式
    linux系统目录结构与层级命令使用
    GitHub托管项目
    应用TortoiseGit为github账号添加SSH keys
    PHP中利用PHPMailer配合QQ邮箱实现发邮件
    QQ互联 网站应用接入
    dedecms 中变量函数
    WebSocket 协议
    前端组件库
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/9237215.html
Copyright © 2011-2022 走看看