终于说通 Solon 作者,让他为 Solon 框架添加事务注解支持了;并且把 mybatis-solon-plugin 的 @Df 注解更名为 @Db ,接地气多了(Df是什么鬼呢?新手肯定这么想...)。真是费尽了笔者的口水。。。此文主要重写《Mybatis 和 Solon 勾搭在一起》的事务部分,并优化细节。

新故事相关的源码

https://gitee.com/noear/solon_demo/tree/master/demo08.solon_mybatis_multisource

新故事开讲

Mybatis 是个资深的前辈,多年来它基本上只和 Spring 的家族企业合作。今天他尝试和年轻选手Solon组队做业务;Solon 是Java世界里一个新的极易上手的Web框架(哎,如同十八线的演员,没人知道的啦。。。但业务活也是一流的)

本次组队需要完成如下挑战:

  1. 简单的配置
  2. 多数据源支持(分区模式 和 注解模式)
  3. 事务支持
  4. 支持分页组件(这个,其实破坏了SQL的透明性......但业内很流行)

Action...

一、环境说明

环境 版本
IDEA 2020.2
Maven 4.0
Solon 1.0.12 (这是升级版啊)
mybatis-solon-plugin 1.0.12
mybatis-sqlhelper-solon-plugin 1.0.12
Mybatis 5.3.3
JDK 1.8

二、现在代码走起

新建个空白的Maven项目:solon_mybatis_multisource,下面开始操作:

  • (一)在 pom.xml 文件里添加依赖
<parent>
<groupId>org.noear</groupId>
<artifactId>solon-parent</artifactId>
<version>1.0.12</version>
<relativePath />
</parent> <dependencies>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-web</artifactId>
<type>pom</type>
</dependency> <dependency>
<groupId>org.noear</groupId>
<artifactId>mybatis-solon-plugin</artifactId>
</dependency> <dependency>
<groupId>org.noear</groupId>
<artifactId>mybatis-sqlhelper-solon-plugin</artifactId>
</dependency> <!-- 其它依赖参考源码,不然占板面太多了 -->
</dependencies>
  • (二)修改属性文件 application.yml (添加多数据源和分布组件的配置)

Solon 没有特定的数据源配置,所以随便自己起个头就可以;配置项与使用的数据源匹配即可。本例用的是HikariCP

#数据库1的配置
test.db1:
schema: rock
jdbcUrl: jdbc:mysql://localdb:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
driverClassName: com.mysql.cj.jdbc.Driver
username: demo
password: UL0hHlg0Ybq60xyb #数据库2的配置(其实我用的是同一个库)
test.db2:
schema: rock
jdbcUrl: jdbc:mysql://localdb:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
driverClassName: com.mysql.cj.jdbc.Driver
username: demo
password: UL0hHlg0Ybq60xyb #默认(这个可以换成:mybatis.db1)
mybatis:
typeAliases: #支持包名 或 类名(.class 结尾)
- "webapp.model"
mappers: #支持包名 或 类名(.class 结尾)或 xml(.xml结尾)
- "webapp.dso.mapper.AppxMapper.class" #再定义个新配置(为了体现多数据源性 - 应该简单吧?)
mybatis.db2:
typeAliases:
- "webapp.model"
mappers:
- "webapp.dso.mapper.Appx2Mapper.class" #分页组件的配置
sqlhelper:
mybatis:
instrumentor:
dialect: "mysql"
cache-instrumented-sql: true
subquery-paging-start-flag: "[PAGING_StART]"
subquery-paging-end-flag: "[PAGING_END]"
pagination:
count: true
default-page-size: 10
use-last-page-if-page-no-out: true
count-suffix: _COUNT
  • (三)添加配置器(完成会话工厂的构建 及 Mapper 的描述与关联;看上去,挺简洁的)

Spring 的@MapperScan 需要多个配置器才可以完成多源,这个太烦人了;所以mybatis-solon-plugin把它调整成一个函数,故多个数据源可以整到一个配置器玩了:

@XConfiguration
public class Config {
@XBean("db1")
public SqlSessionFactory db1(@XInject("${test.db1}") HikariDataSource dataSource) {
//
//此处用了默认的配置(也可以用:mybatis.db1 进行配置)
//
return new MybatisAdapter(dataSource)
.mapperScan() //类似Spring 的 @MapperScan注解的功能
.getFactory();
} @XBean("db2")
public SqlSessionFactory db2(
@XInject("${test.db2}") HikariDataSource dataSource,
@XInject("${mybatis.db2}") Properties props) {
//
//此处指定了 配置 ${mybatis.db2}
//
return new MybatisAdapter(dataSource, props)
.mapperScan()
.getFactory();
}
}
  • (四)添加控制器

关于多数据源的分包模式示例:

/**
* 分包模式,一开始就被会话工厂mapperScan()并关联好了
* */
@XMapping("/demo/")
@XController
public class DemoController {
@XInject
AppxMapper appxMapper; //已被db1 mapperScan 了,可直接注入 @XInject
Appx2Mapper appxMapper2; //已被db2 mapperScan 了,可直接注入 @XMapping("test")
public AppxModel test(){
return appxMapper.appx_get();
} @XMapping("test2")
public AppxModel test2(){
return appxMapper2.appx_get2(48);
} }

关于多数据源的注解模式示例:

/**
* 注解模式,通过@Db注入,并指定具体的会话工厂
*
* @Db 可注入 Mapper, SqlSession, SqlSessionFactory 类型的字段
* */
@XMapping("/demo2/")
@XController
public class Demo2Controller {
@Db("db1")
AppxMapper appxMapper; //使用@Db 指定会话工厂并注入 @Db("db2")
Appx2Mapper appxMapper2; @XMapping("test")
public AppxModel test(){
return appxMapper.appx_get();
} @XMapping("test2")
public AppxModel test2(){
return appxMapper2.appx_get2(48);
} }

