mybatis 数据库语句 标签

一 . 更新,插入 返回 主键

这个其实是有好几种问题的,先把网上那种先 生成key,再返回的到实体类中的
使用数据库自定义函数nextval(‘student’) ,生成一个key,并把他设置到传入的实体类中的studentId属性上。在执行完此方法后,把该 key 赋值给 studentId属性

    <insert id="createStudent" parameterType="data.model.StudentEntity" keyProperty="studentId">  
        <selectKey keyProperty="studentId" resultType="String" order="BEFORE">  
            select nextval('student') 
        </selectKey>  
        INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_SEX,  STUDENT_PHOTO)  
        VALUES (#{studentId}, #{studentSex}, 
                #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler}) 
    </insert> 

再是一种 ID 是自增长的
这里参数我传入的是 map
设置 useGeneratedKeys=”true” 自增长
keyProperty=”ID” 这个ID 实际就是指的数据库自增长的那个字段,在insert完成后会默认填充给他,执行完成后 在map里面取到对应的key获取value就可以了

 <insert id="insertTaxiOrder" parameterType="map" useGeneratedKeys="true" keyProperty="ID" > 

      INSERT INTO  tb_TaxiOrderInfo ( UserID, DriverID, StartAddress) 
      VALUES  (#{userID}, 0, #{StartAdd}})
    </insert>

属性 描述 取值
1.keyProperty selectKey 语句生成结果需要设置的属性。

2.resultType 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int, map类型。

3.order
3.1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert语句;
3.2:AFTER,就先运行insert 语句再运行selectKey 语句。

4.statementType MyBatis 支持STATEMENT,PREPARED和CALLABLE 的语句形式, 对应Statement ,PreparedStatement 和CallableStatement 响应

二 . if 的用法

2.1这个我传入的参数是 map形式的,在mapper中的sql语句中可以用 if进行判断 参数值是否为null,才会看是否执行if中的代码块,数字也是可以的

    <select id="registerCYUser" parameterType="map"  resultType="map">
        SELECT    WorkStaffID, ISNULL(PWD,'') AS PWD, WorkType
        from tb_WorkStaff
        WHERE 

        WorkType = #{WorkType} 
        <if  test="CarNum != null">  
           AND
        CarNum = #{CarNum}
       <if  test="CarNum == null">  
           AND
        CarNum = #{CarNum}
        </if>
    </select>

2.2 如果参数传入的是实体类,也可以这样判断

网上的就下面这样拿过来,在if中进行判断

<select id="StudentLis" resultMap="studentResult" parameterType="model.StudentEntity">  
    SELECT ST.STUDENT_ID, ST.STUDENT_NAME,  
    FROM STUDENT_TBL ST   
     WHERE  
    <if test="studentSex != null and studentSex != '' ">  
        AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER} 
    </if>  
    <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">  
        AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR} 
    </if>  
</select>

2.3 if 和 set 使用组合 更新 update

    <update id="updateZSInfo" parameterType="map">
        UPDATE tb_OrdinaryUser 
          <set>
             <if test="UserName != null">
               UserName = #{UserName},
             </if>
             <if test="Phone != null">
               Phone = #{Phone},
             </if>
             <if test="Email != null">
               Email = #{Email},
             </if>
           </set> 
        WHERE userID = #{UserId} 
    </update>

三 . trim 关键字的使用

3.1 trim 替代 where

    <select id="if_trim" resultMap="studentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.STUDENT_NAME,  
         FROM STUDENT_TBL ST   
       <trim prefix="WHERE" prefixOverrides="AND|OR">  
        <if test="studentName !=null ">  
            ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%') 
        </if>  
        <if test="studentSex != null and studentSex != '' ">  
            AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER} 
        </if>  
        <if test="studentBirthday != null ">  
            AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE} 
        </if>  
       </trim>     
    </select>  

3.2 trim代替 set

  <update id="update_trim" parameterType="StudentEntity">  
    UPDATE STUDENT_TBL  
        <trim prefix="SET" suffixOverrides=",">  
            <if test="studentName != null and studentName != '' ">  
                STUDENT_TBL.STUDENT_NAME = #{studentName},  
            </if>  
            <if test="studentSex != null and studentSex != '' ">  
                STUDENT_TBL.STUDENT_SEX = #{studentSex},  
            </if>  
        </trim>  
    WHERE STUDENT_TBL.STUDENT_ID = #{studentId}  
  </update>  

四 . choose

4.1 choose 是集合 when 和 otherwise 使用的

<!-- 6 choose(判断参数) - 按顺序 将判断成功进入第一个进入 when执行的语句 作为where条件 如果when 都没有进入 ,就会进入 otherwise 中执行-->  
<select id="choose" resultMap="studentEntity" parameterType="StudentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.STUDENT_NAME,  
      FROM STUDENT_TBL ST   
    <where>  
        <choose>  
            <when test="studentName !=null ">  
                ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')  
            </when >  
            <when test="studentBirthday != null ">  
                AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}  
            </when >  
            <otherwise>  


            </otherwise>  
        </choose>  
    </where>    
</select>  

五 . foreach

这个比自己在外部for循环执行,效率会快很多。

foreach一共有三种类型,分别为List,,Map三种

item :
循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。
具体说明:在list和数组中是其中的对象,在map中是value。
该参数为必选。

collection:
要做foreach的对象,作为入参时,
1.List 对象默认用list代替作为键
2. 数组对象有array代替作为键
3. Map对象有map默认的键。

当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。
举个例子:
1.如果User有属性List ids。入参是User对象,那么这个collection = “ids”
2.如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id”上面只是举例,具体collection等于什么,就看你想对那个元素做循环。该参数为必选。

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

4.close: foreach代码的关闭符号,一般是)和open=”(“合用。常用在in(),values()时。该参数可选。

5.index: 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

5.1 传入 数组
实质就是循环 aa 实体类中的 list,中的一个list

  <select id="foreach_array" resultMap="bb" parameterType="aa">  
    SELECT xx._ID,  
           xx._NAME,  

      FROM XXXX xx
      WHERE xx._ID 

      IN   
     <foreach collection="array" item="classId"  open="(" separator="," close=")">  
        #{classId} 
     </foreach>  
  </select>

5.2 配合 in 使用 参数传入一个list

<select id="countByUserList" resultType="_int" parameterType="list">  
select count(*) from users  
  <where>  
    id in  
    <foreach item="item" collection="list" separator="," open="(" close=")" index="">  
      #{item.id, jdbcType=NUMERIC} 
    </foreach>  
  </where>  
</select>  

5.3 批量插入
方式1

     insert into aa ( depart1, depart2 ) values
      <foreach collection="list" item="item" index="index"
      separator=",">
      ( #{item.depart1}, #{item.depart2} )
      </foreach>

方式2

    insert into table(aa,bb) <foreach collection="list" item="item" index="index" separator="union all"> select #{item.hkgs,aa=VARCHAR}, #{item.bb,jdbcType=VARCHAR}, } from dual </foreach> 

5.4 批量删除

  <delete id="dd" parameterType="list">
        DELETE FROM LD_USER WHERE ID in 
        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
        </foreach>
  </delete>

5.5 批量修改

      <update id="update" parameterType="list">
          update table set age = '0' where no in
          <foreach collection="list" item="nos" open="(" separator="," close=")">
           #{nos}
         </foreach>
         </update>

5.6 批量条件查询

<select id="sel" resultType="int">  
        select count(*) from aa  where  
        <foreach item="item" index="key" collection="map"  
            open="" separator="AND" close="">
            ${key} = #{item}</foreach> 
    </select> 

$ {} 是原样输出, #{} 是取值

你可能感兴趣的:(mybatis 数据库语句 标签)