mybatis框架学习(2) - 整合spring

先引入相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0             
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>
    <groupId>com.pss</groupId>
    <artifactId>mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 设置项目UTF-8 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <springboot.version>2.1.4.RELEASE</springboot.version>
        <java.version>1.8</java.version>
        <mysql.version>5.1.34</mysql.version>
        <mybatis.version>1.3.0</mybatis.version>
        <druid.dbpool.version>1.1.10</druid.dbpool.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.dbpool.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

</project>

 在mybatis-spring-boot-starter中已经包含mybatis-spring的依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
</dependency>

mybatis-spring的官网:http://www.mybatis.org/spring/zh/index.html

 

什么是 MyBatis-Spring?

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

 

mybatis配置中mybatis-config.xml包含常用的environments(数据源)、settings(配置)、mappers(映射文件)。整合spring后mybatis-config.xml就不需要了。

1)数据源交给spring管理

@Bean
public DruidDataSource dataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    // 省略数据源配置代码
    return dataSource;
}

2)SqlSessionFactory使用spring管理

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    
    // 设置XML目录
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    Resource[] resources = resolver.getResources("classpath*:mapper/*Mapper.xml");
    factory.setMapperLocations(resources);
    
    // 设置mybatis setting
    org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
    configuration.setMapUnderscoreToCamelCase(true);
    factory.setConfiguration(configuration);
    return factory.getObject();
}

3) application.xml 写上扫描包实例化@Bean。如果使用springboot启动类的方式就不需要这个文件了。

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
    <context:component-scan base-package="com.pss"/>
</beans>

4)Mapper测试代码

package com.pss.mybatis_spring.dao;

import com.pss.mybatis_spring.model.SysUser;
import java.util.List;

public interface SysUserMapper {
    List<SysUser> selectAll();
}
​<?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.pss.mybatis_spring.dao.SysUserMapper">
    <select id="selectAll" resultType="com.pss.mybatis_spring.model.SysUser">
        select * from sys_user
    </select>
</mapper>
​

5)测试

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        SqlSessionFactory sqlSessionFactory = context.getBean("sqlSessionFactory", SqlSessionFactory.class);
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);
            List<SysUser> sysUsers = mapper.selectAll();
            System.out.println(sysUsers.size());
        } finally {
            if (null != sqlSession) {
                sqlSession.close();
            }
        }
    }
}

现在已经完成通过sqlSessionFactory使用mybatis了。在官网中发现以下说明:

使用 MyBatis API

使用 MyBatis-Spring,你可以继续直接使用 MyBatis 的 API。只需简单地使用 SqlSessionFactoryBean 在 Spring 中创建一个 SqlSessionFactory,然后按你的方式在代码中使用工厂即可。

public class UserDaoImpl implements UserDao {
  // SqlSessionFactory 一般会由 SqlSessionDaoSupport 进行设置
  private final SqlSessionFactory sqlSessionFactory;

  public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
  }

  public User getUser(String userId) {
    // 注意对标准 MyBatis API 的使用 - 手工打开和关闭 session
    try (SqlSession session = sqlSessionFactory.openSession()) {
      return session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
    }
  }
}

小心使用此选项,错误地使用会产生运行时错误,更糟糕地,会产生数据一致性的问题。直接使用 API 时,注意以下弊端:

  • 它不会参与到 Spring 的事务管理之中。

  • 如果 SqlSession 使用与 Spring 事务管理器使用的相同 DataSource,并且有进行中的事务,代码会抛出异常。

  • MyBatis 的 DefaultSqlSession 是线程不安全的。如果在 bean 中注入了它,会发生错误。

  • 使用 DefaultSqlSession 创建的映射器也不是线程安全的。如果你将它们注入到 bean 中,会发生错误。

  • 你必须确保总是在 finally 块中来关闭 SqlSession。

 

接下来不直接使用sqlSession,如果直接getBean("sysUserMapper") 会提示找不到Bean。我找了mybatis官方文档看了一下。通过使用MapperFactoryBean注入参数就可以实现,方法的确可行只是每个都要声明太累了。

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

后面又在 mybatis-spring的文档中看到解决方案:

@MapperScan

当你正在使用 Spring 的基于 Java 的配置时(也就是 @Configuration),相比于使用 <mybatis:scan/>,你会更喜欢用 @MapperScan。

@MapperScan 注解的使用方法如下:

@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {
  // ...
}
这个注解具有与之前见过的 <mybatis:scan/> 元素一样的工作方式。它也可以通过 markerInterface 和 annotationClass 属性设置标记接口或注解类。通过配置 sqlSessionFactory 和 sqlSessionTemplate 属性,你还能指定一个 SqlSessionFactory 或 SqlSessionTemplate。

加上扫描mapper的注解后再次测试

SysUserMapper sysUserMapper = context.getBean("sysUserMapper", SysUserMapper.class);
List<SysUser> sysUsers = sysUserMapper.selectAll();
System.out.println(sysUsers.size());

日志如下:
16:38:38.299 [main] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [com.mysql.jdbc.JDBC4Connection@59221b97] will not be managed by Spring
16:38:38.303 [main] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - ==>  Preparing: select * from sys_user 
16:38:38.324 [main] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - ==> Parameters: 
16:38:38.712 [main] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - <==      Total: 1850
16:38:38.713 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@716a7124]

处理完后,sqlSession也自动关闭了。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值