好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Springboot+Mybatis中typeAliasesPackage正则扫描实现方式

Mybatis typeAliasesPackage正则扫描

mybatis默认配置typeAliasesPackage是不支持正则扫描package的,因此需要手动继承org.mybatis.spring.SqlSessionFactoryBean,自己实现正则扫描,方法和传统的spring+mybatis没什么区别,不同的是一个需要继承类一个是使用的扫描实现。

对于两个或多个扫描路径,例:

cn测试数据.onethird.integration.entity

cn测试数据.onethird.business.entity

application.properties配置Mybatis 如下

?

1

2

mybatis.typeAliasesPackage=cn测试数据.onethird.*.*.entity

mybatis.mapperLocations=classpath:mapper/*.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

package cn测试数据.onethird.nursinghome;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Properties;

import javax.sql.DataSource;

 

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.SpringApplication;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

import org.springframework.core.env.Environment;

import org.springframework.core.io.Resource;

import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import org.springframework.core.io.support.ResourcePatternResolver;

import org.springframework.core.type.classreading.CachingMetadataReaderFactory;

import org.springframework.core.type.classreading.MetadataReader;

import org.springframework.core.type.classreading.MetadataReaderFactory;

import org.springframework.util.ClassUtils;

import com.Application;

 

/**

  *

  * @Title: MyBatisConfig.java *

  * @Package

  * @Description: mybtis实现正则扫描java bean包 *

  * @author

  * @date

  * @version V1.0

  */

 

@Configuration

@PropertySource ( "classpath:application.properties" )

public class MyBatisConfig {

     @Autowired

     private Environment env;

     static final String DEFAULT_RESOURCE_PATTERN = "**/*.class" ;

     public static String setTypeAliasesPackage(String typeAliasesPackage) {

         ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();

         MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(

                 resolver);

         typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX

                 + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage)

                 + "/" + DEFAULT_RESOURCE_PATTERN;

         try {

             List<String> result = new ArrayList<String>();

             Resource[] resources = resolver.getResources(typeAliasesPackage);

             if (resources != null && resources.length > 0 ) {

                 MetadataReader metadataReader = null ;

                 for (Resource resource : resources) {

                     if (resource.isReadable()) {

                         metadataReader = metadataReaderFactory

                                 .getMetadataReader(resource);

                         try {

                             result.add(Class

                                     .forName(metadataReader.getClassMetadata().getClassName())

                                     .getPackage().getName());

                         } catch (ClassNotFoundException e) {

                             e.printStackTrace();

                         }

                     }

                 }

             }

             if (result.size() > 0 ) {

                 HashSet<String> h = new HashSet<String>(result);

                 result.clear();

                 result.addAll(h);

                 typeAliasesPackage = String.join( "," ,(String[]) result.toArray( new String[ 0 ]));

             } else {

                 throw new RuntimeException(

                         "mybatis typeAliasesPackage 路径扫描错误, 参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包" );

             }

         } catch (IOException e) {

             e.printStackTrace();

         }

         return typeAliasesPackage;

     }

 

     @Bean

     public SqlSessionFactory sqlSessionFactory(DataSource dataSource)

             throws Exception {

         System.out.println( ">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]START>>>>>>>>>>>>>>" );

         Properties props = new Properties();

         String typeAliasesPackage = env

                 .getProperty( "mybatis.typeAliasesPackage" );

         String mapperLocations = env.getProperty( "mybatis.mapperLocations" );

         typeAliasesPackage=setTypeAliasesPackage(typeAliasesPackage);

 

         final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

         sessionFactory.setDataSource(dataSource);

         sessionFactory.setTypeAliasesPackage(typeAliasesPackage);

         sessionFactory.setMapperLocations( new PathMatchingResourcePatternResolver().getResources(mapperLocations));

         System.out.println( ">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]END>>>>>>>>>>>>>>" );

         return sessionFactory.getObject();

     }

 

     public static void main(String[] args) throws Exception {

         setTypeAliasesPackage( "cn测试数据.onethird.*.*.entity" );

     }

}

Mybatis 自定义扫描通配符typeAliasesPackage

typeAliasesPackage 默认只能扫描某一个路径下,或以逗号等分割的 几个路径下的内容,不支持通配符和正则,采用重写的方式解决

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

package com.xxxx.xxx.util测试数据mon;   

import com.xxxx.xxx.util.LogUtil; 

import org.apache测试数据mons.lang3.StringUtils; 

import org.mybatis.spring.SqlSessionFactoryBean; 

import org.slf4j.Logger; 

import org.springframework.core.io.Resource; 

import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 

import org.springframework.core.io.support.ResourcePatternResolver; 

import org.springframework.core.type.classreading.CachingMetadataReaderFactory; 

import org.springframework.core.type.classreading.MetadataReader; 

import org.springframework.core.type.classreading.MetadataReaderFactory; 

import org.springframework.util.ClassUtils; 

  

import java.io.IOException; 

import java.util.ArrayList; 

import java.util.List; 

  

/**

  * Created by Administrator on 2015/10/6.

  */

public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean {   

     static final String DEFAULT_RESOURCE_PATTERN = "**/*.class" ;   

     private static Logger logger = LogUtil.get();   

     @Override

     public void setTypeAliasesPackage(String typeAliasesPackage) { 

         ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); 

         MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); 

         typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + 

                 ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN; 

  

         //将加载多个绝对匹配的所有Resource 

         //将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分 

         //然后进行遍历模式匹配 

         try { 

             List<String> result = new ArrayList<String>(); 

             Resource[] resources =  resolver.getResources(typeAliasesPackage); 

             if (resources != null && resources.length > 0 ){ 

                 MetadataReader metadataReader = null ; 

                 for (Resource resource : resources){ 

                     if (resource.isReadable()){ 

                        metadataReader =  metadataReaderFactory.getMetadataReader(resource); 

                         try { 

                             result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); 

                         } catch (ClassNotFoundException e) { 

                             e.printStackTrace(); 

                         } 

                     } 

                 } 

             } 

             if (result.size() > 0 ) { 

                 super .setTypeAliasesPackage(StringUtils.join(result.toArray(), "," )); 

             } else { 

                 logger.warn( "参数typeAliasesPackage:" +typeAliasesPackage+ ",未找到任何包" ); 

             } 

             //logger.info("d"); 

         } catch (IOException e) { 

             e.printStackTrace(); 

         } 

     }   

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

< bean id = "sqlSession" class = "com.xxxx.xxxx.util测试数据mon.PackagesSqlSessionFactoryBean" > 

         < property name = "configLocation" value = "classpath:config/sqlmap/sqlmap-config.xml" /> 

         < property name = "dataSource" ref = "dataSource" /> 

         <!--<property name="mapperLocations"-->

                   <!--value="classpath*:com/xxxx/xxxx/merchant/**/domain/mapper/*.xml"/>-->

         < property name = "typeAliasesPackage" value = "com.xxxx.xxxx.custom.*.domain" /> 

         < property name = "plugins" > 

             < array > 

                 < ref bean = "pageInterceptor" /> 

             </ array > 

         </ property > 

     </ bean > 

     < bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" > 

         < property name = "basePackage" value = "com.xxxx.xxxx.**.dao" /> 

     </ bean >

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/lin252552/article/details/103668883

查看更多关于Springboot+Mybatis中typeAliasesPackage正则扫描实现方式的详细内容...

  阅读:24次