游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

最全MyBatis中XML映射文件(Mapper)标签分析

  前言
  MyBatis的强大之处就在于它的映射器文件,而这也正是MyBatis的魔力所在,对于任何MyBatis的使用者来说,MyBatis的映射文件是必须要掌握的。Mapper文件标签
  Mapper中一个提供了9个顶层标签,除了1个已经过期的我们不需要去了解,另外8个都是必须要掌握的,只要熟练掌握了标签的使用,使用MyBatis才能如鱼得水。接下来我们就一个个来分析一下这些标签的使用。select
  select用来映射查询语句,是我们使用最多的一种标签,也是最复杂的一种标签。比如下面就是一个简单的select标签的使用:selectidlistUserByUserNameparameterTypeStringresultTypelwUserselectuserid,usernamefromlwuserwhereusername{userName}select
  select标签内,提供了一些二级标签,下面就列举出了全部的二级标签:selectidselectPersonparameterTypeintparameterMapdeprecatedresultTypehashmapresultMappersonResultMapflushCachefalseuseCachetruetimeout10000fetchSize256statementTypePREPAREDresultSetTypeFORWARDONLYdatabaseIdmysqlresultOrderedfalseresultSetsxxx,xxxlangid
  必选标签。同一个命名空间里面的唯一标识符,如果需要被外部接口调用,则需要和Mapper接口中的方法名保持一致。parameterType
  可选标签。参数类的完全限定名或别名,上面示例中的表示我们传入的参数是一个String类型(关于别名如果不清楚的可以点击这里)。如果不写这个属性的话,MyBatis在解析xml文件的时候会默认设为unset,然后根据TypeHandler推断出参数类型。如果有多个参数的情况下建议还是不写这个参数,否则可能会出现参数类型转换错误parameterMap
  这是一个过期的属性,我们不做讨论。resultType
  非必选标签。注意这里的非选是因为resultType和resultMap不能并存,两者能且只能选择一个。主要是用来定义一个返回结果集对象的全限定名或者别名。如果接收参数是一个集合,那么这里定义的就是集合中可以包含的类型,而并不是集合本身。
  比如示例中的写法,那么对应Mapper接口中,适用于以下两种语句:LwUserlistUserByUserName(Param(userName)StringuserName);ListLwUserlistUserByUserName(Param(userName)StringuserName);resultMap
  非必选标签。注意这里的非选是因为resultType和resultMap不能并存,两者能且只能选择一个。resultMap类型的结果集映射,是MyBatis最强大的特性,在这里我们不展开,过两天会有一篇单独介绍MyBatis一对一和一对多等复杂查询时候会单独介绍该属性。感兴趣的可以先关注我,留意后面的文章。flushCache
  可选标签。设置为true时,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。useCache
  可选标签。设置为true时将会导致本条语句的结果被二级缓存,对select标签语句默认值为true,对insert,delete,update等语句默认是false。timeout
  可选标签。这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为unset(依赖驱动)。fetchSize
  可选标签。这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为unset(依赖驱动)。注意这个只是尝试,假如把fetchSize设置为10万,而数据库驱动最高只支持到5w,那么也会只能返回5w数据statementType
  可选标签。可以选择:STATEMENT,PREPARED或CALLABLE中的一个,这会让MyBatis分别使用Statement,PreparedStatement或CallableStatement,默认值是PREPARED,也就是使用预编译PreparedStatement语句。resultSetType
  可选标签。可以选择以下三种类型中的一个,默认为unset(依赖驱动)。FORWARDONLY:只允许游标向前访问SCROLLSENSITIVE:允许游标双向滚动,但不会及时更新数据,也就是说如果数据库中的数据被修改过,并不会在resultSet中体现出来SCROLLINSENSITIVE:许游标双向滚动,如果数据库中的数据被修改过,会及时更新到resultSet
  上面的解释可能有些人还是看不明白,我们先来看一段JDBC读取结果集的操作:
  而MyBatis只是把这些操作封装了,底层实际上还是这个操作,rs。next()游标向前滚,其实还有一个rs。previous()表示游标可以向后滚。
  所以FORWARDONLY只允许向前滚,访问过的数据就会释放内存,在某些场景中可以提升性能。
  后面那两个都是允许双向滚动,所以即使访问过得数据,内存也不能释放。这两个的区别就是一个对数据敏感,一个对数据不敏感。对数据不敏感就是说当我们查询出结果之后,会将整个结果集都缓存在内存中,假如有一条数据还没读取到(还在while循环中)这时候有另外一个线程修改了这条数据,那么当我们后面读取这条数据的时候,还是读取到修改之前的。对数据敏感就是说当我们查询出结果之后,只会缓存一个rowid,而并不会缓存整条数据,假如有一条数据还没读取到(还在while循环中)这时候有另外一个线程修改了这条数据,那么当我们后面读取这条数据的时候,会根据rowid去查询数据,查询到的就是最新的数据。不过需要注意的是,因为delete的时候数据其实还在,只是打了个标记,所以如果一条数据被删除了,是体现不出来的。同理,insert也不影响,因为查询出来的数据不包含insert数据的rowid。
  如果对于MySQL的InnoDB引擎的MVCC机制,那么数据肯定是不会敏感的,因为其他事务改了当前事务也看不到。databaseId
  可选标签。数据库厂商id,详细了解,可以点击这里。resultOrdered
  可选标签。这个设置仅针对嵌套结果select语句适用。如果为true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false。resultSets
  可选标签。这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。lang
  自定义语言,这个我也没用过,所以就不介绍了insert
  insert用来映射插入语句。以下就是一个insert标签的全部二级标签:insertidinsertLwUserparameterTypelwUserparameterMapdeprecatedflushCachetruestatementTypePREPAREDkeyPropertykeyColumnuseGeneratedKeystimeout20databaseIdmysqllang
  有一些标签和select语句是重复的就不在重复介绍,主要来关注一下其他标签。useGeneratedKeys
  可选标签。配置为true时,MyBatis会使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键(比如:像MySQL和SQLServer这样的关系数据库管理系统的自动递增字段),默认值为false。keyProperty
  可选标签。唯一标记一个属性,MyBatis会将通过getGeneratedKeys的返回值或者通过insert语句的selectKey子元素设置它的键值,默认值是unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表keyColumn
  通过生成的键值设置表中的列名,这个设置仅在某些数据库(像PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是
  逗号分隔的属性名称列表获取自增主键
  获取自增主键,可以通过keyProperty来映射
  定义一个实体类:packagecom。lonelyWolf。mybatis。model;publicclassUserAddress{privateintid;privateStringaddress;publicintgetId(){returnid;}publicvoidsetId(intid){this。idid;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this。addressaddress;}}
  定义一个UserAddressMapper。java接口:packagecom。lonelyWolf。mybatis。mapper;importcom。lonelyWolf。mybatis。model。UserAddress;importorg。apache。ibatis。annotations。Param;publicinterfaceUserAddressMapper{intinsert(UserAddressuserAddress);}
  注意:这里参数如果直接只有一个的话可以不适用Param注解,这样在xml文件中可以直接使用JavaBean内的属性名。如果使用了Param注解,如下:intinsert(Param(userAddress)UserAddressuserAddress);
  那么xml文件中就可以使用{userAddress。属性名}来获取属性JavaBean内的属性
  定义一个UserAddressMapper。xml映射文件(keyPropertyid表示把主键的值设置到参数UserAddress类中的属性id):lt;?xmlversion1。0encodingUTF8?!DOCTYPEmapperPUBLICmybatis。orgDTDMapper3。0ENhttp:mybatis。orgdtdmybatis3mapper。dtdmappernamespacecom。lonelyWolf。mybatis。mapper。UserAddressMapperinsertidinsertparameterTypecom。lonelyWolf。mybatis。model。UserAddressuseGeneratedKeystruekeyPropertyidinsertintolwuseraddress(address)values({address})insertmapper
  mybatisconfig。xml中要新增mapper映射文件配置:mappersmapperresourcecomlonelyWolfmybatismappingUserAddressMapper。xmlmappers
  然后写一个测试类:packagecom。lonelyWolf。mybatis;importcom。lonelyWolf。mybatis。mapper。UserAddressMapper;importcom。lonelyWolf。mybatis。model。UserAddress;importorg。apache。ibatis。io。Resources;importorg。apache。ibatis。session。SqlSession;importorg。apache。ibatis。session。SqlSessionFactory;importorg。apache。ibatis。session。SqlSessionFactoryBuilder;importjava。io。IOException;importjava。io。InputStream;publicclassTestMyBatisInsert{publicstaticvoidmain(String〔〕args)throwsIOException{Stringresourcemybatisconfig。xml;读取mybatisconfig配置文件InputStreaminputStreamResources。getResourceAsStream(resource);创建SqlSessionFactory对象SqlSessionFactorysqlSessionFactorynewSqlSessionFactoryBuilder()。build(inputStream);创建SqlSession对象SqlSessionsessionsqlSessionFactory。openSession();try{UserAddressuserAddressnewUserAddress();userAddress。setAddress(广东深圳);UserAddressMapperuserAddressMappersession。getMapper(UserAddressMapper。class);intiuserAddressMapper。insert(userAddress);session。commit();System。out。println(插入成功数:i);System。out。println(插入数据的主键为:userAddress。getId());}finally{session。close();}}}
  输出结果(成功获取到了插入数据的主键):插入成功数:1插入数据的主键为:1通过selectKey获取自定义列
  假如有些数据库不支持自增主键,或者说我们想插入自定义的主键,而又不想在业务代码中编写逻辑,那么就可以通过MyBatis的selectKey来获取。
  UserAddressMapper。java中新建一个方法:intinsert2(UserAddressuserAddress);
  然后在UserAddressMapper。xml中对应新增一个insert2语句:insertidinsert2useGeneratedKeystruekeyPropertyaddressselectKeykeyPropertyaddressresultTypeStringorderBEFOREselectuuid()fromlwuseraddressselectKeyinsertintolwuseraddress(address)values({address})insert
  然后修改测试类:try{UserAddressuserAddressnewUserAddress();UserAddressMapperuserAddressMappersession。getMapper(UserAddressMapper。class);intiuserAddressMapper。insert2(userAddress);session。commit();System。out。println(插入成功数:i);System。out。println(插入数据的address为:userAddress。getAddress());}finally{session。close();}
  输出结果如下,成功获得了我们自定义的address:插入成功数:1插入数据的address为:097dfc8bf04311ea97c400163e12524a
  selectKey中的order属性有2个选择:BEFORE和AFTER。BEFORE:表示先执行selectKey的语句,然后将查询到的值设置到JavaBean对应属性上,然后再执行insert语句。AFTER:表示先执行AFTER语句,然后再执行selectKey语句,并将selectKey得到的值设置到JavaBean中的属性。上面示例中如果改成AFTER,那么插入的address就会是空值,但是返回的JavaBean属性内会有值。
  PS:selectKey中返回的值只能有一条数据,如果满足条件的数据有多条会报错,所以一般都是用于生成主键,确保唯一,或者在selectKey后面的语句加上条件,确保唯一update
  insert用来映射更新语句。以下就是一个undate标签的全部二级标签:updateidUpdateLwUserparameterTypelwUserparameterMapdeprecatedflushCachetruestatementTypePREPAREDkeyPropertykeyColumnuseGeneratedKeystimeout20databaseIdmysqllang
  这个标签和insert基本一致,就不重复解释了。delete
  delete用来映射删除语句。以下就是一个delete标签的全部二级标签:deleteidinsertLwUserparameterTypelwUserparameterMapdeprecatedflushCachetruestatementTypePREPAREDtimeout20databaseIdmysqllang
  这里的标签除了少了useGeneratedKeys,keyProperty和keyColumn三个标签之外,其余的和insert,update一样。sql
  这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中。
  如下是一个最简单的例子:selectidselectUserAddressresultTypecom。lonelyWolf。mybatis。model。UserAddressselectincluderefidmyCloumnincludefromlwuseraddressselectsqlidmyCloumnid,addresssql
  如果说我们现在需要定义一个关联语句,列来自于两张不同的表,又该如何实现呢?这时候就可以通过制定参数的方式来实现了:selectidselectUserAddressresultTypecom。lonelyWolf。mybatis。model。UserAddressselectincluderefidmyCloumn1propertynameprefix1valueupropertynameprefix2valuejincludefromlwuseruinnerjoinlwuserjobjonu。useridj。useridselectsqlidmyCloumn1{prefix1}。userid,{prefix2}。idsql
  这时候打印出来的sql语句如下:selectu。userid,j。idfromlwuseruinnerjoinlwuserjobjonu。useridj。useridcache
  MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。但是默认情况下只开启了一级缓存,即局部的session缓存,如果想要开启二级缓存。那么就需要使用到cache标签cachetypecom。lonelyWolf。xxxevictionFIFOflushInterval60000readOnlytruesize512
  PS:这些属性都是有默认值的,所以一般情况下可以直接使用:cache
  关于默认值是多少,请继续往下看type
  如果说我们自己自定义了缓存,那么这里可以配置自定义缓存类的全限定名或者别名,如果没有自定义缓存,则不需要配置type属性。
  关于缓存相关原理以及如何自定义缓存,后面会有一篇文章专门介绍缓存,本文主要还是介绍一下标签的使用,不会过多涉及底层原理性问题。eviction
  缓存回收策略,MyBatis中more提供了以下策略可以选择:LRU:最近最少使用算法(默认算法)。移除最长时间不被使用的对象FIFO:先进先出算法。按对象进入缓存的顺序来移除它们SOFT:软引用。移除基于垃圾回收器状态和软引用规则的对象。WEAK:弱引用。更积极地移除基于垃圾收集器状态和弱引用规则的对象flushInterval
  刷新间隔时间(单位是毫秒)。可以被设置为任意的正整数。默认情况是不设置,也就是不会主动刷新缓存(只有等待sql被执行的时候才会被刷新)。readOnly
  是否只读。属性可以被设置为true或false。如果设置为true,那么只读的缓存会给所有调用者返回缓存对象的相同示例,因为缓存无法被修改。这在一定程度上可以提升性能。
  默认是false,也就是可以修改缓存,那么当读取缓存的时候会通过序列化的方式返回缓存对象的拷贝,虽然这么做会慢一点,但是安全,因此默认才会设置为false,允许修改缓存。size
  引用数目。通俗点就是可以缓存的个数,默认值是1024。超过了设置值的时候,就会采用上面的算法进行覆盖cacheref
  假如我们在其中一个Mapper中已经配置好了缓存,然后在其他Mapper想要共用,那么在这样的情况下就可以使用cacheref元素来引用另外一个缓存,从而不需要重复配置。如:cacherefnamespacecom。lonelyWolf。mybatis。mapper。UserMapper
  这样当前Mapper就可以共用UserMapper文件中的相同缓存了。resultMap
  上面介绍select标签的时候提到,select标签的返回结果可以使用resultMap,但是一旦我们使用了resultMap时,我们就必须要自己定义一个resultMap。
  如下,我们定义了一个resultMap:resultMapidJobResultMaptypelwUserresultcolumnuseridpropertyuserIdjdbcTypeVARCHARresultcolumnusernamepropertyuserNamejdbcTypeVARCHARresultMap
  这时候select语句就可以引用:selectidselectUserAndJobresultMapJobResultMapselectfromlwuserselect
  可以看到,resultMap可以自由定义,所以可以接受非常复杂的查询返回结果集,resultMap的具体使用,可以点击这里。parameterMap
  这个参数已过期,不再讨论,可以忘掉有这个参数总结
  本文主要介绍了MyBatis中映射文件Mapper。xml文件一些标签的使用,可以算是最全MyBatis中XML映射文件标签分析了,当然这其中并不涉及到如何完成动态sql语句的拼写。动态sql也是MyBatis的一个非常重要的功能点,但是综合考虑如果单纯通过一篇文章来书写sql语句动态标签的使用,会显得非常枯燥,所以动态sql的映射就不准备通过单独的文章来书写了,虽然如此,但是依然会通过一些相关知识点来介绍动态标签的使用,比如下一篇介绍MyBatis中一对多和多对多的结果集如何返回时,就会涉及到一些标签,如where,if,set,choose等,后面还会介绍批量操作等,也会涉及到foreach等一些标签的使用。

电子书爱好者纠结阅读器?墨案MIX7带给你意想不到的观感体验对于现在的年轻人来说,生活的压力都很大,但好在有许多放松的方式可以选择,比如看电子书,而说到电子书产品,以前市场上的品牌屈指可数,现在国内出现了越来越多优秀的电子书企业,从而有……苹果为什么值三万亿,不就是卖手机和笔记本吗?北京时间2022年1月4日凌晨2点45分左右,美国科技巨头苹果的股价达到了182。88美元,市值第一次站上了三万亿美元的台阶,这不仅是全球首个3万亿市值,也相当于全球第五大经济……帅爆!美呆!照亮最美的你vivoS10Pro柔光自拍旗舰5G前言:今年7月份vivo召开了S10系列发布会,发布了新一代自拍旗舰vivoS10系列,其采用了前置4400万像素AF双摄设计以及前置微缝式双柔光灯,让它在自拍时的表现异……营销玩大了?这家车企太会玩了,原价回购背后的猫腻天际汽车一个名不见经传的品牌原来已经有两款车型在售作为一个造车新势力的形象进入市场在销量方面,今年19月两款车型累计销量为1156辆只有头部……电视猫更新后看不了直播了,有什么办法可以解决?最近有朋友反映,家里的电视猫升级到3。1。5之后不能看电视直播,比如喜剧总动员,还有看娱乐头条,放到一半就卡住了,喜剧总动员直接一开始就卡住了,朋友家是小米电视4A,连接的无线……采用翻转屏更多尼康复古无反相机Zfc的谍照继前天的局部照泄露后,今天又有两张新的尼康复古机实物谍照被nikonrumors曝光了,这次的谍照是机背顶侧局部和另一侧的机顶:从这次新曝光的两张图片来看,这款传闻型号为……天工盛世获委任成为LEAK(英国力克)中国总代理据天工盛世消息:自2021年6月22日起,IAG先歌国际影音正式授权深圳市天工盛世科技有限公司为LEAK(英国力克)中国(不含港澳台)总代理,负责LEAK相关产品的推广、销售及……Google发布Pixel5a骁龙765GOLED直屏2918月18日Google正式发布Pixel5a,这是一款定位中端的产品,具体参数如下。6。34英寸打孔OLED直屏,没有高刷新率,只支持60Hz,屏幕玻璃使用的是大猩猩3代……家长老师必备,奖状生成器大家好,我是九剑。读书时期,有没有一些令大家难以释怀的事物,或者风景呢?对于九剑来说,曾经一起嬉耍的小伙伴,小卖铺的零食,还有那个一袭白裙,马尾飘飘的女孩儿都是美好……奥诺资本杨科我与创业这些年思考再三,决定还是拿起这无言的笔,捋一捋这些年踩过的坑,迷失过的方向。聊聊为何现在这个节点,开始写自媒体文章:互联网自媒体平台是一个特别好的发声平台,分享平台……想入手一台全画幅相机佳能5d4佳能EOSR索尼A7m3松下S在这几款相机里面:佳能5D4是单反相机,具有光学取景器。单反相机与其他的微单相机是结构性的差异,它具有运动追焦出色,抓拍效果好、取景不费电的优势,也存在笨重、不支持佳能R……平板市场真热闹,小米平板5,荣耀V7promatepadip村长带大家横向对比一下几块平板:小米平板5,5pro,华为matepad,荣耀平板v7pro,ipadpro的区别处理器:小米平板5骁龙860,安兔兔跑分49……
4s破百四驱大空间,30万预算买纯电车,选这两款不会有错兜兜转转,在油价重回8元时代的今天,油价的飞涨真的令小编泪目。除了大城市的牌照原因,在油价和油耗的双重压力下,越来越多的消费者开始选择纯电汽车。如果你有30万的预算,那这两辆颜……华为MateBook13s14s智慧化功能加持性能同样强悍华为在PC领域已经深耕多年,华为MateBook也发展出MateBookX系列、MateBook数字系列及MateBookD系列等多个满足不同消费者诉求的细分产品线。作为华为M……华为发布5G多模终端芯片巴龙5000,5G手机稳了一直致力于5G商用研发的华为,终于在今日正式发声,华为消费者业务CEO余承东宣布:MWC2019,华为将发布5G折叠屏手机。据悉,华为将在2月的巴展上正式亮相5G折叠屏手……双11再迎喜讯,天猫京东唯品会转向之后,中国铁路也来助攻很多人已经发现,在这次浪潮之下,整个中国商业竞争的环境迎来了巨变。就拿这次双11来说,跟往年完全不一样了。各大平台不再相互对标,而是潜心修炼内功。竞争也不再是主元素,取而代之的……大数据编程入门JavaStreamFile及IO在Java中的Java。io包是什么?其中的流又是什么?而它们在Java中又有着什么样的功能?不知道?别担心,今天小编将为大家带来大数据编程入门:JavaStream、File……沉浸式体验5G万物智联!服贸会这个专题展不容错过来源:人民网人民网北京8月30日电(董兆瑞)超高清视听盛宴、沉浸式参与体验、5G万物智联的高科技元素,9600平方米的单独展馆让观众身临其境,来一场充满便利与惊喜的智能科……Avid为NBC奥运全球制作团队提供节目生产系统近期,NBC体育集团的奥运团队,选定Avid(纳斯达克股票代码:AVID)为其在7月23日至8月8日日本东京第三十二届奥运会提供内容生产和媒体管理平台、工具及解决方案。日前,N……换代后更运动,后排胜过凯美瑞,这车综合马力215匹,油耗仅4自2018年上市以来,十代雅阁的表现有目共睹。在没有大幅度降价让利及年度改款升级的前提下,雅阁的热度还是非常高,颇有闷声发大财之势。在上一代车型时,老对手凯美瑞还算和雅阁打个平……极限载重测试!这款仅23克的空投器能让御air2带多重的东西无人机除了航拍还能不能干点别的呢?比如给心爱的她一个惊喜今天给大家介绍一个神器御air2专用空投器!机身小巧、可快速拆装轻松挂载并投掷……以人类现有飞行器的极速地球到太阳要多久?早上出门,从家里步行到学校,也许需要半个小时的时间。放假出去旅游,坐火车,可能需要五六个小时。坐轮船,横渡太平洋,可能需要两三个月。如果坐飞机,横渡太平洋,可能需要12个小时。……孙宇晨转16。5万个ETH至币安,自称内部调配钱包,对后市持今日,根据链上动态显示,波场创始人孙宇晨12月份以来频繁将ETH存入到币安,每次操作24万个ETH,截至12月28日共存入约165,989ETH(5。92亿美金)。对此,……诺基亚C20Plus新品官宣6月11日发布6月3日,诺基亚官方宣布,诺基亚C20Plus新品将会在6月11日正式发布,同时还公布了新机图片。从官方公布的图片看,诺基亚C20Plus后置摄像头模组为圆形设计,后置为……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网