城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

Mybatis源码探索之SqlSession

7月11日 眸中星投稿
  SqlSessionFactory
  SqlSessionFactory使用了工厂模式创建SqlSession的,它的默认实现类是DefaultSqlSessionFactory。方法
  它共有以下几个方法:publicinterfaceSqlSessionFactory{SqlSessionopenSession();SqlSessionopenSession(booleanautoCommit);SqlSessionopenSession(Connectionconnection);SqlSessionopenSession(TransactionIsolationLevellevel);SqlSessionopenSession(ExecutorTypeexecType);SqlSessionopenSession(ExecutorTypeexecType,booleanautoCommit);SqlSessionopenSession(ExecutorTypeexecType,TransactionIsolationLevellevel);SqlSessionopenSession(ExecutorTypeexecType,Connectionconnection);ConfigurationgetConfiguration();}复制代码
  可以根据参数的不同创建不同特性的SqlSession,具体实现可以参考DefaultSqlSessionFactory源码DefaultSqlSessionFactory
  它的核心方法是openSessionFromDataSource(ExecutorTypeexecType,TransactionIsolationLevellevel,booleanautoCommit),从数据源中获取SqlSession。privateSqlSessionopenSessionFromDataSource(ExecutorTypeexecType,TransactionIsolationLevellevel,booleanautoCommit){Ttry{finalEnvironmentenvironmentconfiguration。getEnvironment();获取事务工厂,默认是ManagedTransactionFactoryfinalTransactionFactorytransactionFactorygetTransactionFactoryFromEnvironment(environment);txtransactionFactory。newTransaction(environment。getDataSource(),level,autoCommit);获取执行器,默认是SimpleExecutorfinalExecutorexecutorconfiguration。newExecutor(tx,execType);returnnewDefaultSqlSession(configuration,executor,autoCommit);}catch(Exceptione){closeTransaction(tx);mayhavefetchedaconnectionsoletscallclose()throwExceptionFactory。wrapException(Erroropeningsession。Cause:e,e);}finally{ErrorContext。instance()。reset();}}复制代码
  常用的方法是openSession(),但是调用的还是核心方法。通过无参的openSession()方法创建SqlSession时,事务默认不自动提交,事务隔离级别null,默认执行器类型是ExecutorType。REUSEOverridepublicSqlSessionopenSession(){returnopenSessionFromDataSource(configuration。getDefaultExecutorType(),null,false);}复制代码SqlSession
  SqlSession是MyBaits对外提供的最关键的核心接口,通过它可以执行数据库读写命令、获取映射器、管理事务等;SqlSession也意味着客户端与数据库的一次连接,客户端对数据库的访问请求都是由SqlSession来处理的,SqlSession由SqlSessionFactory创建,每个SqlSession都会引用SqlSessionFactory中全局唯一单例存在的configuration对象。SqlSession的默认实现类是DefaultSqlSession方法
  SqlSession的方法主要分为以下6类:
  1、SQL语句执行方法
  2、立即批量更新方法
  3、事务控制方法
  4、本地缓存
  5、映射器获取
  6、SqlSession关闭
  对应的主要方法如下:
  SqlSession的方法中参数statement,都是Mapper接口中的方法的全限定名,例如:mapperClasses。UserInfoMapper。selectByPrimaryKey。
  1、SQL语句执行方法intdelete(Stringstatement,Objectparameter);intinsert(Stringstatement,Objectparameter);intupdate(Stringstatement,Objectparameter);voidselect(Stringstatement,Objectparameter,RowBoundsrowBounds,ResultHandlerhandler);TTselectOne(Stringstatement,Objectparameter);K,VMapK,VselectMap(Stringstatement,Objectparameter,StringmapKey,RowBoundsrowBounds);EListEselectList(Stringstatement,Objectparameter,RowBoundsrowBounds,ResultHandlerhandler);TCursorTselectCursor(Stringstatement,Objectparameter,RowBoundsrowBounds);复制代码
  delete、insert方法最终调用的还是update方法,update源码如下:publicintupdate(Stringstatement,Objectparameter){try{获取MappedStatementMappedStatementmsconfiguration。getMappedStatement(statement);returnexecutor。update(ms,wrapCollection(parameter));}catch(Exceptione){throwExceptionFactory。wrapException(Errorupdatingdatabase。Cause:e,e);}finally{ErrorContext。instance()。reset();}}复制代码
  select、selectOne最终调用的是selectList方法,selectMap方法也是通过selectList方法查询到结果的,只不过再查询之后又转换成了map对象。selectList方法源码如下:privateEListEselectList(Stringstatement,Objectparameter,RowBoundsrowBounds,ResultHandlerhandler){try{MappedStatementmsconfiguration。getMappedStatement(statement);returnexecutor。query(ms,wrapCollection(parameter),rowBounds,handler);}catch(Exceptione){throwExceptionFactory。wrapException(Errorqueryingdatabase。Cause:e,e);}finally{ErrorContext。instance()。reset();}}复制代码
  selectOne源码:查询结果集如果是一个就取这个,多个则抛异常publicTTselectOne(Stringstatement,Objectparameter){Popularvotewastoreturnnullon0resultsandthrowexceptionontoomany。ListTlistthis。selectList(statement,parameter);if(list。size()1){returnlist。get(0);}elseif(list。size()1){thrownewTooManyResultsException(Expectedoneresult(ornull)tobereturnedbyselectOne(),butfound:list。size());}else{}}复制代码
  selectCursor提供了与List相同的结果,只是它使用迭代器惰性地获取数据。selectCursor应该很少使用(应该吧,至少我没有用过)publicTCursorTselectCursor(Stringstatement,Objectparameter,RowBoundsrowBounds){try{MappedStatementmsconfiguration。getMappedStatement(statement);CursorTcursorexecutor。queryCursor(ms,wrapCollection(parameter),rowBounds);registerCursor(cursor);}catch(Exceptione){throwExceptionFactory。wrapException(Errorqueryingdatabase。Cause:e,e);}finally{ErrorContext。instance()。reset();}}复制代码
  2、立即批量更新方法
  只有这个方法:
  可以使用这个方法清除(执行)缓存在JDBC驱动类中的批量更新语句。ListflushStatements();publicListBatchResultflushStatements(){try{returnexecutor。flushStatements();}catch(Exceptione){throwExceptionFactory。wrapException(Errorflushingstatements。Cause:e,e);}finally{ErrorContext。instance()。reset();}}复制代码
  3、事务控制方法刷新缓存在JDBC驱动类中的批量语句并提交数据库连接,如果数据库连接没有updatesdeletesinserts被调用则不会提交voidcommit();commit()升级版,可以根据参数来决定是否强制提交voidcommit(booleanforce);丢弃挂起的批处理语句并回滚数据库连接,如果数据库连接没有updatesdeletesinserts被调用则不会回滚voidrollback();rollback()的升级版,可以根据参数来决定是否强制回滚voidrollback(booleanforce);复制代码
  4、本地缓存清空本地缓存,只是清空本地缓存,跟二级缓存没关系voidclearCache();复制代码
  5、映射器获取从configuration对象中的mapperRegistry(mapper注册表)中获取对应的mapper对象publicTTgetMapper(ClassTtype){returnconfiguration。getMapper(type,this);}复制代码
  6、SqlSession关闭方法关闭session会话voidclose();复制代码举个栗子publicclassUserTest{privatefinalstaticSqlSessionFactorysqlSessionFstatic{Stringresourcemybatisconfig。Rtry{readerResources。getResourceAsReader(resource);}catch(IOExceptione){System。out。println(e。getMessage());}sqlSessionFactorynewSqlSessionFactoryBuilder()。build(reader);}Testpublicvoidtest(){SqlSessionsqlSessionsqlSessionFactory。openSession();UserInfoMappermappersqlSession。getMapper(UserInfoMapper。class);UserInfouserInfossqlSession。selectOne(mapperClasses。UserInfoMapper。selectByPrimaryKey,1L);System。out。println(userInfos);UserInfouserInfomapper。selectByPrimaryKey(4L);System。out。println(userInfo);}}复制代码
  使用mybatis进行crud有两种方式:
  1、通过sqlSession提供的操作进行crud,这种是最原始的使用方式。这种方式可读性、可维护性都很差,一般很少使用。UserInfouserInfossqlSession。selectOne(mapperClasses。UserInfoMapper。selectByPrimaryKey,1L);复制代码
  2、通过mapper进行crud,最终调用的还是第一种的方式。这种方式是ibatis被谷歌收购后,谷歌进行升级的UserInfoMappermappersqlSession。getMapper(UserInfoMapper。class);UserInfouserInfomapper。selectByPrimaryKey(4L);复制代码
  能力有限,水平一般,如有错误,请多指出。
  来源:https:juejin。cnpost7130802331347582990
