文章目录
  1. 1. 简介
  2. 2. 准备工作
  3. 3. 开始插入
    1. 3.1. insertSelective
    2. 3.2. insert null
  4. 4. 结束
  5. 5. 关注@我 

项目地址:https://github.com/wz2cool/mybatis-dynamic-query
文档地址:https://wz2cool.gitbooks.io/mybatis-dynamic-query-zh-cn/content/

简介

mybatis 一个插入一个更新是最让我头痛的,不是多难而是很烦,每次加一个字段必定这两个地方要改,曾经也看过别人写的一个mybatis-jpa,觉得不错,里面已经封装了一些常用的方法映射。
如果用mybatis常用的插入方法有两个:insert和insertSelective,区别在于insert 每个值都会插入,insertSelective只是插非null的值。这里有个小问题,就是insertSelective粒度太大了,是对于所有的值都是插入非null。这里就可以用@Column 中的 insertIfNull 去对每个列进行控制,当然这个后面降到 @Column 用法再细细描述,这里还是用个简单例子来说明insert的用法。

准备工作

这里我们沿用简单筛选里面的准备工作即可。

开始插入

insertSelective

默认插入就是insertSelective即,null的时候不插入,比如id 是自增列,我们可以不设置值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 @Test
public void testInsertSelective() throws Exception {
Product newProduct = new Product();
newProduct.setCategoryID(1);
String productName = "Product";
newProduct.setProductName(productName);

// insert.
ParamExpression paramExpression = mybatisQueryProvider.getInsertExpression(newProduct);
Map<String, Object> insertParam = new HashMap<>();
insertParam.put("insertExpression", paramExpression.getExpression());
insertParam.putAll(paramExpression.getParamMap());

int result = northwindDao.insert(insertParam);
assertEquals(1, result);
}

输出可以看到,我们只是插入有值的数据,price 为null 所以没有插入
1
2
3
==>  Preparing: INSERT INTO product (product_name, category_id) VALUES (?, ?) 
==> Parameters: Product(String), 1(Integer)
<== Updates: 1

insert null

刚才我们说到默认是null的时候不插入,那么我们无论某个列是否为null都要强制插入应该怎么做呢,这个时候就需要用的 @Column去控制。我们创建一个Product2实体类,唯一和Product不同的是我们强制price为null的时候也插入

1
2
3
4
5
6
7
8
9
10
11
@Table(name = "product")
public class Product2 {
@Column(name = "product_id")
private Integer productID;
private String productName;
@Column(insertIfNull = true)
private BigDecimal price;
private Integer categoryID;

// get/set
}

基本和之前插入测试代码一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public void testInsertNull() throws Exception {
Product2 newProduct = new Product2();
newProduct.setCategoryID(1);
String productName = "Product";
newProduct.setProductName(productName);

// insert.
ParamExpression paramExpression = mybatisQueryProvider.getInsertExpression(newProduct);
Map<String, Object> insertParam = new HashMap<>();
insertParam.put("insertExpression", paramExpression.getExpression());
insertParam.putAll(paramExpression.getParamMap());

int result = northwindDao.insert(insertParam);
assertEquals(1, result);
}

输出我们看到,price是null也被强制放入插入字段中
1
2
3
==>  Preparing: INSERT INTO product (price, product_name, category_id) VALUES (?, ?, ?) 
==> Parameters: null, Product(String), 1(Integer)
<== Updates: 1

结束

因为没有写死所有的属性在XML中,所以以后添加字段,修改字段删除字段都不用再改XML文件,并且用@Column去控制InsertSelective,可以达到更小的粒度控制。

关注@我 

最后大家可以关注我和 Mybatis-Dynamic-query项目 ^_^
Follow @wz2cool Star Fork

文章目录
  1. 1. 简介
  2. 2. 准备工作
  3. 3. 开始插入
    1. 3.1. insertSelective
    2. 3.2. insert null
  4. 4. 结束
  5. 5. 关注@我