项目地址: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.批量插入

批量插入其实是一个单插入差不多,但是我们需要注意,

  1. 如果主键是自增的,其实我们不应该在插入的时候插入,这也是为什么 Column 注解里面加了一个 insertIgnore 属性,这个和insertIfNull 不一样,这个是说无论有没有值在插入的时候直接忽略掉,特别适合在自增属性上设置。
  2. 批量插入 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

  1. 主要解决了在sql server 中更新语句报错。

最后

1.0.2 搞完了, 本来想7号发的,没想到赶了赶就提前了哈, 感觉基本功能都有了,大家有什么建议可以提出来放到1.0.3 版本中去了。

关注我 ##

最后大家可以关注我和 Mybatis-Dynamic-query项目 _

Follow @wz2cool Star Fork

Mybatis Dynamic Query 1.0.2版本的更多相关文章

  1. Mybatis Dynamic Query 2.0.2

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

  2. Mybatis Dynamic Query 2.0 入门

    简介 2.0 昨天打包好了,主要是整合了tk.mybatis.mapper 到项目中去,所以和1.x比起来主要多了一个通用mapper.因为作者主要是使用springboot 这里讲一下Springb ...

  3. Mybatis Dynamic Query 框架整合

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

  4. SpringMVC+MyBatis+Druid使用MySQL8.0.11版本

    1.使用MySQL8.0.11版本,要使用5.1.45或其他高版本驱动jar包,我本地使用的是最新的8.0.11 2.更换了MySQL驱动后,报Cannot find class [com.aliba ...

  5. Mybatis Dynamic Query 简单筛选

    在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...

  6. Mybatis Dynamic Query 更新

    文章目录 1. 简介 2. 准备工作 3. 开始更新 3.1. update 3.2. update Null 4. 结束 5. 关注@我 项目地址:https://github.com/wz2coo ...

  7. Sharding-JDBC(二)2.0.3版本实践

    目录 一.Sharding-JDBC依赖 二.分片策略 1. 标准分片策略 2. 复合分片策略 3. Inline表达式分片策略 4. 通过Hint而非SQL解析的方式分片的策略 5. 不分片的策略 ...

  8. eclipse- Web-app verson=2.5 调整将Dynamic Web Module3.0降为2.5

    如果提示cannot change version of project facet Dynamic Web Module to 2.5 1.把Dynamic Web Module复选框,勾选去掉,点 ...

  9. [Liferay6.2]Liferay Dynamic Query API示例

    介绍 Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据. 通常情况下,在每个service Entity中,通过定义一些'finder'方法,可以便捷地满足基本的数据查询操作. 但是, ...

随机推荐

  1. WCF入门, 到创建一个简单的WCF应用程序

    什么是WCF?  WCF, 英文全称(windows Communication Foundation) , 即为windows通讯平台. windows想到这里大家都知道了 , WCF也正是由微软公 ...

  2. 使用websocket-sharp来创建c#版本的websocket服务

    当前有一个需求,需要网页端调用扫描仪,javascript不具备调用能力,因此需要在机器上提供一个ws服务给前端网页调用扫描仪.而扫描仪有一个c#版本的API,因此需要寻找一个c#的websocket ...

  3. 使用UDP完成网络通信

    语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用UDP来 传输数据提高效率. 因为UDP本身不可靠传输的特性,为了保证玩家可靠的接入服务器和一些 操作的正确执行,还是需要一些额外的代码保证U ...

  4. 遇到ANDROID “call to opengl es api with no current context”错误

    延迟线程执行 Timer timer=new Timer();//实例化Timer类 timer.schedule(new TimerTask(){ public void run(){ buyed( ...

  5. Binder的工作原理浅析

    在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...

  6. JS实现全选、不选、反选

    思路:1.获取元素.2.用for循环历遍数组,把checkbox的checked设置为true即实现全选,把checkbox的checked设置为false即实现不选.3.通过if判断,如果check ...

  7. Web自动化之Headless Chrome概览

    Web自动化 这里所说的Web自动化是所有跟页面相关的自动化,比如页面爬取,数据抓取,页面内容检测,页面功能测试,页面加载性能测试,页面回归测试等等,当前主要由如下几种解决方式: 文本数据获取 这就是 ...

  8. ReactiveCocoa源码解析(五) SignalProtocol的observe()、Map、Filter延展实现

    上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...

  9. java equals和==区别及string类的说明

    一.equals和==的区别 1.1.equals之string字符串的比较 1.1.1.源码如下图 if (this == anObject) {            return true;  ...

  10. Django 学习笔记(二)

    Django 第一个 Hello World 项目 经过上一篇的安装,我们已经拥有了Django 框架 1.选择项目默认存放的地址 默认地址是C:\Users\Lee,也就是进入cmd控制台的地址,创 ...