spring整合mybatis
效果
在不注入sqlSession的情况下
- 第一种方法:再bean实例化的时候,可以重写BeanDefinitionRegistryPostProcessor,在这里修改beanDefinition,将factoryBean注入到beanClassName,然后注入构造方法,其参数为maper.class,然后注入beanDefiniton,名字是maperName,class是beanDinition,确定是固定了mapper的名字
- 第二种方法就是通过注解,实现importBeanDefinitionRegistrar,在这里通过自定义注解获取mapper的路径,然后重写spring的doscan,在这里修改beanDefition的构造方法,beanClassname,这样就是动态的注入mapper
注入sqlSession
- 首先是声明bean,然后读取mybatis。xml生成sqlsessionFactory,然后再factoryBean中注入sqlSessionFacotry.然后getObject这里就能返回对应的mapper.
贴一下关键代码
package com.mybatis.spring.aop;
import com.mybatis.spring.ZhouyuImportBeanDefinitionRegistrar;
import org.springframework.context.annotation.Import;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created on 2023/4/6.
*
* @author lichuanming
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import(ZhouyuImportBeanDefinitionRegistrar.class)
public @interface ZhouyuMapperScan {
String value();
}
package com.mybatis.spring.mapper;
import com.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* Created on 2023/4/6.
*
* @author lichuanming
*/
public interface UserMapper {
@Select("select * from user ")
List<User> selectById();
}
``
```java
package com.mybatis.spring.service.impl;
import com.mybatis.spring.mapper.OrderMapper;
import com.mybatis.spring.mapper.UserMapper;
import com.mybatis.spring.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* Created on 2023/4/6.
*
* @author lichuanming
*/
@Service
public class UserServiceImpl implements IUserService {
@Resource
UserMapper userMapper;
//@Resource
//OrderMapper orderMapper;
@Override
public void test() {
System.out.println(userMapper.selectById());
//System.out.println(orderMapper.selectById());
}
}
package com.mybatis.spring;
import com.mybatis.spring.aop.ZhouyuMapperScan;
import com.mybatis.spring.mapper.OrderMapper;
import com.mybatis.spring.mapper.UserMapper;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
import java.io.IOException;
import java.util.Map;
/**
* Created on 2023/4/6.
*
* @author lichuanming
*/
public class ZhouyuImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(ZhouyuMapperScan.class.getName());
String path = (String) annotationAttributes.get("value");
//System.out.println("path: " + path);
ZhouyuClassPathBeanDefinitionScanner scanner = new ZhouyuClassPathBeanDefinitionScanner(registry);
scanner.addIncludeFilter(new TypeFilter() {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
return true;
}
});
scanner.scan(path);
//AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
//beanDefinition.setBeanClass(ZhouyuFactoryBean.class);
//beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(UserMapper.class);
//registry.registerBeanDefinition("userMapper", beanDefinition);
//
//AbstractBeanDefinition beanDefinition2 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
//beanDefinition2.setBeanClass(ZhouyuFactoryBean.class);
//beanDefinition2.getConstructorArgumentValues().addGenericArgumentValue(OrderMapper.class);
//registry.registerBeanDefinition("orderMapper", beanDefinition2);
}
}
package com;
import com.mybatis.spring.aop.ZhouyuMapperScan;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.io.InputStream;
/**
* Created on 2023/4/6.
*
* @author lichuanming
*/
@Configuration
@ComponentScan("com.mybatis.spring")
@ZhouyuMapperScan("com.mybatis.spring.mapper")
public class AppConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
}
package com;
import com.mybatis.spring.ZhouyuFactoryBean;
import com.mybatis.spring.mapper.OrderMapper;
import com.mybatis.spring.mapper.UserMapper;
import com.mybatis.spring.service.impl.UserServiceImpl;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* Created on 2023/4/6.
*
* @author lichuanming
*/
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
context.refresh();
UserServiceImpl userServiceImpl = (UserServiceImpl)context.getBean("userServiceImpl");
userServiceImpl.test();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<!-- MySQL 数据库连接信息 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://****:3306/test"/>
<property name="username" value="***"/>
<property name="password" value="***"/>
</dataSource>
</environment>
</environments>
</configuration>
不恋尘世浮华,不写红尘纷扰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-04-06 20天备考初级会计
2022-04-06 俩周备考软考中级-软件设计师
2022-04-06 leetcode原地删除系列-27
2022-04-06 leetcode原地删除系列-283移除0