MyBatis的优化注意点

来源:互联网 发布:加购软件 编辑:程序博客网 时间:2024/05/16 07:55

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

总结:

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

3 0
原创粉丝点击