MyBatis映射文件&动态SQL回顾和拓展_TCF

MyBatis映射文件&动态SQL回顾和拓展

                                                                                   20190620 田超凡

  知网用户_进击的猿宝宝(田超凡)为本文作者,如需转载请注明原作者

 

  1. MyBatis映射文件

  (1).关于映射文件的一些必要条件和约束:

   一、映射文件是必要的。

映射文件存在的目的就是可以建立ORM映射关系,在程序中以OOP的方式来执行映射文件中预先定义的对应的SQL语句来实现对数据库的CRUD操作。因此,映射文件是MyBatis必不可少的一部分,没有映射文件的MyBatis也就没有实际存在的意义,因为持久层框架存在的目的就是简化程序对数据库的持久化操作,不要映射文件的话为什么不选用传统的JDBC呢?很明晰弊端很多比如SQL注入拼接麻烦等等问题。因此,映射文件在MyBatis中的地位及其重要。

 

二、每一个映射文件必须和一个持久层接口关联。

需要在映射文件的根元素mappernamespace指定。原因很容易理解,在一个大型软件系统中,数据库的表是非常多的,对应的POJO肯定也是非常多的,每一个POJO一般情况下都对应一个持久层接口和一个映射文件,如果持久层接口没有和映射文件进行关联,则映射文件也就没有了依赖的源,或者说不知道需要执行哪些SQL,而映射文件和持久层接口进行11关联之后,映射文件的职责就变得更加单一和清晰了,作为映射文件而言,他只需要关注他关联的持久层接口中有哪些持久化操作方法,然后编写对应的SQL语句和这些方法关联即可。当关联的持久层接口方法发生变动(包括方法名、返回值、参数)时,映射文件中的方法也需要进行相应调整来适配这些关联的接口中的方法。因此,每一个映射文件必须要通过顶级元素mappernamespace属性显示指定关联的映射接口,这个是必要条件。

 

三、每一个映射文件中的SQL语句必须和关联的持久层接口中的方法保持一一对应关系。

映射文件和持久层接口进行11关联后,映射文件也需要和持久层接口中的方法数量保持一致,包括映射的方法名称(通过映射文件元素的id属性指定),入参类型(parameterType)和返回值类型(resultType/resultMap)。否则一旦持久层接口中的方法数量很多,和映射文件中每个方法对应的大量SQL语句匹配困难度会提升,并且容易出错。

 

  四、关于映射文件的命名规则一定要遵循

MyBatis中的映射文件一般以xml格式存放在三层架构的持久层,传统和习惯上我们对于这些映射文件的命名也是需要遵循一定规则的,大多数情况下习惯以POJO+Mapper的方式来命名,统一这样命名的优点就体现在当一个成熟完善的软件系统将持久层和业务层以及控制层进行整合时,尤其是Spring整合MyBatis时,可以基于映射文件的命名规则使用通配符一下扫描到所有的映射文件和持久层接口,所以一般建议遵循这个映射文件命名规范。

 

  1.1 resultMap 关联映射

     ORM指的是对象-关系映射,当作用于MyBatis,ORM主要目的是将关系型数据库中的表和后台程序中的持久类(POJO,指持久层的普通成员类)建立映射关联,使得数据库中的表和持久类进行关联,表的字段和持久类的属性关联。但是如何自定义一些规则来快速高效匹配表中的字段和POJO的属性呢?MyBatis作为一款基于ORM的持久层框架,自然为我们考虑到了这个问题,那就是在Mapper映射文件中进行自定义映射关系,即resultMap元素来建立表字段和持久类属性之间的映射关系。指定resultMap建立映射关系之后,就可以在映射文件其他需要返回查询结果的地方直接通过resultMap属性来引用这个预先定义好的映射结果集,resultMap元素中的子元素一般以为主。

 

  1.2使用association实现一对一关联映射

   associationresultMap元素的一个子元素,其存在的意义主要是当POJO中的属性是另一个POJO引用时,可以通过association元素来显示映射关联的这个POJO,但是需要显示指定association元素的javaType\column属性,分别指的是映射的目标POJO的类型和外键关联字段名。

 

  1.3使用collection实现一对多关联映射

  collection元素也是resultMap的一个子元素,collection元素主要适用于当需要映射的POJO中包含集合类型的属性时,可以通过配置自动进行1:N关联映射填充这些集合元素的属性。同样需要显示指定collection元素的ofType/column属性来定义需要映射的目标集合元素类型和关联字段,根据定义的规则自动映射关联的集合元素。

 

  1.4 MyBatis缓存和延迟加载

  MyBatis针对DQL查询语句提供了缓存和延迟加载机制,默认是没有开启二级缓存和延迟加载的,默认只开启了一级缓存。一级缓存可以在MyBatis配置文件中配置全局元素来指定,一级缓存缓存的是全局查询语句,也就是对整个持久层映射体系中的查询语句有效。二级缓存指的是局部查询语句,指可以针对一个或者部分映射文件中的一个或多个SQL查询语句开启,二级缓存需要在需要开启的SQL元素上通过cacheEnabled属性开启。

