我们在项目中经常会用到Mybatis,可是我们怎么才能灵活的应用mybatis,使我们的程序性能更好呢?接下来我们就来看看这几个点。
1、批量操作
我们经常会遇到对批量数据的操作,一般来说我们想的是利用循环,然后一个个处理。然而这样的处理效率并不高。mybatis给我们提供了批量操作的方法,让我们来看一下。
//批量插入
<insert id="addTrainRecordBatch" parameterType="java.util.List">
insert into t_train_record (add_time,emp_id,activity_id,flag)
values
<foreach collection="list" item="item" index="index" separator="," >
(#{item.addTime},#{item.empId},#{item.activityId},#{item.flag})
</foreach>
</insert>
- foreach解析
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么结束,
- 注意Collection
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map
2、resultMap与resultType
在这儿我们要说明一下这两者关系,防止有人把他弄混。
resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key–>value关系)
- 对比
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
3、轻量化数据查询
如果我们涉及到多表查询的时候我们首先会想到什么?自然是连接查询,分为内连接和外连接,这里不再细说几种连接查询。
我们都知道连接查询要比in查询的效率要高,可是需要注意的是,如果我们是互联网企业,追求性能要高,采用分库分表,这样就要求我们要把一个连接查询拆成多条简单查询,此时用in就比较好了。
//内连接
select name,age,userRow from user as u inner join rol as r on u.userId=r.userId
//in(多条语句)
select name,age,userRow from user where userId in (select userRow,userId from rol)
总结:
每个工具都有他试用的范围,需要根据我们的实际情况灵活应用。而且每个问题都有很多方法,我们要多思考那些简单、可用、高效的方法。不断思考,才能不断进步。