MyBatis的优化注意点

我们在项目中经常会用到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) 


总结: 

每个工具都有他试用的范围,需要根据我们的实际情况灵活应用。而且每个问题都有很多方法,我们要多思考那些简单、可用、高效的方法。不断思考,才能不断进步。


转载于:https://juejin.im/post/5d072a8451882548ac439c2b

猜你喜欢

转载自blog.csdn.net/weixin_33713503/article/details/93178099