自学Mybatis系列(3)——MyBatis的映射器


写在前面:十分感谢《深入浅出Mybatis技术原理与实战》这本书,大多数地方是书上的话,希望自己能在后面的文章中多写一些自己的理解。而且最重要的是!每次照书无脑敲的时候,都好羞愧啊(害羞脸)。后面一定注意这些问题。最后要感谢点赞、评论以及指正的朋友们,你们是坠吼的!!!


Mapper 映射器

映射器是个好东西,按照官方文档的话来说就是:

The true power of MyBatis is in the Mapped Statements. This is where the magic happens.

简单翻译就是:Mybatis真正的力量来源于它的映射语句,那里是见证奇迹的地方!
Mapper XML文件相对简单。 如果你将它们与等效的JDBC代码进行比较,你会节省95%的代码!MyBatis的目的是专注于SQL,并尽力去帮我们节省时间和精力去做其他的部分。
Mapper XML文件只有几个一级元素,介绍一下:

  • cache - 给定命名空间的缓存配置。
  • cache-ref - 从另一个命名空间引用缓存配置。
  • resultMap - 最复杂最也是最强大的元素,描述如何从数据库结果集中加载对象
  • parameterMap - 已过时!
  • sql - 可以被其他语句引用的SQL的可重用块。
  • insert - 映射INSERT语句。
  • update - 映射UPDATE语句。
  • delete - 映射DELETE语句。
  • select - 映射SELECT语句。

我们将逐个击破!

select

select语句是我们在Mybatis中使用最多的语句。我们使用查询语句的频率高于我们使用修改语句的频率,对于插入,更新或删除,来说,他们中可能会包含着很多的选择。 直接举例子吧:


此语句接受类型为int(或Integer)的参数,并返回Map类型的数据。
注意参数符号:#{id}
让我们看一下如果使用JDBC的话代码是什么样子的:

// JDBC代码,不是Mybatis
      String sql = "SELECT * FROM PERSON WHERE ID=?";
      PreparedStatement ps = conn.prepareStatement(sql);
      ps.setInt(1,id);

可以想象,如果字段很多的话,传统方式下我们将会在书写很多重复的代码,这样不仅很枯燥,还很容易出错。例如:


      select
        
            
        ,
        
            
        
         from t1
         cross join t2
    

我们也可以给refid参数值


  select * from 

这样实现了定义一处,很多地方也可以引用。


参数

对于储存过程来说,有三种参数:输入参数、输出参数、输入输出参数。大部分情况下Mybatis回去推断返回数据的类型,所以大部分情况下是不要去配置参数类型和结果类型的。但返回为空的字段类型是需要去设置的,因为Mybatis无法判断null是什么类型!
关于参数我想说一下特殊字符替换和处理的问题(#{}和${})
这里我要说两点:
1.#{}方式能够很大程度防止sql注入。
2.排序时使用order by 动态参数时需要注意,用$而不是#
3.尽量都使用#{}

resultMap

resultMap元素是MyBatis中最重要和最强大的元素。 就是有了这个东西才允许我们节省90%的代码。JDBC需要从ResultSets检索数据,也就是说,因为resultMap在某些情况下Mybatis允许你做的事情,JDBC并不支持。
resultMap定义的主要是一个结果集的映射关系。MyBatis现有的版本只支持查询。resultMap很复杂,在这只能简单列一下它的构成,具体的得我深入了解以后,再单独开一个番外去研究。
resultMap里的元素:


     
        
        
    
      
       
        
         
      
          
    

你可能感兴趣的:(自学Mybatis系列(3)——MyBatis的映射器)