需要注意的是:MyBatis一级缓存和二级缓存主要是优化多次执行相同查询语句时的查询性能问题,对于增删改操作是无效的。同时如果在多个查询语句和增删改语句同时操作的情况下,每次执行增删改语句都会清空缓存,但是如果同时执行多个查询语句时,只要配置了开启缓存,都是会采用配置的MyBatis缓存机制的。

  1. 常用的动态SQL元素

  2.1 if 基本判断

if元素主要运用在SQL查询语句的条件子句中,大多数情况的主要作用是直接进行逻辑判断来拼接查询条件

 

  2.2 if+set 逻辑判断和更新

set元素主要用于UPDATE语句,替换SET关键字实现相同效果,并可以根据if元素的判断条件进行需要更新的字段和更新值进行自动匹配,动态实现UPDATE操作。

 

  2.3 if+where 条件自适应逻辑判断

where元素主要可以替代查询SQL语句的WHERE关键字,特点在于使用where元素可以自动根据条件的数量和多少动态插入WHERE或者删除WHERE,在没有条件的时候自动剔除WHERE关键字,在有条件的时候自动加上WHERE关键字,实现SQL查询语句的动态化,提高多参数多条件查询的灵活性。


  2.4 if+trim 条件缀式过滤

trim元素主要是可以对SQL语句中动态拼接的多余的前缀和后缀进行忽略或接入处理,prefix属性指定需要自动加上的前缀,suffix属性指定需要自动加上的后缀,prefixOverrides属性指定需要自动忽略的多余前缀,suffixOverrieds属性指定需要自动忽略的多余后缀。

  2.5 choose+when+otherwise 多重并列分支

choose+when+otherwise主要适用于统一列举值的多重分支情况,类似后台逻辑结构switch-case,主要目的是进行多重并列分支的条件判断,简化大量的if元素。

 

  2.6 foreach 元素迭代

foreach元素可以迭代一个数组或集合参数,主要应用场景是在提供的多个列举值中检索匹配结果,如IN /NOT IN子查询语句,foreach元素可以通过collection指定需要遍历的集合参数,item指定每次迭代的对象名称,open指定循环开始前需要加上的前缀,separator指定每次循环结束后需要加上的分隔符,close指定整个循环结束后需要加上的后缀。

 

2.7 sql语句复用和入参

当需要在同一个映射文件多个SQL语句中复用同一段SQL,此时可以把这段需要复用的SQL单独提出来放置在sql元素中,其他需要引用这段SQL语句的地方直接使用include refid指定需要复用的sql,一定程度上减少了复杂业务编写的SQL语句的复杂程度。

对于MyBatis映射文件参数入参,可以使用#{参数名}或者${参数名}的方式。

#{参数名}是直接将参数解析为普通字符串动态拼接到SQL语句中,参数是动态拼接的,因此整个SQL的执行过程是安全的。

${参数名}是将参数作为一个变量拼接到SQL语句中,灵活方便,但是可能存在部分SQL注入风险,不能保证SQL执行过程是完全安全的,因为有可能在SQL执行过程中这个变量的值发生更改,就会产生风险。虽然概率很小,但是一般不建议使用此种方式入参,除非该参数对整个SQL语句执行过程影响不大,比如动态指定排序规则等,此时为了确保灵活性可以使用此种方式入参。但是如果涉及到敏感字段则不建议使用这种方式入参。

 

你可能感兴趣的:(MyBatis框架)