13 Nov 2016

深入浅出mybatis(三):拦截器,动态sql,缓存

深入浅出mybatis(三):拦截器和动态sql

目录

欢迎在文章下方评论

mybatis拦截器

###mybatis的拦截器实现分页(动态代理) 拦截sql语句来实现分页:

  1. 拦截什么样的对象(以page作为参数传入;page对象)
  2. 拦截对象什么行为
  3. 什么时候拦截 (在prepareStatement的时候拦截) (源码)

###具体过程

  1. RoutingStatementHandler
  2. 通过RoutingStatementHandler对象的属性delegate找到statement实现类BaseStatementHandler
  3. 通过BaseStatementHandler类的反射得到对象的MappedStatement对象
  4. 通过MappedStatement的属性getID得到配置文件sql语句的ID
  5. 通过BaseStatementHandler属性的到原始sql语句
  6. 拼接分页sql
  7. 需要查询总数的sql
  8. 通过拦截Connection对象得到PrepareStatement对象
  9. 得到对应的参数
  10. 把参数设到prepareStatement对象里的?(该?号在配置文件以#{}形式存在,mybatis会把它转为?号)
  11. 执行改sql语句
  12. 得到总数
  13. 把属性值为新的sql

动态sql

批量删除:

delete from
		study_material
		where
		subject_id=#{subject.id} and web_id=#{webTitle.id}
		and id in(
  		<foreach collection="idlist" item="item" separator=",">
  			#{item}
  		</foreach>
  	)

批量增加:

insert into
		study_material(id,web_id,M_name,M_resource_url,M_upload_date,subject_id) values
		<foreach collection="list" item="item" separator=",">
			(#{item.id},#{item.webTitle.id},#{item.name},#{item.resourceUrl},#{item.uploadDate},#{item.subject.id})
		</foreach>

批量更新

  <foreach collection="list" item="item" index="index" open="" close="" separator=";">
				update test 
				<set>
				  test=${item.test}+1
				</set>
				where id = ${item.id}
		 </foreach>
  • item:循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。 具体说明:在list和数组中是其中的对象,在map中是value。 该参数为必选。
  • collection:要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:

    如果User有属性List ids。入参是User对象,那么这个collection = “ids” 如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id” 上面只是举例,具体collection等于什么,就看你想对那个元素做循环。 该参数为必选。

  • separator:元素之间的分隔符,例如在in()的时候,separator=”,”会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
  • open:foreach代码的开始符号,一般是(和close=”)”合用。常用在in(),values()时。该参数可选。
  • close:foreach代码的关闭符号,一般是)和open=”(“合用。常用在in(),values()时。该参数可选。
  • index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

缓存

mybatis缓存


Tags:
Stats:
comments


Share: