




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MyBatis底层基础和拦截器,http:/www.mybatis.tk,看一个例子SimpleMyBatis,第一遍从头到尾简单过一遍代码看看代码中的简单注释了解MyBatis内部如何使用这些对象,第二遍我们对照XML来看这段代码了解这些XML和对象之间的关系,代码和XML对照-Configuration,/创建配置文件finalConfigurationconfig=newConfiguration();config.setCacheEnabled(true);config.setLazyLoadingEnabled(false);config.setAggressiveLazyLoading(true);,代码和XML对照-拦截器,/为了后续说明拦截器,这里添加两个简单例子config.addInterceptor(newSampleExecutorInterceptor();config.addInterceptor(newSampleResultSetHandlerInterceptor();,代码和XML对照-Environment,/创建DataSourcePropertiesprops=Resources.getResourceAsProperties(perties);UnpooledDataSourcedataSource=newUnpooledDataSource();dataSource.setDriver(props.getProperty(driver);dataSource.setUrl(props.getProperty(url);dataSource.setUsername(props.getProperty(username);dataSource.setPassword(props.getProperty(password);Transactiontransaction=newJdbcTransaction(dataSource,null,false);finalExecutorexecutor=config.newExecutor(transaction);,代码和XML对照-Cache,finalCachecountryCache=newSynchronizedCache(/同步缓存newSerializedCache(/序列化缓存newLoggingCache(/日志缓存newLruCache(/最少使用缓存newPerpetualCache(country_cache)/持久缓存);msBuilder.cache(countryCache);/相当于将添加到xml的方法上,就是这么复杂的一个对象,我们在中可以配置属性是type和eviction,对应上面代码中PerpetualCache和LruCache,当type不变的时候,就是上面的这个结构,eviction可以修改LruCache这一层,当type修改的时候,整个对象就是你type设置的这一层缓存对象,不会有这么复杂的结构。修饰模式:/wiki/修饰模式,代码和XML对照-select,SELECT*FROMcountryWHEREid=#id,这样的一个(或、)对应的就是一个MappedStatement,这个对象比较复杂,由很多对象组合而成。其中resultType和resultMap对应了ResultMap对象#id会产生ParameterMapping中间的SQL会产生一个合适的SqlSource对象,代码和XML对照-resultMap,finalResultMapresultMap=newResultMap.Builder(config,defaultResultMap,Country.class,newArrayList()/默认都是普通的,有个flags属性可以设置为add(newResultMapping.Builder(config,id,id,int.class).build();add(newResultMapping.Builder(config,countryname,countryname,String.class).build();add(newResultMapping.Builder(config,countrycode,countrycode,registry.getTypeHandler(String.class).build();).build();,代码和XML对照-resultType,finalResultMapresultMap=newResultMap.Builder(config,defaultResultMap,Country.class,newArrayList().build();,resultMap和resultType,ListresultMaps=newArrayList();resultMaps.add(resultMap);/设置返回值的resultMapmsBuilder.resultMaps(resultMaps);,代码和XML对照-SqlSource,StaticSqlSourcesqlSource=newStaticSqlSource(config,SELECT*FROMcountryWHEREid=?);,SELECT*FROMcountryWHEREid=#id,参数映射-ParameterMap,/由于上面的SQL有个参数id,这里需要提供ParameterMapping(参数映射)ListparameterMappings=newArrayList();/通过ParameterMapping.Builder创建ParameterMappingparameterMappings.add(newParameterMapping.Builder(config,id,registry.getTypeHandler(int.class).build();/通过ParameterMap.Builder创建ParameterMapmsBuilder.parameterMap(newParameterMap.Builder(config,defaultParameterMap,Country.class,parameterMappings).build();,MappedStatement,将前面说的这些对象组合到MappedStatement中后,就得到了ms:/创建msMappedStatement.BuildermsBuilder=newMappedStatement.Builder(config,tk.mybatis.selectCountry,sqlSource,SqlCommandType.SELECT);msBuilder.parameterMap(paramBuilder.build();/设置返回值的resultMapmsBuilder.resultMaps(resultMaps);/设置缓存msBuilder.cache(countryCache);/创建msMappedStatementms=msBuilder.build();,第三遍我们重点看(SystemMetaObject)InterceptorSqlSource,SystemMetaObject用法,protectedvoidsetSqlSource(MappedStatementms,SqlSourcesqlSource)MetaObjectmsObject=SystemMetaObject.forObject(ms);msObject.setValue(sqlSource,sqlSource);/如果是Jdbc3KeyGenerator,就设置为MultipleJdbc3KeyGeneratorKeyGeneratorkeyGenerator=ms.getKeyGenerator();if(keyGeneratorinstanceofJdbc3KeyGenerator)msObject.setValue(keyGenerator,newMultipleJdbc3KeyGenerator();,MappedStatementms=(MappedStatement)invocation.getArgs()0;MetaObjectmsObject=SystemMetaObject.forObject(ms);DataSourcedataSource=(DataSource)msObject.getValue(configuration.environment.dataSource);Stringurl=dataSource.getConnection().getMetaData().getURL();,SystemMetaObject两个简单例子:,拦截器-Interceptor,Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)ParameterHandler(getParameterObject,setParameters)ResultSetHandler(handleResultSets,handleOutputParameters)StatementHandler(prepare,parameterize,batch,update,query),MyBatis允许使用插件来拦截的方法调用包括:,SqlSource,ProviderSqlSource:由XXXProvider注解生成的-【执行期间】会传入入参,通过具体判断条件转换为StaticSqlSourceRawSqlSource:通过XML解析,静态SQL的(没有等标签的)会转换为StaticSqlSource,这一步会自动生成ParameterMapDynamicSqlSource:通过XML
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 飞机外勤仪表、电气工职业素养考核试卷及答案
- 打击乐器制作工岗位应急处置技术规程
- 石英晶体滤波器制造工协助他人积极性考核试卷及答案
- 2025房产贷款借款合同
- 2026届河南省淮阳县数学九上期末检测模拟试题含解析
- 个人土地承包合同范例
- 山东省无棣县2026届数学八年级第一学期期末监测模拟试题含解析
- 广东省深圳市光明区2026届数学七年级第一学期期末预测试题含解析
- 2025年物联网MQTT协议性能评估试卷
- 兽医专业知识培训课件
- 江苏省宿迁市沭阳县第一次城乡联考2026届九年级上学期9月月考语文试卷(含答案)
- 颅脑外伤创伤课件
- 生活委员课件
- 民事赔偿赔协议书
- 成人术中非计划低体温预防与护理-中华护理学会团体标准
- 2025春江苏开放大学教师发展与职业道德过程性作业二参考答案
- 防蛇安全小常识中班
- WiFi6基础知识培训
- 文学名著红楼梦故事解读
- 非口服药物的吸收(生物药剂学与药物动力学课件)
- 七年级语文上册课外阅读之《朝花夕拾》读书分享课件
评论
0/150
提交评论