Java -- Spring学习笔记6、Spring集成MyBatis

1、Spring集成MyBatis

在使用MyBatis开发时、创建SqlSessionFactory对象需要自己手动创建、也就是使用SqlSessionFactoryBuilder.build()、而在spring框架中、对象统一交由容器管理、所以、spring集成mybatis主要解决的问题就是将SqlSessionFactory对象交由Spring来管理。只需要将SqlSessionFactory的对象生成器 SqlSessionFactoryBean注册在Spring容器中,再将其注入给Dao的实现类即可完成整合。

实现Spring与MyBatis的整合常用的方式:扫描的Mapper动态代理。

2、具体实现步骤

  • 添加maven依赖和插件、如下:
<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <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>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>
    <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>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  • 创建实体类、如下:
public class UserInfo
{
    private int id;
    private String name;
    private int age;
    //getter setter toString()...
}
  • 在dao层创建接口、如下:
public interface UserInfoDao
{
    int insertUser(UserInfo userInfo);

    int updateUser(UserInfo userInfo);

    int deleteUser(int id);

    UserInfo selectUser(int id);

    List<UserInfo> selectUserAll();
}
  • 创建对应的mapper文件、如下:
<mapper namespace="com.rg.dao.UserInfoDao">
    <insert id="insertUser" parameterType="UserInfo">
        insert into UserInfo(Age,Name) values(#{name},#{age})
    </insert>
    <update id="updateUser" parameterType="UserInfo">
        update UserInfo set Name=#{name},Age=#{age} where id=#{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from UserInfo where id=#{id}
    </delete>
    <select id="selectUser" resultType="UserInfo" parameterType="int">
        select Name,Age from UserInfo where id=#{id}
    </select>
    <select id="selectUserAll" resultType="UserInfo">
        select Name,Age from UserInfo
    </select>
</mapper>
  • 在service层创建接口、如下:
public interface UserInfoService
{
    int addUser(UserInfo userInfo);

    int modifyUser(UserInfo userInfo);

    int deleteUser(int id);

    UserInfo selectUser(int id);

    List<UserInfo> selectUserAll();
}
  • 实现类如下:
public class UserInfoServiceImpl implements UserInfoService
{
    private UserInfoDao userInfoDao;

    public void setUserInfoDao(UserInfoDao userInfoDao)
    {
        this.userInfoDao = userInfoDao;
    }

    @Override
    public int addUser(UserInfo userInfo)
    {
        return userInfoDao.insertUser(userInfo);
    }

    @Override
    public int modifyUser(UserInfo userInfo)
    {
        return userInfoDao.updateUser(userInfo);
    }

    @Override
    public int deleteUser(int id)
    {
        return userInfoDao.deleteUser(id);
    }

    @Override
    public UserInfo selectUser(int id)
    {
        return userInfoDao.selectUser(id);
    }

    @Override
    public List<UserInfo> selectUserAll()
    {
        return userInfoDao.selectUserAll();
    }
}

在resources目录下创建三个文件夹、里边存放properties文件、mybatis.xml、applicationContext.xml(spring配置文件)

  • jdbc文件夹下的属性文件存放数据库信息:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/StudentManage?characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=root
  • mybatis文件夹下的mybatis配置文件、如下:
<configuration>
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases>
        <package name="com.rg.entity"/>
    </typeAliases>
    <!--SQL映射文件的位置-->
    <mappers>
        <package name="com.rg.dao"/>
    </mappers>
</configuration>

需注意、主配置文件中不再需要数据源的配置了。因为数据源要交给Spring容器来管理了

  • spring文件夹下的applicationContext.xml配置文件、如下:
<!--
        Druid:阿里的开源数据库连接池、这里不需要driver、可以根据url检测出驱动
        每个属性值都从属性文件中读取、这里需要注意:name的值最好不要和属性文件中key的值相同、如果相同可能会出现错误
    -->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--
        Spring若想要读取配置文,其必须在配置文件中进行注册。使用<context>标签、如下:
    -->
    <context:property-placeholder location="classpath:jdbc/jdbc.properties"/>

    <!--
         注册SqlSessionFactoryBean
         在使用mybatis创建sqlSessionFactory对象时候、也是需要读取mybatis.xml文件和文件中的数据源
         而在spring中、这里bean标签里有两个property、里边的值就是数据源和mybatis.xml文件
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="configLocation" value="classpath:mybatis/mybatis.xml"/>
    </bean>

    <!--
        Mapper扫描配置器MapperScannerConfigurer:会自动生成指定的基本包中mapper的代
        理对象。该Bean无需设置id属性。basePackage使用分号或逗号设置多个包。

        在mybatis框架中、创建代理对象、需要通过sqlSessionFactory获取SqlSession,然后调用getMapper()
        该方法的参数为指定Dao接口类的class值。

        这里bean标签里也有两个property、里边的内容分别是sqlSessionFactory和Dao接口中所有类
        只不过、获取代理对象交由spring来做。

        MapperScannerConfigurer会将com.rg.dao包下所以接口都执行一次geiMapper方法,
        得到每个接口的dao对象,把创建好的dao对象,放到spring容器中。
        dao对象名称:接口名称首字母小写
        比如接口名称StudentDao、那么对象名称为studentDao
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.rg.dao"/>
    </bean>
    <!-- 
        这里的ref="userInfoDao"中的userInfoDao就是上方Mapper扫描配置器扫描完成后、spring创建的代理对象。
        由于通过Mapper扫描配置器MapperScannerConfigurer生成的Mapper代理对象没有名称。
        所以在向Service注入Mapper代理时,无法通过名称注入。
        但可通过接口的简单类名注入,因为生成的是这个 Dao 接口的对象
     -->
    <bean id="userInfoService" class="com.rg.service.impl.UserInfoServiceImpl">
        <property name="userInfoDao" ref="userInfoDao"/>
    </bean>
  • 测试方法:
@Test
    public void test01()
    {
        String config = "spring/applicationContext.xml";
        ApplicationContext atx = new ClassPathXmlApplicationContext(config);
        UserInfoService userInfoService = (UserInfoService) atx.getBean("userInfoService");
        List<UserInfo> userInfoList = userInfoService.selectUserAll();
        System.out.println(userInfoList);
    }

概括来讲、使用spring集成mybatis就是在原先使用mybatis框架时候、需要在Java代码里创建的对象、统一交由spring来完成,内部原理还是一样的。比如、创建数据源、从属性文件中读取数据、创建sqlSessionFactory对象、要使用到数据源和mybatis.xml文件等等。

posted @ 2021-05-15 11:50  初晨~  阅读(120)  评论(0编辑  收藏  举报