mybatis 配置文件mysql的常用语句写法总结

本文汇总了MyBatis配置文件中针对MySQL数据库的添加、删除、更新、查询等常见SQL语句写法,包括批量操作、条件判断、模糊查询和子查询等应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                    mybatis 配置文件mysql常用语句写法总结
1.添加语句
   <insert id="insert" parameterType="com.baidu.bean.AppAccountBean">
  insert into 表名
    (account,pass,operate,create_date,remark)
  values(
    #{account,jdbcType=VARCHAR},
    #{password,jdbcType=VARCHAR},
    #{operater,jdbcType=VARCHAR},
    now(),
    #{remarks,jdbcType=VARCHAR}
    )
 </insert>
2.批量添加语句
<insert id="insert" parameterType="java.util.List">
     insert into  表名(
             delete_power,
             create_date,
             update_date,
             remarks,
             permission_group_code
             )
           values
     <foreach  collection="list" item="item" index="index" separator =",">
  (
  #{item.deletePower},
  (select now() as createDate from dual),
  (select now() as updateDate from dual),
  #{item.remarks},
  #{item.permissionGroupCode}
  
  )
  </foreach>
 </insert>
3.删除语句
<delete id="delete" parameterType="String">
   delete  from 表名 where cs_admin_name = #{adminName}
 </delete>
4.批量删除语句
<delete id="delete" parameterType="java.util.List">
    delete from
          表名
    where
           cs_admin_name
           in
           <foreach open="(" close=")" collection="list" item="item" index="index" separator=",">
           #{item.adminName}
           </foreach>
 </delete>
5.修改语句
 <update id="update" parameterType="com.baidu.pojo.HttpProjectPojo" > 
        UPDATE
         表名
        SET
         <if test="state !=null and state !=''">
               STATE = #{state} ,
           </if>
           <if test="isPaid !=null and isPaid !=''">
               IS_PAID = #{isPaid} ,
           </if>
         UPDATE_DATE = sysdate()
        WHERE
         1=1
         <if test="proNumber !=null and proNumber !=''">
            AND PRO_NUMBER = #{proNumber} 
         </if>
    </update>
