项目地址:https://github.com/wz2cool/mybatis-dynamic-query
文档地址:https://wz2cool.gitbooks.io/mybatis-dynamic-query-zh-cn/content/
博客文章:https://wz2cool.github.io/tags/Mybatis-Dynamic-Query/
之前写过一个整合文章可以查考:Mybatis Dynamic Query 框架整合
增加特性
1. jdbcType 支持在insert/update语句
根据官方文档说明:就是当你要去插入修改可空列的时候,必须指定jdbcType,否则可能会报错。(ps:本人用MySql 不指定好像没什么问题,但是既然官方说了咱们也就照办吧。)
The JDBC Type from the list of supported types that follows this table. The JDBC type is only required for nullable columns upon insert, update or delete. This is a JDBC requirement, not an MyBatis one. So even if you were coding JDBC directly, you'd need to specify this type – but only for nullable values.
如何指定这个 jdbcType 其实也很简单,我们其实在 Column 这个注解上加上了这个属性。
@Table(name = "product")
public class Product {
@Column(name = "product_id", insertIgnore = true, jdbcType = JdbcType.INTEGER)
private Integer productID;
@Column(jdbcType = JdbcType.VARCHAR)
private String productName;
@Column(jdbcType = JdbcType.NUMERIC)
private BigDecimal price;
@Column(jdbcType = JdbcType.INTEGER)
private Integer categoryID;
// get /set ...
}
测试调用 insert
@Test
public void testInsert() throws Exception {
Product newProduct = new Product();
Random random = new Random(10000L);
Integer id = random.nextInt();
newProduct.setProductID(id);
newProduct.setCategoryID(1);
String productName = "Product" + id;
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);
}
我debug 打印一下我们生成生成的insert 语句, 看到jdbcType 被加上去了
INSERT INTO product (product_name, category_id) VALUES (#{productName,jdbcType=VARCHAR}, #{categoryID,jdbcType=INTEGER})
2.批量插入
批量插入其实是一个单插入差不多,但是我们需要注意,
- 如果主键是自增的,其实我们不应该在插入的时候插入,这也是为什么 Column 注解里面加了一个 insertIgnore 属性,这个和insertIfNull 不一样,这个是说无论有没有值在插入的时候直接忽略掉,特别适合在自增属性上设置。
- 批量插入 insertIfnull 属性将会失效,因为有些数据的列可能是null,有些数据列可能不是null这个不好区分。
@Test
public void testBulkInsert() throws Exception {
Product p1 = new Product();
p1.setProductName("product1");
p1.setPrice(BigDecimal.valueOf(500));
p1.setCategoryID(2);
Product p2 = new Product();
p2.setProductName("product2");
p2.setPrice(BigDecimal.valueOf(1000));
p2.setCategoryID(2);
Product[] products = new Product[]{p1, p2};
ParamExpression paramExpression = mybatisQueryProvider.getBulkInsertExpression(products);
Map<String, Object> insertParam = new HashMap<>();
insertParam.put("insertExpression", paramExpression.getExpression());
insertParam.putAll(paramExpression.getParamMap());
int result = northwindDao.insert(insertParam);
assertEquals(2, result);
}
输出我们就可以看到两条数据同时插入
==> Preparing: INSERT INTO product (price, product_name, category_id) VALUES (?, ?, ?),(?, ?, ?)
==> Parameters: 500(BigDecimal), product1(String), 2(Integer), 1000(BigDecimal), product2(String), 2(Integer)
<== Updates: 2
3. 表达式获取属性名字
以前在做wpf的时候需要RaisePropertyChange 经常这么写的。 在填写FilterDescriptor 和 SortDescriptor 的时候我们需要指定这个是对哪个属性进行筛选或者排序,现在我们就用一个表达式去代替写死的String,这样写的好处在于以后改起来就非常容易了,不用去找String 了。有兴趣大家可以看一下实现 Mybatis Dynamic Query 属性表达式
@Test
public void simpleDemo() throws Exception {
FilterDescriptor idFilter =
new FilterDescriptor(FilterCondition.AND,
Product.class,
// 这里就是一个表达式,把原来写死的"price" 换掉。
product -> product.getPrice(),
FilterOperator.GREATER_THAN_OR_EQUAL, 2);
Map<String, Object> queryParams =
mybatisQueryProvider.getWhereQueryParamMap(
Product.class, "whereExpression", idFilter);
}
bug
- 主要解决了在sql server 中更新语句报错。
最后
1.0.2 搞完了, 本来想7号发的,没想到赶了赶就提前了哈, 感觉基本功能都有了,大家有什么建议可以提出来放到1.0.3 版本中去了。
关注我
最后大家可以关注我和 Mybatis-Dynamic-query项目 ^_^
Follow @wz2cool Star Fork