MyBatis配置文件Mapper增删改查标准写法(包含jdbcType配置)

本文介绍了一个使用MyBatis实现的用户增删改查操作案例,详细展示了XML映射文件中如何定义SQL语句及参数设置,适用于希望快速上手MyBatis进行数据库操作的开发者。

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.baizhi.dao.UserMapper" >
  <resultMap id="BaseResultMap" type="com.baizhi.entity.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="gender" property="gender" jdbcType="VARCHAR" />
    <result column="age" property="age" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, username, gender, age
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from my_user
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from my_user
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.baizhi.entity.User" >
    insert into my_user (id, username, gender, 
      age)
    values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR}, 
      #{age,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="com.baizhi.entity.User" >
    insert into my_user
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="username != null" >
        username,
      </if>
      <if test="gender != null" >
        gender,
      </if>
      <if test="age != null" >
        age,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=INTEGER},
      </if>
      <if test="username != null" >
        #{username,jdbcType=VARCHAR},
      </if>
      <if test="gender != null" >
        #{gender,jdbcType=VARCHAR},
      </if>
      <if test="age != null" >
        #{age,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.baizhi.entity.User" >
    update my_user
    <set >
      <if test="username != null" >
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="gender != null" >
        gender = #{gender,jdbcType=VARCHAR},
      </if>
      <if test="age != null" >
        age = #{age,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.baizhi.entity.User" >
    update my_user
    set username = #{username,jdbcType=VARCHAR},
      gender = #{gender,jdbcType=VARCHAR},
      age = #{age,jdbcType=INTEGER}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

<think>嗯,用户之前问过关于高斯数据库和MyBatis的SQL优化问题,现在他们想更深入了解MyBatis mapper.xml中的SQL写法以及如何优化条件判断。我需要结合之前的回答和新的引用内容来组织信息。首先,用户提供的引用内容里提到了MyBatis的动态SQL元素,比如select、if、foreach等。我需要整理这些元素,说明支持的写法,比如参数传递、动态条件、循环处理等。然后,针对条件判断的优化,之前用户提到的coverState的例子,可以用三元表达式合并,但要注意引用4中的字符串比较问题,比如单双引号的使用和避免NumberFormatException异常。接下来,我需要分两部分回答:支持的SQL写法和优化条件判断。在支持的写法部分,要列出常见的动态SQL标签,如if、choose、foreach等,并给出示例,如引用5中的foreach处理IN语句。同时,参数传递部分要提到parameterType和@Param注解的使用,如引用2中的例子。优化条件判断时,要强调避免重复判断,使用三元运算符,如之前回答中的例子,但要注意引用4中的字符串比较问题,比如外层用双引号,内部用单引号可能引发异常,建议使用toString()方法。同时,可以提到使用choose-when-otherwise来处理多分支,以及预编译语句提升性能。还要注意引用3中的include标签复用SQL片段,这可能作为优化的一部分。另外,引用1中的parameterType和resultType的使用需要说明,虽然现在可能更常用resultMap,但基础写法还是重要的。 最后,生成的相关问题需要结合MyBatis的动态SQL、参数处理、性能优化等方面,比如动态SQL的标签使用、参数传递方式、防止SQL注入的方法,以及批量操作的优化。</think>### MyBatis mapper.xml支持的SQL写法及优化策略 #### 一、MyBatis支持的SQL写法 1. **基础查询结构** - 支持标准SQL语法(SELECT/INSERT/UPDATE/DELETE) - 通过`parameterType`指定输入参数类型(可省略,MyBatis自动推断)[^1] ```xml <select id="findById" resultType="Blog"> SELECT * FROM blog WHERE id = #{id} </select> ``` 2. **动态条件判断** - 使用`<if>`、`<choose>/<when>/<otherwise>`实现条件分支 ```xml <select id="search" resultType="User"> SELECT * FROM user <where> <if test="name != null"> AND name = #{name} </if> <choose> <when test="role == &#39;admin&#39;"> AND level > 10 </when> <otherwise> AND level <= 10 </otherwise> </choose> </where> </select> ``` 3. **循环处理集合** - 通过`<foreach>`处理IN查询或批量操作[^5] ```xml <insert id="insertBatch"> INSERT INTO ${tableName} <foreach item="col" collection="colNameList" open="(" separator="," close=")"> ${col} </foreach> VALUES <foreach item="obj" collection="objList" separator=","> <foreach item="val" collection="obj.values" open="(" separator="," close=")"> #{val} </foreach> </foreach> </insert> ``` 4. **参数映射与类型处理** - 支持`@Param`注解绑定参数名称[^2] ```java // Java接口声明 List<User> selectByCondition( @Param("minAge") Integer minAge, @Param("maxAge") Integer maxAge ); ``` ```xml <select id="selectByCondition" resultType="User"> SELECT * FROM user WHERE age BETWEEN #{minAge} AND #{maxAge} </select> ``` --- #### 二、条件判断语句优化方法 1. **避免重复判断** - 合并布尔值条件分支(使用三元表达式)[^4] ```xml <!-- 优化前 --> <if test=&#39;coverState == "0"&#39;>AND sc.cover_state = false</if> <if test=&#39;coverState == "1"&#39;>AND sc.cover_state = true</if> <!-- 优化后 --> <if test="coverState != null"> AND sc.cover_state = #{coverState == &#39;1&#39; ? true : false} </if> ``` 2. **统一字符串比较规范** - 外层用双引号,内部用单引号时需添加`.toString()`避免类型转换异常[^4] ```xml <!-- 错误写法 --> <if test=&#39;status == "active"&#39;> <!-- 正确写法 --> <if test=&#39;status != null and status == "active".toString()&#39;> ``` 3. **预编译语句优化** - 使用`<bind>`预定义变量减少重复计算 ```xml <select id="search" resultType="Product"> <bind name="pattern" value="&#39;%&#39; + keyword + &#39;%&#39;"/> SELECT * FROM product WHERE name LIKE #{pattern} </select> ``` 4. **性能敏感场景处理** - 批量插入时优先使用`<foreach>`而非逐条插入 ```xml <insert id="batchInsert"> INSERT INTO orders (id, amount) VALUES <foreach item="order" collection="list" separator=","> (#{order.id}, #{order.amount}) </foreach> </insert> ``` --- ### 扩展建议 1. **SQL片段复用** 通过`<sql>`和`<include>`标签复用公共片段[^3] ```xml <sql id="Base_Column_List"> id, name, create_time </sql> <select id="selectAll" resultType="User"> SELECT <include refid="Base_Column_List"/> FROM user </select> ``` 2. **结果集映射增强** 使用`<resultMap>`处理复杂字段映射 ```xml <resultMap id="UserResultMap" type="User"> <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/> </resultMap> ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值