MyBatis整合Spring的实现(17)

这里也只使用一个例子来分析

1 方法bindMapperForNamespace

1private void bindMapperForNamespace() { 2    // cn.vansky.schedule.time.menu.dao.MenuMapper 3    String namespace = builderAssistant.getCurrentNamespace(); 4    if (namespace != null) { 5      Class<?> boundType = null; 6      try { 7        // 根据命名空间来查询相应的接口 8        // interface cn.vansky.schedule.time.menu.dao.MenuMapper 9        boundType = Resources.classForName(namespace); 10      } catch (ClassNotFoundException e) { 11        //ignore, bound type is not required 12      } 13      if (boundType != null) { 14        if (!configuration.hasMapper(boundType)) { 15          // Spring may not know the real resource name so we set a flag 16          // to prevent loading again this resource from the mapper interface 17          // look at MapperAnnotationBuilder#loadXmlResource 18          // 加载过的资源添加到Configuration(全局配置类)里 19          // 属性为Set<String> loadedResources = new HashSet<String>() 20          configuration.addLoadedResource("namespace:" + namespace); 21          // 加载的Mapper添加到Configuration(全局配置类)里 22          // 属性为MapperRegistry mapperRegistry = new MapperRegistry(this) 23          configuration.addMapper(boundType); 24        } 25      } 26    } 27}

上面把加载过的资源文件与加载过的SQLMapper文件放入到Configuration(全局配置类)中。

MyBatis也支持注解方式,那么注释是怎么注入的呢?这个代码就在addMapper方法里面,就来看看相应的代码。

1public <T> void addMapper(Class<T> type) { 2    if (type.isInterface()) { 3      if (hasMapper(type)) { 4        throw new BindingException("Type " + type + " is already known to the MapperRegistry."); 5      } 6      boolean loadCompleted = false; 7      try { 8        knownMappers.put(type, new MapperProxyFactory<T>(type)); 9        // It's important that the type is added before the parser is run 10        // otherwise the binding may automatically be attempted by the 11        // mapper parser. If the type is already known, it won't try. 12        MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type); 13        // 注解的解析 14        parser.parse(); 15        loadCompleted = true; 16      } finally { 17        if (!loadCompleted) { 18          knownMappers.remove(type); 19        } 20      } 21    } 22}

这里不在对注解方式进行分析,有兴趣的童鞋,可以自行分析一下。

上图就是Configuration(全局配置类)中添加Mapper的位置及相应的属性。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang