mybatis

1.插入时id自增

<insert id="add"  parameterType="com.xx.yy" keyProperty="id" useGeneratedKeys="true">
	  
		insert into sys_detail
		<trim prefix="(" suffix=")" suffixOverrides="," >
			<if test="key != null">key,</if>
		</trim>
		<trim prefix="values (" suffix=")" suffixOverrides="," >
			<if test="key != null">#{key},</if>
		</trim>
	</insert>
<insert id="insert" parameterType="Person">
        <selectKey keyProperty="id" resultType="long">
            select LAST_INSERT_ID()
        </selectKey>
        insert into person(name,pswd) values(#{name},#{pswd})
</insert>

2.批量插入

<insert id="batchInsert" parameterType="java.util.List">  
    INSERT INTO STUDENT (id,name,sex,tel,address)  
    VALUES   
    <foreach collection="list" item="item" index="index" separator="," >  
        (#{item.id},#{item.name},#{item.sex},#{item.tel},#{item.address})  
    </foreach>  
</insert> 
3.批量修改/删除
<update id="batchUpdate" parameterType="java.util.List">  
    UPDATE STUDENT SET name = "250" WHERE id IN  
    <foreach collection="list" item="item" index="index" open="(" separator="," close=")" >  
        #{item}  
    </foreach>  
</update>  

这种批量插入、修改、删除的方式比程序中for循环调用快原因如下:

(1)、网络间传递的数据量少,当然传递的时间就少了很多。

(2)、请求数据库服务的次数少,因为连接数据库服务是很耗时的(所以出了数据库连接池)。

(3)、mybatis 在执行的时候才会获取Connection ,statement 对象所以想不for循环少创建了很多对象。

(4)、mybatis 的 执行方式有三种即:SIMPLEREUSEBATCH 三种方式,如果方便的话设置一下,如果使用SIMPLE每一次执行都创建Statement对象并执行,如果使用REUSE  则重复使用preparedStatement 对象来执行 而BATCH 就是批量执行了而mybatis默认就是使用 SIMPLE 方式来执行,所以我们要注意最起码是不是应该是REUSE  执行方式。

Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。

BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。

4、参数list时,先判断是否为空,否则会报错。

5、mybatis ${}与#{}的区别

简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select * from table where id=?

然而${} 则是不能防止SQL注入打印出来的语句 select * from table where id=2  实实在在的参数。
最简单的区别就是${}解析穿过来的参数值不带单引号,#{}解析传过来参数带单引号。
最后总结一下必须使用$引用参数的情况,那就是参数的int型的时候,必须使用$引用。

6. 判断map

<select id="selectRule" parameterType="Map" resultType="com.ourangel.weixin.domain.Rule">  
    SELECT ruleId,msgType,event,respId,reqValue,firstRespId,createDate,yn  
    FROM oal_tb_rule  
    WHERE yn = 1  
    <if test="_parameter.containsKey('msgType')">  
        AND msgType = #{msgType,jdbcType=VARCHAR})  
    </if>  
    <if test="_parameter.containsKey('event')">  
        AND event = #{event,jdbcType=VARCHAR})  
    </if>  
</select> 


public interface CrawDao {  
  
    public void saveNewNews(@Param("params")Map<String, String> params);  
      
}
 <insert id="saveNewNews" parameterType="java.util.Map">  
         insert ignore into tb_news   
         <foreach collection="params.keys" item="key" open="(" close=")" separator="," >  
            ${key}  
         </foreach>  
         values   
         <foreach collection="params.keys"  item="key" open="(" close=")" separator=",">  
            #{params[${key}]}  
         </foreach>  
   </insert>  

7.mybatis 的if 比较标签在比较数值时可以这样写:

<if test="value=0">

</if>

8.在比较字符串时可以这么写:

<if test='str!=null and str!="" '>

</if>

9. 比较布尔值

1、

<if test="boolvalue">

//boolvalue=true 时

</if>

2、

<if test="boolvalue==true">

//boolvalue=true 时

</if>









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值