# 开发技巧

# 获取主数据源的SqlSessionFactory

SqlSessionFactory sqlSessionFactory = MybatisUtil.getSqlSessionFactory();

# 多数据源下获取SqlSessionFactory

SqlSessionFactory sqlSessionFactory = MybatisUtil.getSqlSessionFactory(“xx”); // 指定数据源别名

# 获取Mapper对应的SqlSessionFactory

SqlSessionFactory sqlSessionFactory = MybatisUtil.getSqlSessionFactory(UserMapper.class);

# 手动开启事务

    /**
     * 手动处理事务
     *
     * @param tUser
     * @return
     */
    public int updateUser2(TUser tUser) {
        return MybatisUtil.doTransaction(transactionStatus -> {
            int update = this.update(tUser);
            int i = 1 / 0; // 报错回滚事务
            return update;
        });
    }

# 重写Query中的方法

有时候我们要重写Query中的方法,比如下面这个例子

    @Override
    public LambdaQuery<T> in(Getter<T, ?> getter, Collection<?> value) {
        // 去重
        Set<Object> uniqueValues = new HashSet<>(value);
        return super.in(getter, uniqueValues);
    }

Query新增了两个函数Query.setQueryBuilderQuery.setLambdaQueryBuilder方便我们扩展Query和LambdaQuery

下面是一个扩展LambdaQuery的例子,实现了两个功能:

  • 当使用in查询时去重
  • 使用eq查询兼容更多的数据类型
public class MyQuery<T> extends LambdaQuery<T> {

  public MyQuery(Class<T> entityClass) {
    super(entityClass);
  }


  @Override
  public LambdaQuery<T> in(Getter<T, ?> getter, Collection<?> value) {
    // 去重
    Set<Object> uniqueValues = new HashSet<>(value);
    return super.in(getter, uniqueValues);
  }

  @Override
  public LambdaQuery<T> eq(Getter<T, ?> getter, Object value) {
    // 兼容Collection
    if (value instanceof Collection) {
      return this.in(getter, (Collection<?>) value);
    }
    // 兼容布尔
    if (Objects.equals(value, true)) {
      return super.eq(getter, 1);
    }
    if (Objects.equals(value, false)) {
      return super.eq(getter, 0);
    }
    // 兼容枚举
    if (value instanceof IEnum) {
      return super.eq(getter, ((IEnum<?>) value).getValue());
    }

    return super.eq(getter, value);
  }
}

在启动的时候执行Query.setLambdaQueryBuilder(MyQuery::new);加载自定义builder,替换默认的builder

@Configuration
public class Config {

    static {
        Query.setLambdaQueryBuilder(MyQuery::new);
    }

}

单元测试:

@Test
public void test2() {
    List<UserInfo> list = userInfoMapper.query()
            .in(UserInfo::getId, Lists.newArrayList(1, 1, 2, 3, 3))
            .list();
    System.out.println(list);
}