MyBatis2
缺点
编写SQL语句工作量较大,对开发人员编写SQL语句的功底有一定的要求。
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
优点
MyBatis是免费且开源的。
与JDBC相比,减少了50%以上的代码量。
MyBatis是最简单的持久化框架,小巧并且简单易学。
MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML中,和程序逻辑代码分离,降低耦合度,便于统一管理和优化,提高了代码的可重用性。
提供XML标签,支持编写动态SQL语句。
提供映射标签,支持对象与数据库的ORM字段关系映射
支持存储过程。MyBatis以存储过程的形式封装SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。
MyBatis 缓存 ( 一级缓存和二级缓存 )
MyBatis提供了一级缓存和二级缓存的支持。默认情况下,MyBatis只开启一级缓存。
一级缓存:
一级缓存是基于PerpetualCache(MyBatis自带)的HashMap本地缓存,作用范围为SQLsession域内。当session flush(刷新)或者close(关闭)之后,该session中所有的cache(缓存)就会被清空。
在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用同一个mapper的方法,往往只执行一次SQL。因为使用SqlSession第一次查询后,MyBatis会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession会取出当前缓存的数据,而不会再次发送SQL到数据库
由于SqlSession是相互隔离的,所以如果你使用不同的SqlSession对象,即使调用相同的Mapper、参数和方法,MyBatis还是会再次发送SQL到数据库执行,返回结果。
二级缓存
二级缓存是全局缓存,作用域超出SQLsession范围之外,可以被所有SqlSession共享。手动开启
resultMap 元素
resultMap是MyBatis中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。
一对一关联查询:
通过<resultMap>元素的子元素<association>处理一对一级联关系
<association>元素中通常使用以下属性:
property:指定映射到实体类的对象属性
column:指定表中对应的字段(即查询返回的列名)
javaType:指定映射到实体对象属性的类型
select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询
一对多关联查询:
通过<resultMap>元素的子元素<collection>处理一对多级联关系,collection可以将关联查询的多条记录映射到一个list集合属性中
<collection>元素中通常使用以下属性:
property:指定映射到实体类的对象属性
column:指定表中对应的字段(即查询返回的列名)
javaType:指定映射到实体对象属性的类型
select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询
resultType和resultMap的区别:
MyBatis的每一个查询映射的返回类型都是resultMap,只是当我们提供的返回类型是resultType时,MyBatis会自动把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap时,MyBatis会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。
MyBatis 动态 SQL
动态SQL只有几个基本元素,与JSTL或XML文本处理器相似,十分简单明了,大量的判断都可以在MyBatis的映射XML文件里配置,以达到许多需要大量代码才能实现的功能
动态SQL大大减少了编写代码的工作量,更体现了MyBatis的灵活性、高度可配置性和可维护性。
if标签:
MyBatis if类似于Java中的if语句,是MyBatis中最常用的判断语句。使用if标签可以节省许多拼接SQL的工作,把精力集中在XML的维护上。
语法:
<if test="判断条件">SQL语句</if>
当判断条件为true时,才会执行所包含的SQL语句
choose、when和otherwise标签:
MyBatis中动态语句choose-when-otherwise类似于Java中的switch-case-default语句。由于MyBatis并没有为if提供对应的else标签,如果想要达到<if>...<else>...</else></if>的效果,可以借助<choose>、<when>、<otherwise>来实现。
(<表示< >表示> <=表示<=)
where标签:
where标签主要用来简化SQL语句中的条件判断,可以自动处理AND/OR条件
set标签:
在MyBatis中,update语句可以使用set标签动态更新列。set标签可以为SQL语句动态的添加set关键词,剔除追加到条件末尾多余的逗号
foreach标签:
foreach标签用于循环语句,它很好的支持了数组和List、set接口的集合,并对此提供遍历的功能
foreach标签主要有以下属性:
item:表示集合中每一个元素进行迭代时的别名
index:指定一个名字,表示在迭代过程中每次迭代到的位置
open:表示该语句以什么开始(既然是in条件语句,所以必然以(开始)
separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是in条件语句,所以必然以,作为分隔符)
close:表示该语句以什么结束(既然是in条件语句,所以必然以)开始)
注意:
使用foreach标签时,最关键、最容易出错的是collection属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下3种情况:
1.如果传入的是单参数且参数类型是一个List,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组,collection的属性值为array
3.如果传入的参数是多个,需要把他们封装成一个Map,当然单参数也可以封装成Map。Map的key是参数名,collection属性值是传入的List或array对象在自己封装的Map中的Key。
bind标签:
bind标签可以通过OGNL[对象导航图语言(Object Graph Navigation Languge)]表达式自定义一个上下文变量
trim标签:
trim一般用于去除SQL语句中多余的AND关键字、逗号,或者给SQL语句前拼接where、set等后缀,可用于选择性插入、更新、删除或者条件查询等操作