投诉 评论 转载

电池仅3700mAh!三星翻盖折叠屏ZFlip4配置参数曝光几天前,三星GalaxyZFold4全部配置被曝光。如今,爆料者YogeshBrar又曝光了三星即将推出的翻盖式折叠屏手机GalaxyZFlip4的主要配置参数。目前这两款手机……Apple的新专利可折叠iPhone,其触摸传感器覆盖了整个美国专利商标局本周授予苹果多项专利。覆盖整个设备的触摸界面是比较有趣的界面之一。该概念将使用嵌入机箱中的触摸传感器为用户提供音量、亮度、游戏控制等功能。库比蒂诺设计师随专……Mybatis源码探索之SqlSessionSqlSessionFactorySqlSessionFactory使用了工厂模式创建SqlSession的,它的默认实现类是DefaultSqlSessionFacto……又走一个!TVB知名女星约满离巢,在内地做吃播,体重已迫近2本文编辑剧透社:issac未经授权严禁转载,发现抄袭者将进行全网投诉又走一个!据港媒最新报道,TVB知名女星、被外界亲切称为细细粒的陈嘉佳,与公司合约到期后选择不再……防范胜于救灾!新兴县举办预防厨房火灾应急技能培训活动厨房,在家庭中占有着相当重要的地位,是家庭里使用明火的主要场所,厨房内常有各种电器、管道和易燃物品,是火灾易发地区,火灾危害造成群众生命财产损失。为提高辖区居民面对家庭火灾突发……清代奇案哑女告生父,恶人终有报话说清道光年间,浙江金华府汤溪有户郦家,郦家有兄妹三人,家里也没有学问人,因此起得都是俗名,老大名叫郦十二,老二名叫郦十九,老三名叫郦狗妹。大哥郦十二娶妻陈氏,婚后夫妻美……唐山事件被打的四个女孩子现在怎么样了?唐山事件被打的四个女孩子现在到底怎么样了,这应该是目前网友最关心的问题。这起事件被打的主要有四个女孩子,一个是短发女,还有一个白色T恤,灰色衣服的和黑色衣服的,官方发出来……历史上唯一一个女状元,聪慧过人,为何最后却沦为男人的玩物现有公务员,古有状元。在历史记载中,中国科举制度是古代封建统治者为选拔人才资源而设置的一种学而优则仕的考试制度,在殿试中考了第一名,便称之为状元该制度自隋朝而来,废……COP15中国角海南日展览宣介活动及海南边会成果丰富守护生物海南日报记者周晓梦一次与世界的分享,一场特别的对话。12月7日至19日,联合国《生物多样性公约》第十五次缔约方大会(COP15)第二阶段会议在加拿大蒙特利尔举行。会……英国外卖骑手嘲笑女生网购阴道消炎药,偷拍还传到网上,网友怒了前几天,一名Deliveroo外卖小哥乔丹,在自己的账号上传了一段送外卖时的偷拍视频。这段仅39秒的短视频立刻引发众怒,在社交平台上疯传视频内容是这样的:前几……银保监会关于防范保险销售误导的风险提示近期,有消费者反映,某些保险销售人员为提高销售业绩,在保险产品销售过程中,向消费者提供与实际不符或让人误解的信息,诱导消费者购买保险产品,存在套路营销、诱导消费、强制搭售等问题……1996年山西退休官员逛地摊,花3000买84张黄纸,全是国阅读此文前,诚邀您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。2007年一部名为《集结号》的电影在中国大陆横空出世,引起了激烈的反响。……
为啥steam上一些明明没有送过的游戏却有人免费获取了?古代株连九族时,为什么这些人不逃跑呢?逃跑的人才傻面对当前困境,武磊是否该考虑换一支欧洲球队继续留洋呢?跟生活息息相关!这些新规7月实施中国有哪些一本大学?唐山打人事件再上热搜!更恶心的一幕发生了!网友看吐了有人在野外过夜遇见过什么奇怪的事情吗?不正确处理佩洛西访台的后果,我们处境更加被动魔兽世界黑铁声望怎么冲最快?哪些菜糖尿病患者不宜多吃?孕妈妈睡不着,可以到长妇幼这个门诊寻求帮助为什么劝你别穿短裙黑丝出门,看完这些街拍,你就全懂了

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找