我是靠谱客的博主 超帅学姐,最近开发中收集的这篇文章主要介绍Spring mvc集成Mybatis,选择性保存对象字段数据前言准备总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

我们平时使用mybatis保存对象数据时,经常可能只是修改其中某一俩个字段的值,这个时候,我们为了减少数据库更新带来的性能、行锁等不必要的消耗,可能会重新写一个接口,只负责修改需要修改的值。

但是,随着业务系统的变更,业务字段的增加,越来越多的字段需要根据不同的业务场景和业务操作,需要更改的字段越来越多,相应的接口也越来越多,甚至有些方法都不再使用,删也不敢删,留着又影响代码阅读。

所以,如果有一个方法,可以做到“[只对我设置值的字段才进行修改][6]”,那该多好。

很庆幸,mybatis为我们提供了xml格式的条件判断语句,我们只需要验证 field != null 即可。

但是也很不幸,这里面有些坑,比如:int类型值、char类型、double类型,这些类型是有默认值的,并且不会等于null。

那么基于这个问题,下面是我对这件事做的实验。

准备

研究字段类型

本次实验仅研究了常见的10种数据类型,下面是数据库类型与Java类型的对比
JDBC Type ———- Java Type
CHAR —————-> String
VARCHAR ———> String
INTEGER ———–> int
TINYINT ————–> byte
DOUBLE ————> double
DATE —————–> java.sql.Date
TIMESTAMP ——–> java.sql.Timestamp
NUMERIC ———–> java.math.BigDecimal
DECIMAL ————> java.math.BigDecimal
BOOLEAN ———-> boolean

创建数据库表

为了实验,本次采用了mysql数据库作为实验对象,数据表对应的研究字段类型与java字段类型对应如下。

对应关系如下,Java类UserPO
Field——-Type—————-Java-Type–Field
id———-int(11)————private-int-id;
userid——char(32)———–private-char-userid;
activityid–char(32)———–private-Character-activityid;
openid——char(27)———–private-String-openid;
user_name—varchar(50)——–private-String-user_name;
age———int(11)————private-int-age;
xueli——-int(11)————private-Integer-xueli;
score——-double(11,2)——-private-double-score;
points——double(11,2)——-private-Double-points;
sex———tinyint(1)———private-short-sex;
status——tinyint(1)———private-Short-status;
birthday—-date—————private-Date-birthday;
createtime–datetime———–private-Date-createtime;
amount——decimal(11,2)——private-BigDecimal-amount;
price——-decimal(11,2)——private-Double-price;
disabled—-tinyint(1)———private-Boolean-disabled;
deleted—–tinyint(1)———private-Boolean-deleted;

用户对象

public class UserPO {
private int id;
private char userid;
private Character activityid;
private String openid;
private String user_name;
private int age;
private Integer xueli;
private double score;
private Double points;
private short sex;
private Short status;
private Date birthday;
private Date createtime;
private BigDecimal amount;
private Double price;
private Boolean disabled;
private Boolean deleted;
}

UserMapper对象

@Mapper
public interface UserMapper {
int insertSelective(UserPO po);
}

UserMapper.xml

<mapper namespace="com.ansitech.study.web.mapper.UserMapper">
<insert id="insertSelective">
insert into t_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userid != null">userid,</if>
<if test="activityid != null">activityid,</if>
<if test="openid != null">openid,</if>
<if test="user_name != null">user_name,</if>
<if test="age != null">age,</if>
<if test="xueli != null">xueli,</if>
<if test="score != null">score,</if>
<if test="points != null">points,</if>
<if test="sex != null">sex,</if>
<if test="status != null">status,</if>
<if test="birthday != null">birthday,</if>
<if test="createtime != null">createtime,</if>
<if test="amount != null">amount,</if>
<if test="price != null">price,</if>
<if test="disabled != null">disabled,</if>
<if test="deleted != null">deleted,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userid != null">#{userid,jdbcType=CHAR},</if>
<if test="activityid != null">#{activityid,jdbcType=CHAR},</if>
<if test="openid != null">#{openid,jdbcType=CHAR},</if>
<if test="user_name != null">#{user_name,jdbcType=VARCHAR},</if>
<if test="age != null">#{age,jdbcType=INTEGER},</if>
<if test="xueli != null">#{xueli,jdbcType=INTEGER},</if>
<if test="score != null">#{score,jdbcType=DOUBLE},</if>
<if test="points != null">#{points,jdbcType=DOUBLE},</if>
<if test="sex != null">#{sex,jdbcType=TINYINT},</if>
<if test="status != null">#{status,jdbcType=TINYINT},</if>
<if test="birthday != null">#{birthday,jdbcType=DATE},</if>
<if test="createtime != null">#{createtime,jdbcType=TIMESTAMP},</if>
<if test="amount != null">#{amount,jdbcType=NUMERIC},</if>
<if test="price != null">#{price,jdbcType=DECIMAL},</if>
<if test="disabled != null">#{disabled,jdbcType=BOOLEAN},</if>
<if test="deleted != null">#{deleted,jdbcType=BOOLEAN},</if>
</trim>
</insert>
</mapper>

说明
大家应该也看到了,为了测试,我给每种研究类型建了2个字段,对应Java类型的简单类型和对象类型。

下面给大家看下调用代码:

UserPO po = new UserPO();
userMapper.insertSelective(po);

对,你没看错,我就是直接插入的,没有设置任何值。

那么结果如何?

首先,程序的打印SQL日志

==> Preparing: insert into t_user ( userid , age , score , sex ) values ( ?, ?, ?, ? )
==> Parameters: (String), 0(Integer), 0.0(Double), 0(Short)

结果很明显,所有简单类型判断!=null都是无效的。

再看数据库表数据
这里写图片描述
果然,数据已经有值了,这绝对不是数据表字段的默认值,见下图。
这里写图片描述

总结

如果想选择性插入或更新数据,请把对象中的简单字段类型改为对象类型。

最后

以上就是超帅学姐为你收集整理的Spring mvc集成Mybatis,选择性保存对象字段数据前言准备总结的全部内容,希望文章能够帮你解决Spring mvc集成Mybatis,选择性保存对象字段数据前言准备总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部