6.批量修改语句
 <update id="Update" parameterType="java.util.List" > 
        <foreach collection="list" item="item" index="index" separator=";"> 
         update
          表名
         set
          <![CDATA[material_num = material_num + #{item.materielNum} , ]]>
          update_date = now()
         where
          pro_number = #{item.proNumber} 
          and
          material_code = #{item.materielCode} 
        </foreach> 
    </update>
7.查询语句
<select id="select" parameterType="java.util.Map" resultType="com.baidu.pojo.MaterialOrderPojo">
           select
             mo.id,
             date_format(mo.create_date,'%Y-%m-%d %H:%i:%s') as createDate,
                date_format(mo.update_date,'%Y-%m-%d %H:%i:%s') as updateDate,  
    mo.remark as remarks,     
    mo.state as state
     from
         表名 mo
     where
       date_format(trunc(mo.create_date),'%Y-%m-%d') = date_format(trunc(now()),'%Y-%m-%d')
     </select>
8.查询表里面的下一个自增的id
 <select id="selectNextId" resultType="java.lang.Integer">
  select AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_NAME = '表名';
 </select>
9.in子查询语句
<select id="select" parameterType="java.util.Map" resultType="com.baidu.pojo.PackageDetailedPojo">
    select
      d.id as id,
    b.id as packageId,
    b.package_no as packageNo,
    d.material_num  as materialNum
  from
   表1 d
  left join
   表2 b
  on
   b.package_no=d.package_no
  left join
         表3 mp
  on
   mp.material_code = d.material_code
  where
   d.state = '1'
  <if test="packageId != null and packageId != ''">
  and  b.id in
   <foreach item="item" index="index" collection="packageId" open="(" separator="," close=")"> 
      #{item,jdbcType=INTEGER} 
    </foreach>
  </if>
 </select>
10.嵌套查询(一对多关联查询)
<select id="select" parameterType="java.util.Map" resultMap="materialOrderMap">
  select  a.*,
   oa.card_no as orderCardNo,
   oa.integral_type as integralType,
   pa.city_code as cityCode,
            pr.name as provinceName
   from (
            select mo.id,
                      mo.package_info as packageInfo,
                      date_format(mo.create_date, '%Y-%m-%d %H:%i:%s') as createDate,
                      date_format(mo.update_date, '%Y-%m-%d %H:%i:%s') as updateDate,
                      mo.state as state
                  from
                   表1 mo
                  where 1 = 1
                   and mo.state = '1'
                       <if test="createTime != null and createTime != '' ">
           <![CDATA[  and  date_format(mo.create_date,'%Y-%m-%d') >= #{createTime} ]]>
           </if>
           <if test="endTime != null and endTime != '' ">
           <![CDATA[  and  date_format(mo.create_date,'%Y-%m-%d') <= #{endTime} ]]>
           </if>
        ) a
    left join
     表2 oa
             on
              a.orderno = oa.order_no
             left join
    表3 pa
    on
    a.orderno = pa.order_no
    left join
     表4 ci
    on ci.city_code=pa.city_code
    left join
    表5 pr
    on pr.code=ci.province_code
             order by
                a.createdate desc
     </select>
 
  <resultMap type="com.baidu.pojo.MaterialOrderPojo" id="materialOrderMap">
  <id property="id" column="id"/>
  <result property="packageInfo" column="package_info"/>
  <result property="state" column="state"/>
  <result property="createDate" column="create_date"/>
  <result property="updateDate" column="update_date"/>
  <result property="cityCode" column="city_code"/>
  <collection property="orderCardInfo" ofType="com.baidu.pojo.OrderCardPojo">
   <result property="orderCardNo" column="oa.card_no"/>  
   <result property="orderIntegral" column="oa.integral"/>  
  </collection>
 </resultMap>
11. 模糊查询
<select id="select" parameterType="java.util.Map" resultMap="com.baidu.pojo.PackageDetailedPojo">
     select * from 表名 v  where  v.FCUSTOMERNAME like CONCAT(CONCAT('%', #{fcustomername}), '%') 
 </select>
12.if + where 的条件判断
 <select id="select" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.STUDENT_NAME,    
           ST.PLACE_ID  
      FROM 表名 ST   
    <where>  
        <if test="studentName !=null ">  
            ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')  
        </if>   
    </where>    
  </select>  
13.if + set 的更新语句
<update id="update" parameterType="liming.student.manager.data.model.StudentEntity">  
    UPDATE 表名  
    <set>  
        <if test="studentName != null and studentName != '' ">  
            STUDENT_TBL.STUDENT_NAME = #{studentName},  
        </if>  
        <if test="studentSex != null and studentSex != '' ">  
            STUDENT_TBL.STUDENT_SEX = #{studentSex},  
        </if>    
    </set>  
    WHERE STUDENT_TBL.STUDENT_ID = #{studentId};      
  </update> 
14.if+   trim代替where
<select id="select" resultMap="resultMap_studentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.STUDENT_NAME,  
           ST.PLACE_ID  
      FROM 表名 ST   
    <trim prefix="WHERE" prefixOverrides="AND|OR">   
        <if test="studentBirthday != null ">  
            AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}  
        </if>   
    </trim>     
  </select> 
15.if +   trim代替set
 <update id="update" parameterType="liming.student.manager.data.model.StudentEntity">  
    UPDATE 表名 
    <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> 
16.choose (when, otherwise)
<select id="getStudentList_choose" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.STUDENT_NAME,   
           ST.PLACE_ID  
      FROM 表名 ST   
    <where>  
        <choose>  
            <when test="studentSex != null and studentSex != '' ">  
                AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}  
            </when >  
            <otherwise>  
            </otherwise>  
        </choose>  
    </where>    
</select>  
17.foreach 参数为array示例的写法
<select id="getStudentListByClassIds_foreach_array" resultMap="resultMap_studentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.PLACE_ID  
      FROM 表名 ST  
      WHERE ST.CLASS_ID IN   
     <foreach collection="array" item="classIds"  open="(" separator="," close=")">  
        #{classIds}  
     </foreach>  
</select>  
18.foreach 参数为list示例的写法
<select id="getStudentListByClassIds_foreach_list" resultMap="resultMap_studentEntity">  
    SELECT ST.STUDENT_ID,    
           ST.PLACE_ID  
      FROM 表名 ST  
      WHERE ST.CLASS_ID IN   
     <foreach collection="list" item="classIdList"  open="(" separator="," close=")">  
        #{classIdList}  
     </foreach>  
</select>  
 
最后PS:
   1)<![CDATA[   ]]>是XML语法。在CDATA内部的所有内容都会被解析器忽略。如果文本包含了很多的"<"字符 <=和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。
   2)Mysql中获取当前时间(年月日 时分秒)有NOW()、SYSDATE()。   获取当前的日期(年月日) CURDATE()。   获取当前的时间(时分秒)CURTIME()。

 
 
     
<think>嗯,用户想了解如何在MyBatis的XML文件中正确使用MySQL的LIKE查询语句。首先,我需要回忆一下MyBatis中使用LIKE查询的常见方法。记得在SQL中,LIKE通常和通配符%一起使用,比如LIKE '%keyword%'。但在MyBatis的XML映射文件中,直接拼接字符串可能会遇到问题,比如SQL注入或者参数替换的问题。 然后,用户提到的是MySQL,所以需要确保语法适用于MySQLMyBatis中处理LIKE查询有几种方式。最常见的是在XML中使用concat函数来拼接%和参数值。例如,写成LIKE CONCAT('%', #{keyword}, '%')。这样可以避免直接在Java代码中添加通配符,保持XML的清晰。 另外,可能还需要考虑参数的处理。用户是否需要在传入参数时自己加上%?比如在Java代码中把keyword变成"%keyword%",然后在XML中直接使用LIKE #{keyword}。不过这种方法可能会让代码更耦合,不够灵活,尤其是如果需要不同的通配符位置(比如前缀或后缀)时。 还有使用bind标签的方法,这在动态SQL中很有用。通过<bind>标签提前定义变量,可以在后续的SQL语句中直接引用,使得SQL更简洁,尤其是当有多个LIKE条件的时候。 安全方面需要注意,虽然MyBatis的#{}可以防止SQL注入,但如果在拼接时使用了${},可能会有风险。因此,必须确保用户使用的是#{}而不是${}来传递参数。 然后,用户可能需要示例代码。我应该提供一个简单的XML配置示例,比如在<select>标签中使用concat函数,以及展示Java接口中的方法定义。同时,给出不同通配符位置的例子,比如左侧、右侧或两侧都有%。 可能还需要提到动态SQL的情况,比如结合if标签使用LIKE查询,这样用户可以根据条件动态添加查询条件。这时候bind标签会很有帮助,因为它允许在动态条件中重复使用变量。 另外,参考用户提供的引用内容,特别是引用[1]和[2],提到MyBatis的XML配置用于复杂SQL,所以正确使用LIKE查询属于复杂SQL的一部分,应该用XML来处理。而MyBatis-Flex虽然增强了MyBatis,但这里用户的问题集中在原生MyBatis的使用上,所以不需要涉及Flex的内容。 最后,确保回答结构清晰,分步骤说明,并给出示例代码。可能还需要提醒用户注意通配符的位置,以及参数传递的正确方式,避免常见错误。同时,生成相关问题,帮助用户进一步学习,比如动态SQL中的LIKE使用,或者防止SQL注入的问题。</think>在 MyBatis 的 XML 文件中使用 MySQL 的 LIKE 查询语句时,需要注意参数拼接和 SQL 注入防护。以下是具体实现方法和示例: ### 一、正确使用方式 1. **基础语法结构** 使用 `CONCAT()` 函数拼接通配符 `%` 和参数值,这是最安全的做法: ```xml <select id="searchUsers" resultType="User"> SELECT * FROM users WHERE name LIKE CONCAT('%', #{keyword}, '%') </select> ``` 2. **动态 SQL 场景** 结合 `<if>` 标签实现条件筛选时,推荐使用 `<bind>` 预处理参数: ```xml <select id="dynamicSearch" resultType="User"> <bind name="pattern" value="'%' + keyword + '%'" /> SELECT * FROM users WHERE 1=1 <if test="keyword != null"> AND (name LIKE #{pattern} OR email LIKE #{pattern}) </if> </select> ``` ### 二、不同通配符位置示例 | 匹配类型 | XML 实现 | 等效 SQL | |------------------|---------------------------------------|-----------------------| | 包含关键字 | `CONCAT('%', #{k}, '%')` | `LIKE '%java%'` | | 以关键字开头 | `CONCAT(#{k}, '%')` | `LIKE 'java%'` | | 以关键字结尾 | `CONCAT('%', #{k})` | `LIKE '%java'` | | 特定位置匹配 | `CONCAT('_', #{k}, '%')` | `LIKE '_java%'` | ### 三、Java 接口定义示例 ```java public interface UserMapper { List<User> searchUsers(@Param("keyword") String keyword); List<User> dynamicSearch(@Param("keyword") String keyword); } ``` ### 四、注意事项 1. **禁止直接拼接** 错误示例:`LIKE '%${keyword}%'`(存在 SQL 注入风险)[^1] 2. **空值处理** 建议在 Java 服务层对参数进行 `StringUtils.isNotBlank()` 校验 3. **性能优化** 当数据量较大时,LIKE 查询应配合数据库索引使用,注意前导通配符会导致索引失效 [^1]: 引用自 MyBatis 官方文档关于 SQL 注入防护的说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值