大家好,我是IT修真院成都分院第18期的学员,一枚正直纯洁善良的java程序员,今天我要分享的是修真院官网java任务二,深度思考中的知识点——Mybatis有哪些常用标签?怎么使用标签来完成动态查询?
背景介绍
Mybatis是ORM(对象关系映射Object Relation Mapping)框架,支持定制化SQL,存储过程,高级映射。 原叫ibatis,在2010年迁移到google code,同年并改名MyBtis,2013年迁移到GItHub。
它的出现更是因为jdbc程序的缺陷: -大量配置信息硬编码 -大量无关业务处理的编码 -扩展优化不便,Mybatis也就有了对应的解决方案,xml配置和注解,POJO对象和数据库记录直接映射,比较完善的文档记录查询。mybatis的优势就是,学习成本较低,通过配置数据库交互的信息,动态SQL处理。
下面的内容不会介绍Mybatis的配置相关内容,直入Mybatis的XML映射文件常用标签和动态SQL语句。
知识剖析
一. XML映射的常用标签。
增删改查(insert,delete,update,select),SQL重用标签。
select查询,查询的演示在下面的编码实战,以下是查询的常用参数解析
id:select和insert,update,delete都有的参数,为当前语句命名,必须与Mapper接口中的方法同名
parameterType:将会传入这条语句的参数的类全限定名或别名。可写可不写,因为Mybatis可以通过类型处理器(TypeHandler)推断传入的参数
resultType:这条语句中返回结果的类全限定名或别名。resultMap可以代替它,两者只能存在一个。
flushCache:清理缓存,默认false;
useCache:缓存本条语句查询内容,select语句默认为true;
statementType默认值:PREPARED,让MyBatis使用PreparedStatement 执行语句。等。
insert,update,delete数据变更语句的参数差不多。放在一起说明。
id,parameterType,flushCache,statementType和上面一样。不同的是:
没有resultType,因为增删改不需要其他类型返回值,统一返回影响的行数。
useGeneratedKeys:insert和update使用,获取数据库的自增主键,搭配keyProperty。
keyProperty:指定能够唯一识别对象的属性
3.SQL这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。
二. 动态SQL语句
if,choose (when, otherwise),trim (where, set),foreach。
1.if语句
常见用法<if test=" 条件"></if>加在映射语句的后面, test是判断的条件
2.choose(when,otherwise)语句
当有多个条件判断时,不想使用所有的,只想从多个中选一个使用,类似于java中的Switch语句。
<choose> <when test=" "></when> <when test=" "></when> ... <otherwise></otherwise> </choose>
3.where,trim,set语句
where常与if搭配,只在条件都是动态的情况下使用。
<where> <if test="" ></if> <if test=""></if> ...</where>
trim自定义元素,trim是更灵活的去除多余关键字的标签,以及增加或者替换某块代码。
(1)trim标签有四个属性prefix,prefixOverrides,suffix,suffixOverrides
(2)使用prefix,suffix时,表示在trim标签包裹的前面或者后面增加引号里的内容
(3)prefixOverrides,suffixOverrides 表示删除或者说覆盖。
这儿不理解的看下面的编码实战的案例
set动态更新语句,用在update中。test里是列名判断语句
update tb_name <set> <if test="tr_name !=null"> tr_name = #{trName}</if>...</set> where id=#{id}
4.foreach语句
常见使用场景是对集合进行遍历,批量插入、批量删除,批量查询等。
foreach 元素的属性主要有 item,index,collection,open,separator,close。
item 表示集合中每一个元素进行迭代时的别名
index 指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,类似于数组下标。
open 表示该语句以什么开始,
separator 表示在每次进行迭代之间以什么符号作为分隔 符,
close 表示以什么结束。
collection要注意下,传入的是数组或者List等集合,那么值为array或者list,如果传入的是Map类型。值为Map中自定义的key。可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。
foreach
5.bind语句
bind 元素允许你在表达式以外创建一个变量,并将其绑定到当前的上下文。类似于java中定义一个成员变量,然后在方法中引用。下面定义模糊查询的条件为一个变量名pattern
<bind name="item" value="'%' + name+ '%'" />
SELECT * FROM tb_name WHERE title LIKE #{pattern}
常见问题&解决方案
1.在没有熟悉的情况下使用动态语句会出错。下面说明常出错的地方。
解决方案:这篇详细内容会让你更加熟悉Mybatis标签。比如使用了where语句,不能再使用<where>标签;resultType和resultMap参数不能同时使用;当Mapper接口有多个参数传递的时候,要加在接口传参处加@Param(“命名”);foreach的collection属性一定要理解,容易出错,还有就是迭代集合的时候,要用别名.值,即#{item.name},这儿是我自己掉的坑。
2.哪些是常用标签,动态标签我需要每个都要用吗?
解决方案:常用的就CRUD那四个(select,update,insert,delete),根据业务不同和需要,采用动态标签进行实现,不一定在一个项目中都用到,但是要考虑业务的扩展性,最后在设计最初,就考虑多一点,就比如查询全部,也许再以后新增按照名称,时间,状态等条件查询,这些都可以用动态查询补充。
3.if标签与choose标签的区别和选择
解决方案:if条件成立会连接当前语句,并继续执行下一条if,直到最后结束;而choose中,when则相当于从多个中选择一个,when判断成立,就不会继续执行。
编码实战
扩展思考
1.使用foreach语句会影响数据库的性能吗?
例如在执行几万插入时,性能降低的很明显,foreach 的集合越大,解析就越慢。可以选择自己拼接代码,而不再使用 foreach 啦。
参考文献
更多讨论
详见视频:
A1: useCache将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。二级缓存指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建出的SqlSession对象共享其缓存.缓存都是放在内存中的。
鸣谢
感谢李邵博师兄,和其他诸位师兄,此教程是在他们之前技术分享的基础上完善而成。
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
进入链接详情http://www.jnshu.com/login/1/41570520