安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

Mybatis手撸专栏第5章数据源的解析创建和使用

10月22日 听雨眠投稿
  目录
  一、前言二、目标三、设计四、实现1。工程结构2。事务管理3。类型别名注册器4。解析数据源配置5。SQL执行和结果封装六、测试1。事先准备2。单元测试七、总结
  一、前言
  管你吃几碗粉,有流量就行!
  现在我们每天所接收的信息量越来越多,但很多的个人却没有多少分辨知识的能力。很多知识信息也只是蹭热点的泛知识,但泛知识只是一种空泛、不成系统、甚至可能是错误的信息群,不过就是这样的信息却给内容消费者一种成功获取了知识吃饱的幻觉,却丧失了对知识层次的把控。
  而作为一个本身就很理科的程序员来说,如果都是被泛知识充斥,花费着自己的精力和时间,没有经过足够的脑力思考所吸收的泛技术内容,长期以往是很难有所成长的。
  以为我个人的成长经历来看,我更愿意花很多的实际来解决一个问题,而不是一片问题。当一个问题解决的足够透彻、清晰、明确以后,再结合着这个知识点所需要的内容继续扩展和深挖。很庆幸当年没有那么多的泛知识内容推送,否则可能我也会被弄的很焦虑!二、目标
  在上一章节我们解析XML中的SQL配置信息,并在代理对象调用DefaultSqlSession中进行获取和打印操作,从整个框架结构来看我们解决了对象的代理、Mapper的映射、SQL的初步解析,那么接下来就应该是连库和执行SQL语句并返回结果了。
  那么这部分内容就会涉及到解析XML中关于dataSource数据源信息配置,并建立事务管理和连接池的启动和使用。并将这部分能力在DefaultSqlSession执行SQL语句时进行调用。但为了不至于在一个章节把整个工程撑大,这里我们会把重点放到解析配置、建立事务框架和引入DRUID连接池,以及初步完成SQL的执行和结果简单包装上。便于读者先熟悉整个框架结构,在后续章节再陆续迭代和完善框架细节。三、设计
  建立数据源连接池和JDBC事务工厂操作,并以xml配置数据源信息为入口,在XMLConfigBuilder中添加数据源解析和构建操作,向配置类configuration添加JDBC操作环境信息。以便在DefaultSqlSession完成对JDBC执行SQL的操作。
  图51数据源的解析和使用在parse中解析XMLDB链接配置信息,并完成事务工厂和连接池的注册环境到配置类的操作。与上一章节改造selectOne方法的处理,不再是打印SQL语句,而是把SQL语句放到DB连接池中进行执行,以及完成简单的结果封装。四、实现1。工程结构mybatisstep04srcmainjavacn。bugstack。mybatisbindingMapperMethod。javaMapperProxy。javaMapperProxyFactory。javaMapperRegistry。javabuilderxmlXMLConfigBuilder。javaBaseBuilder。javadatasourcedruidDruidDataSourceFactory。javaDataSourceFactory。javaioResources。javamappingBoundSql。javaEnvironment。javaMappedStatement。javaParameterMapping。javaSqlCommandType。javasessiondefaultsDefaultSqlSession。javaDefaultSqlSessionFactory。javaConfiguration。javaSqlSession。javaSqlSessionFactory。javaSqlSessionFactoryBuilder。javaTransactionIsolationLevel。javatransactionjdbcJdbcTransaction。javaJdbcTransactionFactory。javaTransaction。javaTransactionFactory。javatypeJdbcType。javaTypeAliasRegistry。javatestjavacn。bugstack。mybatis。test。daodaoIUserDao。javapoUser。javaApiTest。javaresourcesmapperUserMapper。xmlmybatisconfigdatasource。xml
  工程源码:https:t。zsxq。combmqNFQ7
  数据源的解析和使用核心类关系,如图52所示
  图52数据源的解析和使用核心类关系以事务接口Transaction和事务工厂TransactionFactory的实现,包装数据源DruidDataSourceFactory的功能。这里的数据源连接池我们采用的是阿里的Druid,暂时还没有实现Mybatis的JNDI和Pooled连接池,这部分可以后续专门以数据源连接池的专项来开发。当所有的数据源相关功能准备好后,就是在XMLConfigBuilder解析XML配置操作中,对数据源的配置进行解析以及创建出相应的服务,存放到Configuration的环境配置中。最后在DefaultSqlSessionselectOne方法中完成SQL的执行和结果封装,最终就把整个Mybatis核心脉络串联出来了。2。事务管理
  一次数据库的操作应该具有事务管理能力,而不是通过JDBC获取链接后直接执行即可。还应该把控链接、提交、回滚和关闭的操作处理。所以这里我们结合JDBC的能力封装事务管理。2。1事务接口
  详见源码:cn。bugstack。mybatis。transaction。TransactionpublicinterfaceTransaction{ConnectiongetConnection()throwsSQLEvoidcommit()throwsSQLEvoidrollback()throwsSQLEvoidclose()throwsSQLE}定义标准的事务接口,链接、提交、回滚、关闭,具体可以由不同的事务方式进行实现,包括:JDBC和托管事务,托管事务是交给Spring这样的容器来管理。
  详见源码:cn。bugstack。mybatis。transaction。jdbc。JdbcTransactionpublicclassJdbcTransactionimplementsTransaction{protectedCprotectedDataSourcedataSprotectedTransactionIsolationLevellevelTransactionIsolationLevel。NONE;protectedbooleanautoCpublicJdbcTransaction(DataSourcedataSource,TransactionIsolationLevellevel,booleanautoCommit){this。dataSourcedataSthis。this。autoCommitautoC}OverridepublicConnectiongetConnection()throwsSQLException{connectiondataSource。getConnection();connection。setTransactionIsolation(level。getLevel());connection。setAutoCommit(autoCommit);}Overridepublicvoidcommit()throwsSQLException{if(connection!null!connection。getAutoCommit()){connection。commit();}}。。。}在JDBC事务实现类中,封装了获取链接、提交事务等操作,其实使用的也就是JDBC本身提供的能力。
  嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
  无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
  点击这里找小助理0元领取:加微信领取资料
  2。2事务工厂
  详见源码:cn。bugstack。mybatis。transaction。TransactionFactorypublicinterfaceTransactionFactory{根据Connection创建TransactionparamconnExistingdatabaseconnectionreturnTransactionTransactionnewTransaction(Connectionconn);根据数据源和事务隔离级别创建TransactionparamdataSourceDataSourcetotaketheconnectionfromparamlevelDesiredisolationlevelparamautoCommitDesiredautocommitreturnTransactionTransactionnewTransaction(DataSourcedataSource,TransactionIsolationLevellevel,booleanautoCommit);}以工厂方法模式包装JDBC事务实现,为每一个事务实现都提供一个对应的工厂。与简单工厂的接口包装不同。3。类型别名注册器
  在Mybatis框架中我们所需要的基本类型、数组类型以及自己定义的事务实现和事务工厂都需要注册到类型别名的注册器中进行管理,在我们需要使用的时候可以从注册器中获取到具体的对象类型,之后在进行实例化的方式进行使用。3。1基础注册器
  详见源码:cn。bugstack。mybatis。type。TypeAliasRegistrypublicclassTypeAliasRegistry{privatefinalMapString,C?TYPEALIASESnewHashMap();publicTypeAliasRegistry(){构造函数里注册系统内置的类型别名registerAlias(string,String。class);基本包装类型registerAlias(byte,Byte。class);registerAlias(long,Long。class);registerAlias(short,Short。class);registerAlias(int,Integer。class);registerAlias(integer,Integer。class);registerAlias(double,Double。class);registerAlias(float,Float。class);registerAlias(boolean,Boolean。class);}publicvoidregisterAlias(Stringalias,C?value){Stringkeyalias。toLowerCase(Locale。ENGLISH);TYPEALIASES。put(key,value);}publicTClassTresolveAlias(Stringstring){Stringkeystring。toLowerCase(Locale。ENGLISH);return(ClassT)TYPEALIASES。get(key);}}在TypeAliasRegistry类型别名注册器中先做了一些基本的类型注册,以及提供registerAlias注册方法和resolveAlias获取方法。3。2注册事务
  详见源码:cn。bugstack。mybatis。session。ConfigurationpublicclassConfiguration{环境protectedE映射注册机protectedMapperRegistrymapperRegistrynewMapperRegistry(this);映射的语句,存在Map里protectedfinalMapString,MappedStatementmappedStatementsnewHashMap();类型别名注册机protectedfinalTypeAliasRegistrytypeAliasRegistrynewTypeAliasRegistry();publicConfiguration(){typeAliasRegistry。registerAlias(JDBC,JdbcTransactionFactory。class);typeAliasRegistry。registerAlias(DRUID,DruidDataSourceFactory。class);}。。。}在Configuration配置选项类中,添加类型别名注册机,通过构造函数添加JDBC、DRUID注册操作。读者应该注意到,整个Mybatis的操作都是使用Configuration配置项进行串联流程,所以所有内容都会在Configuration中进行链接。4。解析数据源配置
  通过在XML解析器XMLConfigBuilder中,扩展对环境信息的解析,我们这里把数据源、事务类内容称为操作SQL的环境。解析后把配置信息写入到Configuration配置项中,便于后续使用。
  详见源码:cn。bugstack。mybatis。builder。xml。XMLConfigBuilderpublicclassXMLConfigBuilderextendsBaseBuilder{publicConfigurationparse(){try{环境environmentsElement(root。element(environments));解析映射器mapperElement(root。element(mappers));}catch(Exceptione){thrownewRuntimeException(ErrorparsingSQLMapperConfiguration。Cause:e,e);}}privatevoidenvironmentsElement(Elementcontext)throwsException{Stringenvironmentcontext。attributeValue(default);ListElementenvironmentListcontext。elements(environment);for(Elemente:environmentList){Stringide。attributeValue(id);if(environment。equals(id)){事务管理器TransactionFactorytxFactory(TransactionFactory)typeAliasRegistry。resolveAlias(e。element(transactionManager)。attributeValue(type))。newInstance();数据源ElementdataSourceElemente。element(dataSource);DataSourceFactorydataSourceFactory(DataSourceFactory)typeAliasRegistry。resolveAlias(dataSourceElement。attributeValue(type))。newInstance();ListElementpropertyListdataSourceElement。elements(property);PropertiespropsnewProperties();for(Elementproperty:propertyList){props。setProperty(property。attributeValue(name),property。attributeValue(value));}dataSourceFactory。setProperties(props);DataSourcedataSourcedataSourceFactory。getDataSource();构建环境Environment。BuilderenvironmentBuildernewEnvironment。Builder(id)。transactionFactory(txFactory)。dataSource(dataSource);configuration。setEnvironment(environmentBuilder。build());}}}}以XMLConfigBuilderparse解析扩展对数据源解析操作,在environmentsElement方法中包括事务管理器解析和从类型注册器中读取到事务工程的实现类,同理数据源也是从类型注册器中获取。最后把事务管理器和数据源的处理,通过环境构建Environment。Builder存放到Configuration配置项中,也就可以通过Configuration存在的地方都可以获取到数据源了。5。SQL执行和结果封装
  在上一章节中在DefaultSqlSessionselectOne只是打印了XML中配置的SQL语句,现在把数据源的配置加载进来以后,就可以把SQL语句放到数据源中进行执行以及结果封装。
  详见源码:cn。bugstack。mybatis。session。defaults。DefaultSqlSessionpublicclassDefaultSqlSessionimplementsSqlSession{privateCpublicDefaultSqlSession(Configurationconfiguration){this。}OverridepublicTTselectOne(Stringstatement,Objectparameter){try{MappedStatementmappedStatementconfiguration。getMappedStatement(statement);Environmentenvironmentconfiguration。getEnvironment();Connectionconnectionenvironment。getDataSource()。getConnection();BoundSqlboundSqlmappedStatement。getBoundSql();PreparedStatementpreparedStatementconnection。prepareStatement(boundSql。getSql());preparedStatement。setLong(1,Long。parseLong(((Object〔〕)parameter)〔0〕。toString()));ResultSetresultSetpreparedStatement。executeQuery();ListTobjListresultSet2Obj(resultSet,Class。forName(boundSql。getResultType()));returnobjList。get(0);}catch(Exceptione){e。printStackTrace();}}。。。}在selectOne方法中获取Connection数据源链接,并简单的执行SQL语句,并对执行的结果进行封装处理。因为目前这部分主要是为了大家串联出整个功能结构,所以关于SQL的执行、参数传递和结果封装都是写死的,后续我们进行扩展。六、测试1。事先准备1。1创建库表
  创建一个数据库名称为mybatis并在库中创建表user以及添加测试数据,如下:CREATETABLEUSER(idbigintNOTNULLAUTOINCREMENTCOMMENT自增ID,userIdVARCHAR(9)COMMENT用户ID,userHeadVARCHAR(16)COMMENT用户头像,createTimeTIMESTAMPNULLCOMMENT创建时间,updateTimeTIMESTAMPNULLCOMMENT更新时间,userNameVARCHAR(64),PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8;insertintouser(id,userId,userHead,createTime,updateTime,userName)values(1,10001,104,2022041300:00:00,2022041300:00:00,小傅哥);2。配置数据源environmentsdefaultdevelopmentenvironmentiddevelopmenttransactionManagertypeJDBCdataSourcetypeDRUIDpropertynamedrivervaluecom。mysql。jdbc。Driverpropertynameurlvaluejdbc:mysql:127。0。0。1:3306mybatis?useUnicodetruepropertynameusernamevaluerootpropertynamepasswordvalue123456dataSourceenvironmentenvironments通过mybatisconfigdatasource。xml配置数据源信息,包括:driver、url、username、password另外这里要注意下,DataSource配置的是DRUID,因为我们实现的是这个数据源的处理方式。3。配置MapperselectidqueryUserInfoByIdparameterTypejava。lang。LongresultTypecn。bugstack。mybatis。test。po。UserSELECTid,userId,userName,userHeadFROMuserwhereid{id}selectMapper的配置内容在上一章节的解析学习中已经做了配置,本章节做了简单的调整。2。单元测试TestpublicvoidtestSqlSessionFactory()throwsIOException{1。从SqlSessionFactory中获取SqlSessionSqlSessionFactorysqlSessionFactorynewSqlSessionFactoryBuilder()。build(Resources。getResourceAsReader(mybatisconfigdatasource。xml));SqlSessionsqlSessionsqlSessionFactory。openSession();2。获取映射器对象IUserDaouserDaosqlSession。getMapper(IUserDao。class);3。测试验证UseruseruserDao。queryUserInfoById(1L);logger。info(测试结果:{},JSON。toJSONString(user));}单元测试没有什么改变,仍是通过SqlSessionFactory中获取SqlSession并获得映射对象和执行方法调用。
  测试结果22:34:18。676〔main〕INFOc。alibaba。druid。pool。DruidDataSource{dataSource1}inited22:34:19。286〔main〕INFOcn。bugstack。mybatis。test。ApiTest测试结果:{id:1,userHead:104,userId:10001,userName:小傅哥}Processfinishedwithexitcode0从现在的测试结果已经可以看出,通过我们对数据源的解析、包装和使用,已经可以对SQL语句进行执行和包装返回的结果信息了。读者在学习的过程中可以调试下代码,看看每一步都是如何完成执行步骤的,也在这个过程中进行学习Mybatis框架的设计技巧。七、总结以解析XML配置解析为入口,添加数据源的整合和包装,引出事务工厂对JDBC事务的处理,并加载到环境配置中进行使用。那么通过数据源的引入就可以在DefaultSqlSession中从Configuration配置引入环境信息,把对应的SQL语句提交给JDBC进行处理并简单封装结果数据。结合本章节建立起来的框架结构,数据源、事务、简单的SQL调用,下个章节将继续这部分内容的扩展处理,让整个功能模块逐渐完善。
  END文章链接:https:mp。weixin。qq。comsg9cZOsYSFJtp6FoFtMg6RQ
  转载自:小傅哥bugstack虫洞栈
  文章来源:《Mybatis手撸专栏》第5章:数据源的解析、创建和使用
  版权申明:本文来源于网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
投诉 评论 转载

G20峰会印尼将展示雅万高铁,中国助力印尼腾飞,日本印度哭晕俄乌战争以来让我们深切地感受到了欧洲的衰落,像法国总统马克龙说的那样,过去几百年欧洲的富足在未来可能不会再延续了。因为很显然今天的欧洲遭遇到了能源危机经济危机金融危机,而且这场……这一年,杭州二手房价格挤掉了泡沫钱江晚报小时新闻记者吴佳怡2022年的杭州二手房市场异常艰难。据钱报美好生活研究院数据显示,今年杭州市区(不含临安)二手房成交量共53308套,创近6年来新低。成交……双十二高性价比手机骁龙778Gplus80瓦闪充825614手机型号IQOOZ6发售日期:2022。8。25特点骁龙778GPlus性能铁三角,光学防抖,NFC,X轴线性马达,六重散热系统。外观屏幕上搭载6。64英寸1……男篮欧锦赛坐拥两大NBA内线立陶宛竟遭三连败谁能想到,坐拥两大内线瓦兰丘纳斯和小萨博尼斯的篮球传统豪门立陶宛,竟然在男篮欧洲杯遭遇开局两连败,而事实就是如此。要想获得小组出线的机会,第三场面对德国的比赛,他们就不容有失,……太原汾河景区到底有多大?有哪些景点?攻略详解经过多年的改造治理,太原市民终于有了属于自己的汾河景区,景区围绕生态文化的主题,融合全民健身理念,以保护环境与河道治理为目的,以绿化与水系景观为主轴线,形成了一个悠长的绿色生态……Mybatis手撸专栏第5章数据源的解析创建和使用目录一、前言二、目标三、设计四、实现1。工程结构2。事务管理3。类型别名注册器4。解析数据源配置5。SQL执行和结果封装六、测试1。事先准备2。单元测试七、总结一、……天气转凉,中老年人不差钱,建议多吃3种润肺王,身体更舒坦天气转凉,中老年人不差钱,建议多吃3种润肺王,身体更舒坦人们总是这样,冬天盼着春天,夏天盼着秋天,但是当季节真正来临的时候,又要吐槽了。比如说好不容易盼来的秋天,总是有人……台州旅游金名片亮相天府之国,文旅局长邀请大家追着阳光去台州记者郭梦芝文台州文旅图诗画江南邂逅安逸四川11月1日至3日,游诗画浙江,蜀浙里好玩2022浙江(四川)旅游交易会在成都举行。以追着阳光去台州,山海万里只为你为主题,浙江省……湖北省博物馆恢复开馆,尚意千载宋代书法主题展专属门票约起极目新闻记者夏雨摄影记者肖颢10月14日上午,湖北省博物馆发布恢复开馆通知,宣布于14日10时起恢复开放。此前在湖北省博物馆展出的尚意千载宋代书法主题展,也将再次与……烧光36亿,自动驾驶的巨头倒下了!自动驾驶会被辅助驾驶替代吗自汽车诞生之日起,人类便期待着可以无人驾驶、解放双手的那一天。最早,从1956年通用汽车推出的Firebird实现高速场景下的无人驾驶,到如今百度、奥迪、特斯拉、Navi……恭喜中国男篮!5位球员冲击NBA,2位小将露锋芒,顺位或超过否极泰来!笔者坚信中国男篮绝不会像中国足球那样自甘堕落!在经历了14年的低迷之后,中国男篮迎来重大转机。在姚明姚主席的改革下,中国男篮或再次迎来春天。在国内有着良好的篮球……北京冬残奥金牌榜中国14金第1,美国升至第5,15个代表团获2022年北京冬残奥会迎来了第7比赛日的较量,一共安排残奥高山滑雪、残奥冬季两项、残奥单板滑雪、轮椅冰壶、残奥冰球等19场比赛,将在残奥高山滑雪、残奥冬季两项、残奥单板滑雪等项……
每日外刊这位世界上最富有的人是天才,还是一个愚蠢的独行者朱婷张常宁不回归,日本就是亚洲第一,这是口出狂言还是说大实话国庆长假出游要注意啥?末伏要适当忌嘴,不论男女,牢记3不吃2要饮,安稳度伏天为什么比赛里常见的上单男枪,到了排位就经常变成了中路?贾秀全有望出山,重新收拾国足烂摊子,并且冲击世界杯中报触雷要怎么办?印尼大师赛凡尘赢德比晋级,黄鸭惨遭逆转,国羽男单全军覆没华为nova10新品发布会前瞻手机可能不是重点曾经无忧无虑的直板少年没能给自己最好的结局,他比你们都落寞江川荷花待放等你来无惧旅途的艰难,带上这些好物去旅行吧十大高蛋白食物排行榜里都有哪些食物,养生必看教训600字作文林志颖的幻灭史母乳喂养那些事儿雪菜肉丝面(腌制好的雪里红的做法大全)历史上万贞儿是怎样的人?什么时候册封的?经济现实告诉你加密货币是去中心化的,你相信吗?光刻机制造瓶颈在哪里?生活中祛斑小常识冬季正是补肾黄金时,分享8个中成药,帮你温补肾阳感人的一幕第一章男人,是不可信的

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利