mybatis与spring的整合之MapperScannerConfigurer


缘起: 之前有讲到用 xml配置单个映射接口 mybatis与spring的整合之MapperFactoryBean和用 注解配置多个映射接口 mybatis与spring的整合之ClassPathMapperScanner,它们都是用 java(注解)编程形式写 sql,这样不易于编写复杂的语句,而且可读性不强,不易于扩展。本篇讲解用 xml形式编写 sql语句,是如何与 Spring结合的源码分析。

项目结构

拿许雪里的项目举例

编写mapper接口也就是 dao

在这里插入图片描述
例如不在接口层面用注解编写sql语句

public interface XxlJobGroupDao {

    public List<XxlJobGroup> findAll();

    public List<XxlJobGroup> findByAddressType(@Param("addressType") int addressType);

    public int save(XxlJobGroup xxlJobGroup);

    public int update(XxlJobGroup xxlJobGroup);

    public int remove(@Param("id") int id);

    public XxlJobGroup load(@Param("id") int id);
}

mapper接口对应的sql配置文件

resource资源路径下编写sql语句
在这里插入图片描述
例如namespace命名空间一定要与mapper接口一致

<?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.xxl.job.admin.dao.XxlJobGroupDao">

<sql id="Base_Column_List">
	t.id,
	t.app_name,
	t.title,
	t.`order`,
	t.address_type,
	t.address_list
</sql>

<select id="findAll" resultMap="XxlJobGroup">
	SELECT <include refid="Base_Column_List" />
	FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
	ORDER BY t.order ASC
</select>
	.
	.
	.
</mapper>

交由spring管理

由spring将mapper接口sql配置文件关联起来

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="mapperLocations" value="classpath:mybatis-mapper/*.xml"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
	<property name="basePackage" value="com.xxl.job.admin.dao" />
</bean>

源码分析

SqlSessionFactoryBean

SqlSessionFactoryBean是一个FactoryBean,作用是注册Configuration解析sql配置文件到Configuration中,并通过getObject()返回SqlSessionFactory

  1. 在后面会用该SqlSessionFactory对象创建SqlSession
  2. 执行sql语句时会从Configuration中拿出sql配置信息

详解看mybatis与spring的整合之SqlSessionFactoryBean

MapperScannerConfigurer

在这里插入图片描述

实现了InitializingBean接口

MapperScannerConfigurer实现了接口InitializingBean,重写了afterPropertiesSet方法
如果basePackage没有注入值,则会报错

public void afterPropertiesSet() throws Exception {
  notNull(this.basePackage, "Property 'basePackage' is required");
}

是工厂处理器

MapperScannerConfigurer是一个工厂处理器,实现了BeanDefinitionRegistryPostProcessor接口,重写了postProcessBeanDefinitionRegistry方法,在执行工厂处理器时spring加载流程refresh之invokeBeanFactoryPostProcessors(beanFactory)会执行该方法:
构造ClassPathMapperScanner,用于扫描并注册映射接口mybatis与spring的整合之ClassPathMapperScanner

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    if (this.processPropertyPlaceHolders) {
      processPropertyPlaceHolders();
    }
	// 构造ClassPathMapperScanner,扫描注册映射接口
    ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
    scanner.setAddToConfig(this.addToConfig);
    scanner.setAnnotationClass(this.annotationClass);
    scanner.setMarkerInterface(this.markerInterface);
    scanner.setSqlSessionFactory(this.sqlSessionFactory);
    scanner.setSqlSessionTemplate(this.sqlSessionTemplate);
    scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);
    scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);
    scanner.setResourceLoader(this.applicationContext);
    scanner.setBeanNameGenerator(this.nameGenerator);
    scanner.registerFilters();
    scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));
  }

注意MapperScannerConfigurer中只有basePackage是必须的,sqlSessionFactory没有必要手动显示注入,spring会根据类型去寻找并注入

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值