关于事务的示例:(分布式环境下,尽量用消息代理JDBC事务)

/**
* 事务演示
* */
@XMapping("/tran/")
@XController
public class TranController {
@XInject
AppxMapper appxMapper; /**
* mybatis-solon-plugin 的事务,由 @XTran 注解发起(更详细的说明,以后发个新文说明)
* */
@XTran("db1")
@XMapping("test")
public Object test() throws Throwable{
appxMapper.appx_get();
}
}

关于多数据源事务的示例,需要用到Service层:(分布式环境下,尽量用消息代理JDBC事务)

/**
* 多数据源事务演示
* */
@XMapping("/tran2/")
@XController
public class Tran2Controller {
@XInject
AppService appService; //这是定义的Service类,里面的函数注解了@XTran("db1") @XInject
App2Service app2Service; //同上 /**
* 申明这是一个多数据源的事务(这个可以放在任何事务的最外层;用于管理下面的子事务)
* */
@XTran(multisource = true)
@XMapping("test")
public void test() throws Throwable {
//内部申明了用db2的事务
app2Service.add(); //内部申明了用db1的事务
appService.add();
}
}

关于分页的示例:(本案用的是sqlhelper)

@XMapping("/page/")
@XController
public class PageController {
@XInject
AppxMapper appxMapper; @XMapping("test")
public Object test() throws Throwable{
SqlPaginations.preparePagination(2,2); return appxMapper.appx_get_page();
}
}
  • (五)略过的一些代码文件(直接看开头的相关源码)

这里只测试了查询的方法,当然如果需要别的,可以自行添加试试。

故事结尾

所有组队挑战优雅的完成,OY...

Mybatis 和 Solon 在一起的升级版的更多相关文章

  1. Mybatis 和 Solon 勾搭在一起,也是个漂亮组合

    故事相关的源码 https://gitee.com/noear/solon_demo/tree/master/demo08.solon_mybatis 故事开讲 Solon 是Java世界里一个新的极 ...

  2. Solon详解(11)- Mybatis 与 Solon 相亲相爱

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  3. Solon集成(02)- 轻松吃下小馒头 Dubbo

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  4. Mybatis案例升级版——小案例大道理

    纯Mybatis案例升级版——小案例大道理 前言: 这几天看了一本书<原则>,在上面看到了一句话叫“每个人都把自己眼界的局限当成世界的局限”,大学生是

  5. Mybatis Generator插件升级版

    一.目的: 1. *mapper.java 文件名称 改为*DAO.java2. mapper以及mapper.xml 重复执行,只会覆盖原模板方法,不会覆盖自定义方法3. 实体类添加中文注释 二.步 ...

  6. SpringMVC和MyBatis整合

    目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTfu ...

  7. JavaEE MyBatis

    1.  简介 MyBatis本是apache的一个开源项目iBatis的升级版,2013年11月迁移到Github,是三层架构中持久层框架. 目前提供了Java..NET.以及Ruby三种语言实现的版 ...

  8. Spring学习总结(五)——Spring整合MyBatis(Maven+MySQL)一

    MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中. 使用这个类库中的类, Spring 将会加载必要的MyBatis工厂类和 session 类. 这个类库 ...

  9. SpringMVC+MyBatis(最新)

    目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTfu ...

随机推荐

  1. C#和 JS的闭包

    闭包的概念是内层的函数可以引用包含在它外层的函数的变量,即使外层函数的执行已经终止.但该 变量提供的值并非变量创建时的值,而是在父函数范围内的最终值. C#闭包可理解为跨作用域访问函数内变量,那么如何 ...

  2. Eclipse开发Web项目连接MySQL时找不到驱动的解决办法

    当我们使用Eclipse开发Web项目连接MySQL时后台报找不到驱动的错误,如下:解决办法: 1.这时我们首先要检查我们是否导入了连接MySQL数据库的jar包,如图,是否已经将jar包复制到项目下 ...

  3. Ansible基础

    Ansible基于Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用YMAL 及Jinja2模板语言. 组件: 核心:ansible 核心模块(Core Modules): ...

  4. animate动画基础

    定义: animate() 方法执行 CSS 属性集的自定义动画. 1.该方法通过CSS样式将元素从一个状态改变为另一个状态.CSS属性值是逐渐改变的,这样就可以创建动画效果. 2.只有数字值可创建动 ...

  5. Druid 连接池

    记录Druid 连接池简单用法 package Utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sq ...

  6. Maven中出现Could not find artifact ...:pom:0.0.1-SNAPSHOT

    参考链接:https://blog.csdn.net/zpwggi123/article/details/87189959 多模块项目构建时,先将总项目install,之后子项目分别install,注 ...

  7. isinstance方法判断可迭代和迭代器

    from collections import Iterable print(isinstance([],Iterable)) print(isinstance( {}, Iterable)) pri ...

  8. 如何部署redis服务

    使用工具 redis-64-3.2.100 部署系统 windows server 2012R2 1.下载安装redis-64-3.2.100安装包,下载地址:https://github.com/m ...

  9. PHP umask() 函数

    ------------恢复内容开始------------ 定义和用法 umask() 函数改变文件的文件权限. 该函数把 PHP 的 umask 设置为 mask & 0777 并返回原来 ...

  10. C/C++编程笔记:C++入门知识丨继承和派生

    本篇要学习的内容和知识结构概览 继承和派生的概念 派生 通过特殊化已有的类来建立新类的过程, 叫做”类的派生”, 原有的类叫做”基类”, 新建立的类叫做”派生类”. 从类的成员角度看, 派生类自动地将 ...