mybatis 新增判断空

本文详细介绍了MyBatis中使用动态SQL进行新增操作的方法,包括如何使用`<trim>`标签来处理参数的可选性,以及如何利用`useGeneratedKeys`和`keyProperty`属性来获取自增ID。


mybatis 动态新增

<insert id="insertSelective" parameterType="com.yimayhd.snscenter.client.domain.ComentDO" useGeneratedKeys="true" keyProperty="id" >

    insert into com_coment
    <trim prefix="(" suffix=")" suffixOverrides="," >
      domain,
      status,
      <if test="gmtCreated != null" >
        gmt_created,
      </if>
      <if test="gmtModified != null" >
        gmt_modified,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      #{domain,jdbcType=INTEGER},
      #{status,jdbcType=INTEGER},
      <if test="gmtCreated != null" >
        #{gmtCreated,jdbcType=TIMESTAMP},
      </if>
      <if test="gmtModified != null" >
        #{gmtModified,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>
### 关于 MyBatis 批量插入时判断字段非的解决方案 在处理批量插入操作时,确保数据的有效性和完整性至关重要。对于 MyBatis 中实现这一功能的方法有多种。 #### 使用 SQL 片段和动态 SQL 实现字段非校验 为了确保只有当字段不为时才将其包含到 `INSERT` 语句中,可以利用 MyBatis 的 `<if>` 标签来构建条件逻辑[^1]: ```xml <insert id="batchInsertUsers"> INSERT INTO users ( <trim suffixOverrides=","> <if test="record.name != null">name,</if> <if test="record.age != null">age,</if> <!-- 更多字段 --> </trim> ) VALUES ( <foreach collection="list" item="record" separator=","> (<trim suffixOverrides=","> <if test="record.name != null">#{record.name},</if> <if test="record.age != null">#{record.age},</if> <!-- 对应更多字段 --> </trim>) </foreach> ) </insert> ``` 上述代码展示了如何通过遍历集合并针对每条记录应用相同的字段存在性检查机制,在实际执行前过滤掉任何可能存在的值项。 #### 利用 Java 层面预处理数据集 另一种方法是在调用 Mapper 方法之前先对要插入的数据列表做一轮筛选或转换工作,移除那些不符合预期标准的对象实例后再传递给持久层组件进行保存动作[^2]: ```java public void batchSave(List<User> userList){ List<User> filteredList = new ArrayList<>(); for (User user : userList) { if(user.getName() != null && !user.getName().isEmpty() && user.getAge() > 0){ // 添加其他必要验证 filteredList.add(user); } } userMapper.batchInsert(filteredList); } ``` 这种方法的好处是可以更灵活地控制业务规则,并且可以在不影响数据库表结构的前提下轻松调整验证策略。 #### 结合注解方式简化配置 如果项目允许混合使用 XML 和注解形式定义映射关系,则还可以考虑采用后者以减少冗余配置带来的维护成本。例如,可以通过自定义拦截器或者 AOP 来增强现有 API 功能而不必修改原有代码库太多地方[^3]。 ```java @SelectProvider(type=SqlBuilder.class, method="buildBatchInsertSql") void batchInsert(@Param("records") Collection<T> records); // SqlBuilder.java class SqlBuilder{ static String buildBatchInsertSql(Map<String,Object> params){ StringBuilder sql = new StringBuilder(); @SuppressWarnings("unchecked") Collection<T> records = (Collection<T>)params.get("records"); Iterator<T> iterator = records.iterator(); while(iterator.hasNext()){ T record = iterator.next(); // 构建SQL片段... } return sql.toString(); } } ``` 以上三种方案各有优劣之处,具体选择取决于应用场景和个人偏好等因素影响下的综合考量结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值