spring与mybatis的使用
2021-05-05 22:31
标签:lap 定义 ann instance run tor att glib value
1、spring与mybatis整合配置文件版
spring与mybaits整合需要一个中间包mybatis-spring,将mybatis交给spring管理,中间包pom依赖如下
org.mybatis mybatis-spring2.0.3
完整pom依赖如下
junit junit4.11 test com.alibaba druid1.1.10 org.springframework spring-core5.1.5.RELEASE org.springframework spring-context5.1.5.RELEASE org.springframework spring-jdbc5.1.5.RELEASE org.springframework spring-tx5.1.5.RELEASE org.springframework spring-beans5.1.5.RELEASE org.mybatis mybatis3.5.3 org.aspectj aspectjweaver1.9.5 org.mybatis mybatis-spring2.0.3 mysql mysql-connector-java5.1.37 runtime
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
下一篇:Spring注解总结