spring与mybatis的使用

2021-05-05 22:31

阅读:367

标签:lap   定义   ann   instance   run   tor   att   glib   value   

1、spring与mybatis整合配置文件版

  spring与mybaits整合需要一个中间包mybatis-spring,将mybatis交给spring管理,中间包pom依赖如下

    org.mybatis
      mybatis-spring
      2.0.3

完整pom依赖如下

  junit
      junit
      4.11testcom.alibaba
      druid
      1.1.10org.springframework
      spring-core
      5.1.5.RELEASEorg.springframework
      spring-context
      5.1.5.RELEASEorg.springframework
      spring-jdbc
      5.1.5.RELEASEorg.springframework
      spring-tx
      5.1.5.RELEASEorg.springframework
      spring-beans
      5.1.5.RELEASEorg.mybatis
      mybatis
      3.5.3org.aspectj
      aspectjweaver
      1.9.5org.mybatis
      mybatis-spring
      2.0.3mysql
      mysql-connector-java
      5.1.37runtime  

spring的application配置

classpath:jdbc.properties

mybatis config配置

 

之后需要对实体对应的mapper文件进行编写,有xml或者注解的方式进行定义,mapper文件如下。

package com.wonders.bigdata.mapper;

import com.wonders.bigdata.domain.Websites;
import com.wonders.bigdata.domain.WebsitesExample;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface WebsitesMapper {
    int countByExample(WebsitesExample example);

    int deleteByExample(WebsitesExample example);

    int deleteByPrimaryKey(Long id);

    int insert(Websites record);

    int insertSelective(Websites record);

    List selectByExample(WebsitesExample example);

    Websites selectByPrimaryKey(Long id);

    int updateByExampleSelective(@Param("record") Websites record, @Param("example") WebsitesExample example);

    int updateByExample(@Param("record") Websites record, @Param("example") WebsitesExample example);

    int updateByPrimaryKeySelective(Websites record);

    int updateByPrimaryKey(Websites record);

    @Select("select * from bd_websites where id = #{id}")
    Websites findById(Long id);
}  

对应service编写

package com.wonders.bigdata.spring.service;

import com.wonders.bigdata.domain.Websites;

public interface WebsitesService {

    Websites findById(Long id);
}
package com.wonders.bigdata.spring.service.impl;

import com.wonders.bigdata.domain.Websites;
import com.wonders.bigdata.mapper.WebsitesMapper;
import com.wonders.bigdata.spring.service.WebsitesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class WebsitesServiceImpl implements WebsitesService {

    @Autowired
    private WebsitesMapper websitesMapper;

    @Override
    public Websites findById(Long id) {
        return websitesMapper.findById(id);
    }
}  

测试

    @Test
    public void springContext() {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-context.xml");
        MessageService messageService = context.getBean(MessageService.class);
        WebsitesService websitesService = context.getBean(WebsitesService.class);
        System.out.println(messageService.getMessage());

        System.out.println(websitesService.findById(1L));


    }

2、mybatis-spring整合原理

mybatis主要是通过使用sping的ImportBeanDefinitionRegistrar接口来将其交给spring管理,其中实现了ImportBeanDefinitionRegistrar接口的类将会拥有注册bean的能力,而其中对应bean对象的创建是通过实现FactoryBean接口来管理

MapperScannerRegistrar源码

public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AnnotationAttributes mapperScanAttrs = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));
        if (mapperScanAttrs != null) {
            this.registerBeanDefinitions(mapperScanAttrs, registry, generateBaseBeanName(importingClassMetadata, 0));
        }

    }
void registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegistry registry, String beanName) {
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);
        builder.addPropertyValue("processPropertyPlaceHolders", true);
        Class extends Annotation> annotationClass = annoAttrs.getClass("annotationClass");
        if (!Annotation.class.equals(annotationClass)) {
            builder.addPropertyValue("annotationClass", annotationClass);
        }

        Class> markerInterface = annoAttrs.getClass("markerInterface");
        if (!Class.class.equals(markerInterface)) {
            builder.addPropertyValue("markerInterface", markerInterface);
        }

        Class extends BeanNameGenerator> generatorClass = annoAttrs.getClass("nameGenerator");
        if (!BeanNameGenerator.class.equals(generatorClass)) {
            builder.addPropertyValue("nameGenerator", BeanUtils.instantiateClass(generatorClass));
        }

        Class extends MapperFactoryBean> mapperFactoryBeanClass = annoAttrs.getClass("factoryBean");
        if (!MapperFactoryBean.class.equals(mapperFactoryBeanClass)) {
            builder.addPropertyValue("mapperFactoryBeanClass", mapperFactoryBeanClass);
        }

        String sqlSessionTemplateRef = annoAttrs.getString("sqlSessionTemplateRef");
        if (StringUtils.hasText(sqlSessionTemplateRef)) {
            builder.addPropertyValue("sqlSessionTemplateBeanName", annoAttrs.getString("sqlSessionTemplateRef"));
        }

        String sqlSessionFactoryRef = annoAttrs.getString("sqlSessionFactoryRef");
        if (StringUtils.hasText(sqlSessionFactoryRef)) {
            builder.addPropertyValue("sqlSessionFactoryBeanName", annoAttrs.getString("sqlSessionFactoryRef"));
        }

        List basePackages = new ArrayList();
        basePackages.addAll((Collection)Arrays.stream(annoAttrs.getStringArray("value")).filter(StringUtils::hasText).collect(Collectors.toList()));
        basePackages.addAll((Collection)Arrays.stream(annoAttrs.getStringArray("basePackages")).filter(StringUtils::hasText).collect(Collectors.toList()));
        basePackages.addAll((Collection)Arrays.stream(annoAttrs.getClassArray("basePackageClasses")).map(ClassUtils::getPackageName).collect(Collectors.toList()));
        String lazyInitialization = annoAttrs.getString("lazyInitialization");
        if (StringUtils.hasText(lazyInitialization)) {
            builder.addPropertyValue("lazyInitialization", lazyInitialization);
        }

        builder.addPropertyValue("basePackage", StringUtils.collectionToCommaDelimitedString(basePackages));
        registry.registerBeanDefinition(beanName, builder.getBeanDefinition());
    }

根据扫描的mapper名称对bean进行注册

registry.registerBeanDefinition(beanName, builder.getBeanDefinition());

 

spring与mybatis的使用

标签:lap   定义   ann   instance   run   tor   att   glib   value   

原文地址:https://www.cnblogs.com/snow-wolf-1/p/13191524.html


评论


亲,登录后才可以留言!