008-SSM三大框架(三)—— Spring 集成 MyBatis


一、概述


  我们可以利用 ioc 创建对象的功能,把mybatis框架中的对象交给spring统一创建,然后我们直接从 spring 中获取对象,这样就不用同时面对两个或多个框架了, 只需要面对一个 spring 这一个框架。

  将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。



二、 Spring 集成 MyBatis


一、mybatis 使用步骤

  集成之前,我们先回顾一下 mybatis 使用步骤,具体步骤如下:
  链接: 002-SSM三大框架(二)—— 基于Maven工程搭建 MyBatis 开发环境.

  从之前的步骤我们可以看出我们最终是需要使用dao对象来调用方法操作数据库的,但是获得dao对象,我们需要使用getMapper()方法,那么如何能使用getMapper()方法?需要哪些条件?

  1. 创建SqlSessionFactory对象。 通过读取mybatis的主配置文件,能创建SqlSessionFactory对象;
  2. 使用SqlSessionFactory的openSession()方法,获取SqlSession对象;
  3. 有了 SqlSession 就能使用getMapper()方法获取对象;

通过以上说明,我们需要让spring创建以下对象

  1. 独立的连接池类的对象, 使用阿里的druid连接池;
  2. SqlSessionFactory对象;
  3. 创建出dao对象;

二、Spring 集成 MyBatis 步骤

  1. 创建 maven 项目并在 pom.xml 加入 相关依赖 的依赖:
    关于如何创建 maven 项目可参考该链接: 004-IDEA 中基于 Maven 创建 web 工程.
 <dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <!--spring核心ioc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    
    <!--做spring事务用到的-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    
    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    
    <!--mybatis和spring集成的依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>
    
    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
    
    <!--阿里公司的数据库连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>
 </dependencies>

  <build>
    <!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中-->
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
    </plugins>
  </build>
  1. 根据数据库名和列名创建对于的实体类
package com.xzm.domain;

public class User {

    private String userId;
    private String userName;
    private String password;
    private String sex;
    private String email;

    public User() {
    }

    public User(String userId, String userName, String password, String sex, String email) {
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.sex = sex;
        this.email = email;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId='" + userId + '\'' +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

  1. 定义 UserDao 接口和对应的映射文件 UserDao.xml(必须与接口名一致)
public interface UserDao {
    //查询所有用户
    public List<User> findUsers();
}
<?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="com.xzm.dao.UserDao">

    <select id="findUsers" resultType="User">
        select * from users
    </select>
</mapper>

  1. 定义 MyBatis 主配置文件
      在 src 的 resources 目录下定义 MyBatis 的主配置文件,命名为 mybatis.xml,这里有两点需要注意:
     (1)主配置文件中不再需要数据源的配置了。因为数据源要交给 Spring 容器来管理了。
     (2)这里对 mapper 映射文件的注册,使用< package/>标签,即只需给出 mapper 映射文件所在的包即可。因为 mapper 的名称与 Dao 接口名相同,可以使用这种简单注册方式。这种方式的好处是,若有多个映射文件,这里的配置也是不用改变的。当然,也可使用原来的< resource/>标签方式。
<?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:控制mybatis全局行为-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>


    <!--设置别名-->
    <typeAliases>
        <package name="com.xzm.domain"/>
    </typeAliases>


    <!-- sql mapper(sql映射文件)的位置-->
    <mappers>
        <package name="com.xzm.dao"/>
    </mappers>
</configuration>


  1. 定义数据库配置的属性文件
      为了便于维护,可以将数据库连接信息写入到属性文件中,使 Spring 配置文件从中读取数据。
      在 src 的 resources 目录下定义 jdbc.properties 文件
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.passwd=123456
jdbc.max=30

  1. 定义Spring 配置文件
      在 src 的 resources 目录下定义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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--
       把数据库的配置信息,写在一个独立的文件,编译修改数据库的配置内容
       spring知道jdbc.properties文件的位置
    -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--声明数据源DataSource, 作用是连接数据库的-->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <!--set注入给DruidDataSource提供连接数据库信息 -->
        <!--    使用属性配置文件中的数据,语法  -->
        <property name="url" value="${jdbc.url}"/><!--setUrl()-->
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.passwd}"/>
        <property name="maxActive" value="${jdbc.max}"/>
    </bean>

    <!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的
        SqlSessionFactory  sqlSessionFactory = new ..
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--set注入,把数据库连接池付给了dataSource属性-->
        <property name="dataSource" ref="myDataSource"/>
        <!--mybatis主配置文件的位置
           configLocation属性是Resource类型,读取配置文件
           它的赋值,使用value,指定文件的路径,使用classpath:表示文件的位置
        -->
        <property name="configLocation" value="classpath:mybatis.xml"/>
    </bean>

    <!--创建dao对象,使用SqlSession的getMapper(StudentDao.class)
        MapperScannerConfigurer:在内部调用getMapper()生成每个dao接口的代理对象。

    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定SqlSessionFactory对象的id-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--指定包名, 包名是dao接口所在的包名。
            MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行
            一次getMapper()方法,得到每个接口的dao对象。
            创建好的dao对象放入到spring的容器中的。 dao对象的默认名称是 接口名首字母小写
        -->
        <property name="basePackage" value="com.xzm.dao"/>
    </bean>

	<--! 注解扫描器-->
    <context:component-scan base-package="com.xzm"></context:component-scan>

</beans>

  1. 定义 Service 接口和实现类
public interface UserService {

    public List<User> findUsers();

}
//基于注解创建对象
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> findUsers() {
        List<User> lists = userDao.findUsers();
        return lists;
    }
}

  1. 定义测试类,执行成功
@Test
    public void shouldAnswerWithTrue()
    {
        ApplicationContext as = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserService userService = (UserService) as.getBean("userService");
        System.out.println(userService.findUsers());
    }


相关链接:

链接: 007-SSM三大框架(三)—— Spring 的面向切面编程(AOP).
链接: 006-SSM三大框架(三)—— Spring 的 IoC 控制反转.
链接: 004-SSM三大框架(二)—— MyBatis 框架动态 SQL.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值