# 开发技巧
# 获取主数据源的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.setQueryBuilder
与Query.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);
}