spring整合mybatis

效果
image

在不注入sqlSession的情况下

  1. 第一种方法:再bean实例化的时候,可以重写BeanDefinitionRegistryPostProcessor,在这里修改beanDefinition,将factoryBean注入到beanClassName,然后注入构造方法,其参数为maper.class,然后注入beanDefiniton,名字是maperName,class是beanDinition,确定是固定了mapper的名字
  2. 第二种方法就是通过注解,实现importBeanDefinitionRegistrar,在这里通过自定义注解获取mapper的路径,然后重写spring的doscan,在这里修改beanDefition的构造方法,beanClassname,这样就是动态的注入mapper

注入sqlSession

  1. 首先是声明bean,然后读取mybatis。xml生成sqlsessionFactory,然后再factoryBean中注入sqlSessionFacotry.然后getObject这里就能返回对应的mapper.

贴一下关键代码
image

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>



posted @ 2023-04-06 16:21  小傻孩丶儿  阅读(20)  评论(4编辑  收藏  举报