专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Mybatis源码探索之SqlSession

  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){Transactiontxnull;try{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{dirtytrue;获取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{returnnull;}}复制代码
  selectCursor提供了与List相同的结果,只是它使用迭代器惰性地获取数据。selectCursor应该很少使用(应该吧,至少我没有用过)publicTCursorTselectCursor(Stringstatement,Objectparameter,RowBoundsrowBounds){try{MappedStatementmsconfiguration。getMappedStatement(statement);CursorTcursorexecutor。queryCursor(ms,wrapCollection(parameter),rowBounds);registerCursor(cursor);returncursor;}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{privatefinalstaticSqlSessionFactorysqlSessionFactory;static{Stringresourcemybatisconfig。xml;Readerreadernull;try{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

金标单品销售破200万箱,难挽牛栏山预亏超5亿业绩在新国标正式实施半年后,牛栏山应对市场变化所升级推出的产品陈酿金标在终端市场表现如何?2月7日,界面新闻获悉,在牛栏山酒厂召开的2022年度厂务公开暨总结表彰大会上,牛栏山方面表示贷款5。6亿,制鞋大厂东南亚建厂!2月3日,中国台湾制鞋大厂钰齐国际旗下全资子公司香港加和国际有限公司,因应印尼建厂发起8300万美元(约5。6亿人民币)联贷案,由台北富邦银行统筹主办,第一银行与玉山银行共同主办,安徽芜湖增材制造企业新春开工赶订单共享装备安徽公司工作人员正在操作3D打印机打印大型砂型产品。中安在线中安新闻客户端讯新春伊始,安徽省芜湖市繁昌区春谷3D打印产业园里的不少企业开工生产,加紧赶制国内外订单,生产线上港股公告掘金消费复苏态势明确,免税龙头新项目持续推进,市占率提升可期头条公告掘金中国中免(01880)发布业绩快报,2022年度净利润50。25亿元中国中免(01880)发布2022年度业绩快报,该集团取得营业总收入人民币544。63亿元(单位下同格力渠道变革之痛还会持续多久,线上线下如何发展考验董明珠2023年空调业新一轮竞争拉开帷幕,格力渠道变革也到了关键时刻。去年河北原代理商徐自发反水是冰山一角,格力在全国的盛世欣兴销售体系已出现萎缩。格力在安徽试点工厂直对经销商的新零售模写代码写简历写方案它啥都会!它会给生活带来什么改变?导读继去年12月以最快速度5天突破百万用户之后,人工智能聊天机器人ChatGPT又创造了一个新的历史记录,发布两个月后,月活用户达到了1亿,成为史上蹿红最快的应用。它能够智能生成文快速提取顶刊上十六进制颜色的小插件OnekeyTools山海路研因为热爱,所以想奔赴山海一篇好的论文离不开好的科研图片,好的科研图片离不开好的科研论文配色。无论我们在做任何事情,如果要把自己不擅长的事情做好,我们就要要学会借助工具。遇到iEnglish有哪些优势?贴合语言习得的母语化思维?中国经济快速崛起,进击海外成为一个中国传统企业的发展目标,越来越多的企业加快出海步伐,在海外发出中国声音。去年双减落地,教育信息科技出海也成了许多中小企业文化发展的方向。而作为一种可以写文章作诗敲代码的ChatGpt最近ChatGpt算是一个比较热的话题,然后自己注册了一个OpenAl的账号体验了一下,感觉和之前的人工智能程序相比确实不太一样。下面是一些对话内容本人请写一篇科幻文章,内容关于月微信又更新!微信小组件来了微信又开始内测新功能了!最近,微信悄悄测试新功能,这次隐藏得有点深。在微信首页下拉,进入小程序页面,点击顶部搜索框,页面中新增了小功能版块。点击添加小功能,里面可以查看你之前使用过地理语言学视域下区域方言研究的力作评汉江上游沿江地区方言语音研究地理语言学视域下区域方言研究的力作评汉江上游沿江地区方言语音研究文南京大学文学院贾宁波汉江上游沿江地区处于陕甘川渝鄂豫几省区交汇地带,地理环境闭塞历史移民多源,方言整体格局和内部差
新房销售面积是否会跌破10亿平方米?文尹中立新建商品房销售面积是十分重要的宏观经济指标,该指标的变化不仅对大宗商品或股市价格产生影响,而且对宏观经济决策产生影响。去年的新建商品房销售面积接近18亿平方米,创历史之最,马布里孙子打篮球,爷孙只差40岁!NBA巨星定居中国,人生赢家北京时间9月9日,马布里更新了个人社交平台,晒出了一张大孙子的照片,并且配文道我的孙子已经5岁了!要知道,马布里也不过45岁而已,居然一晃眼孙子辈都5岁了,可见这个家族的生娃效率。物联网方案引领者,汉威科技车载及柔性传感器业务牵引新边际(报告出品方分析师国元证券杨为敩)1。以传感器为核心,物联网解决方案引领者1。1深耕行业二十载,产品应用领域广泛汉威科技集团股份有限公司深耕行业20余年,是国内知名的气体传感器及仪珠峰著名遇难者绿靴子,20多年都无人将他搬下山,这是为何文丨熊宝包图丨来源网络,如有侵权请联系删除人类一直以挑战自然来彰显自己的力量,自从1953年新西兰运动员埃德蒙希拉里(EdmundHillary)首次登顶珠珠穆朗玛峰之后,越来越多朱丽倩最神秘天王嫂,与刘德华密恋多年,对方1年却只能陪她2周中国人每一次喝星巴克的钱,最后都会落到刘德华老婆朱丽倩的手里。朱丽倩背景显赫,因何与华仔结缘?对于不知道朱丽倩真实背景的粉丝来说,她一定是上辈子拯救过银河系的女人,但对于刘德华来说重大突破!牛津大学创建全球首个纠缠原子钟的量子网络量子网络已经被用于量子密码学量子计算,以及量子理论验证,它们也有可能通过在远程系统之间分配纠缠而增强量子传感。近日,英国牛津大学团队使用光子链路成功纠缠了相隔2米的两个88Sr离子一百多年前的晚清,这支考察团在中国拍下了这些照片一张照片,一段历史。关于晚清时期张柏林考察团来中国考察拍下的老照片系列,历史镜像馆已经发了好几期了。从这些老照片中,我们看到了那个时代的中国,无论是好的还是不好的,都真实地反映了当白白被骂这么多年,这个景区头牌可太冤了大家好啊(),今天值班的是在福建被晒换了个人种的磊磊。每个城市大概都有这么几个不去后悔,去了更后悔的景点。好像自打知道鼓浪屿这个地方开始,她就一直伴随着负面的评价。带着成见上岛,这牛津大学物理学家创建量子纠缠的原子钟网络牛津大学的物理学家首次通过量子纠缠成功地将两个原子钟连接起来。这一壮举有助于使这些时钟变得如此精确,以至于它们开始接近量子力学所设定的基本精度极限。原子钟通过测量原子的振动模式来保尼安德特人与人类的混血大部分发生在5万年前左右的近东地区据最新一期生物学杂志刊发的论文,美国人类学家对古代头骨的研究显示,尼安德特人与人类的混血大部分发生在5万年前左右北非和伊拉克之间的近东地区。专家们在分析了13个尼安德特人233个史旗袍,中国女性的人生图片来源网络,如侵权,请联系删除旗服雅致衬娇容,蓝底白花雅韵生。东方佳丽多绝代,款款飘忽步履轻。出自醉美旗袍美人,作者吴雨谦。意思旗袍很是雅致,衬托容貌很是娇美。蓝色的底布生满白花
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网