Mybatis 小总结

来源:互联网 发布:龙诚健康大数据 编辑:程序博客网 时间:2024/06/14 22:08
1.mybatis和hibernate的区别?
(1) 两个最大的区别
          针对简单逻辑,Hibernate和MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法;
          针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
(2) 开发难度:
          Hibernate的开发难度要大于Mybatis。主要由于Hibernate比较复杂、庞大,学习周期较长。
          而Mybatis则相对简单一些,并且Mybatis主要依赖于sql的书写,让开发者感觉更熟悉。
(3) sql书写比较:
          Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。
          Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。
(3) 数据库扩展性比较 :
          Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。
          Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。
(5) 日志系统:
          hibernate日志系统非常健全,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;
          而mybatis没有自己的日志统计,所以要借助log4j来记录日志。
(6) sql语句的优化上:
          由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql。

2.为什么 dbutils 或 SpringJdbcTempate 不能称为是框架, 而mybatis可以称之为框架?
     因为 dbutils 或 SpringJdbcTempate 不能去映射关联关系,而mybatis可以。

3.mybatis 中$ 和 #的区别?
#{}表示一个占位符号  : 
1.#{}相当于preparedStatement中的占位符赋值
2.自动进行java类型和jdbc类型转换
3.防止sql注入
4.可以接收简单类型值或pojo属性值
5.传输单个简单类型值,#{}括号中可以是任意名称
6.#传入的数据,在mysql中会被当成字符串,自动加个双引号,很大程度防止sql注入,安全的。
       ${}表示拼接sql拼串,将parameterType 传入的内容拼接在sql中:
1.不把java类型转为jdbc类型
2.可以接收简单类型值或pojo属性值
3.parameterType传输单个简单类型值,${}括号中只能是value。
4.$传入的数据会直接显示在sql中,一般传数据库对象(列名),它不能防止sql的注入,不安全。
      说明:MyBatis排序时使用order by 动态参数时需要注意,用$而不是#;

4. mybatis配置文件中, parameterType、resultType、resultMap三者有什么区别?
     parameterType是在mapperxml文件CRUD进行传参的属性,可以不指定。
     MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
     实现原理:
     在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
      当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性,所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
      当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

5.ofType和JavaType的区别?
     都是指定对象的类型 不同的是当使用反向查询select从另一个maper文件中取出数据时必须用ofType ,都可以为collection和association是指定对象的类型, ,都不是必须写的, 只有反向select时需要ofType.
[html] view plain copy
  1. <select id"selectCustomer2" resultMap ="customerMap2">  
  2.           SELECT c.customer_Id, customer_Name, o.order_Id AS "o.orderId",order_Name  
  3.           FROM customers c  
  4.           LEFT OUTER JOIN orders o  
  5.           ON o.customer_Id = c.customer_Id  
  6.           WHERE o.customer_Id= #{customerId}  
  7. </select >  
  8.   
  9. <resultMap type="com.atguigu.mybits.beans.Customer" id="customerMap2" >  
  10.      <id column"customer_Id" property ="customerId"/>  
  11.      <result column"customer_Name" property="customerName" />  
  12.     <!-- 映射集合属性 -->  
  13.      <collection property"orders" javaType="com.atguigu.mybits.beans.Order" >  
  14.          <id column"o.orderId" property ="orderId"/>  
  15.          <result column"order_Name" property="orderName" />  
  16.      </collection>  
  17. </resultMap >  
[html] view plain copy
  1. <!--  
  2.     映射集合属性, 也可以分两条语句.  
  3.     使用 collection 映射集合属性!  
  4.     1. 使用 select 标记使用的另一条 SQL 的 id  
  5.     2. 若使用了 select 属性, 则不能再使用 javaType 来标记集合中元素的类型, 而要使用 ofType.  
  6.     3. 使用 column 传递 select 对应 SQL 中的参数. 通常为当前 SQL 的主键列的列名.  
  7.     4. 若需要对关联的集合对象使用懒加载, 则需要设置 collection 的 fetchType 属性为 lazy. 默认为 eager.  
  8. -->  
  9. <select id="selectCustomer3" resultMap="customerMap3" >  
  10.     SELECT c.customer_Id,customer_Name  
  11.     FROM customers c  
  12.     WHERE c.customer_Id = #{customerId}  
  13. </select >  
  14.   
  15. <resultMap type="com.atguigu.mybits.beans.Customer" id="customerMap3" >  
  16.      <id column"customer_Id" property ="customerId"/>  
  17.      <result column"customer_Name" property="customerName" />  
  18.   
  19.      <collection property"orders" ofType="com.atguigu.mybits.beans.Order"  
  20.          select"selectOrder" column ="order_Id" fetchType ="lazy">  
  21.      </collection>  
  22. </resultMap >  
  23.   
  24. <select id="selectOrder" resultType="com.atguigu.mybits.beans.Order" >  
  25.     SELECT order_Id, order_Name  
  26.     FROM orders  
  27.     WHERE order_Id = #{orderId}  
  28. </select >  

6.mybatis在xml文件中处理大于号小于号的方法
(1) 第一种方法:
    用了转义字符把>和<替换掉,然后就没有问题了。
[html] view plain copy
  1. SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE    
附:XML转义字符

(2) 第二种方法:
    因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析,例如:
[html] view plain copy
  1. <![CDATA[ when min(starttime)<='12:00' and max(endtime)<='12:00' ]]>  

     Mybatis相关练习源码请参考:https://github.com/luomingkui/Mybatis
原创粉丝点击