An open API service indexing awesome lists of open source software.

https://github.com/isnott/nott-mybatis-core

个人的mybatis学习包,基于mybatis3.5,spring6.0,mysql,java17+,spring-aop等依赖,封装通用mapper提供curd基础操作以及动态数据源功能。
https://github.com/isnott/nott-mybatis-core

aop-aspects dynamic-datasource java17 mybatis spring6

Last synced: about 2 months ago
JSON representation

个人的mybatis学习包,基于mybatis3.5,spring6.0,mysql,java17+,spring-aop等依赖,封装通用mapper提供curd基础操作以及动态数据源功能。

Awesome Lists containing this project

README

        

# mybatis通用操作包
基于mybatis3.5,spring,mysql,java17+的通用操作包,封装curd通用基础操作。

## 创建初衷
根据mybatis文档教程从头进行学习(aop、动态数据源、mybatis插件等),封装自用的mybatis数据操作包。

## 版本 (Version)
0.0.4

## 依赖版本

|name|version|
|--|--|
|spring-boot-starter-parent|3.1.0|
|mysql-connector-j|8.3.0|
|aspectjweaver|1.9.21.1|
|mybatis-spring|3.0.1|
|spring-context|6.0.9|
|spring-boot-configuration-processor|3.1.5|
|log4j-api|2.20.0|
|spring-test|6.0.9|
|mybatis|3.5.11|
|...|...|

*完整依赖见[GitHub](https://github.com/IsNott/nott-mybatis-core)项目pom文件*

## 模块
|name|description|
|--|--|
|nott-mybatis-curd|mybaits-基础|
|nott-mybatis-dynamic-datasource|mybatis-动态数据源|
|nott-web-test|web测试模块|

## 使用说明
### 引入
pom.xml引入模块(nott-mybatis-orm/dynamic-datasource)
```xml


io.github.isnott
nott-mybatis-orm
0.0.4



io.github.isnott
nott-mybatis-dynamic-datasource
0.0.4

```

在web项目启动主方法上加入注解 @ComponentScan({"org.nott"})

可参考项目web模块test文件夹下的单元测试方法。

自定义service实现类继承ICommonService获取通用service实现方法
(在CommonMapper提供的方法上二次封装分页等方法)
```java
@Service
public class UserService extends ICommonService {

}
```

自定义mapper可直接获取CommonMapper基础方法(需要传递泛型)
```java
public interface UserMapper extends CommonMapper {}
```

## ORM
**application.yml**加入以下配置
```yml
nott:
mybatis:
mapper-location: classpath:mapper/**Mapper.xml
# 不加入dynamic-dataSource时加入下面配置
datasource:
name: mysql-db01
url: jdbc:mysql://127.0.0.1:3306/test?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: 888888
driverClassName: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimumIdle: 0
maximumPoolSize: 20
idleTimeout: 10000
connectionTestQuery: select 1
poolName: nott-hikari-01
```

支持Select、Update、Delete、Insert基础方法(selectById、selectOne)、
单表查询、更新条件构造器

使用示例:
```java
List users = userMapper.selectList();
// 单表条件查询
User user = userMapper.selectOneByCondition(
QuerySqlConditionBuilder.build()
.eq("name","youKnowWho")
);
```

```java
/**
* 单表条件查询支持的方法接口
*/
public interface SqlQuery {

SqlConditionBuilder eq(String colum, Object val);

SqlConditionBuilder neq(String colum, Object val);

SqlConditionBuilder gt(String colum, Object val);

SqlConditionBuilder ge(String colum, Object val);

SqlConditionBuilder lt(String colum, Object val);

SqlConditionBuilder le(String colum, Object val);

...
}
```

Update、Delete、Insert基础方法,详见CommonMapper文件
```
int affectRow = userMapper.updateById(user);
int affectRow = userMapper.insert(user);
int affectRow = userMapper.deleteById("123435345");
int affectRow = userMapper.deleteByIds(Arrays.asList("123435345"));
```

Service封装mapper基础方法、分页方法,详见CommonService文件
```
...
Page page(Page page);

Page page(Page page, QuerySqlConditionBuilder querySqlConditionBuilder);
...
```
## dynamic-datasource
切换数据源,支持使用hikari/druid数据源

在application.yml加入动态数据源开关

```yaml
nott:
enable-dynamic-datasource: true
```
添加data-source.yml文件,加入数据源列表(hikari/druid),
当application.yml和data-source.yml数据源配置内容同时存在,并且打开动态数据源开关,
程序只加载data-source.yml里的内容。

*不需要动态切换数据源时,关闭application.yml中的开关即可。*
```yaml
dataSourceConfigs:
- name: mysql-db01
url: jdbc:mysql://127.0.0.1/test?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
# 标识默认数据源
primary: true
type: com.zaxxer.hikari.HikariDataSource
#type: com.alibaba.druid.pool.DruidDataSource
hikari:
minimumIdle: 0
maximumPoolSize: 20
idleTimeout: 10000
connectionTestQuery: select 1
poolName: nott-hikari-01
- name: mysql-db02
...
```
在代码或者方法体上切换数据源
```java
public void test(){
// 显式切换
DynamicDataSourceHolder.setDynamicDataSourceKey("mysql-db02");
}

@DataSource("mysql-db02")
public void test(){
...
}

```

## 迭代
联表查询构造器,Mybatis mapper执行传入SqlBuilder组装的SQL语句并,详见META-INF/mybatis/Mapper.xml文件、ComplexityWrapper类。
```java
// 返回特定对象列表
List result = ComplexityWrapper.build(User.class, "t1")
.leftJoin(UserRelation.class, "t2", Join.on("t1.id", "t2.user_id", SqlOperator.EQ))
.colums(Colum.select("T1.id","userId"))
.condition(Where.eq("t1.id", "410544b2-4001-4271-9855-fec4b62350d"))
.orderByAsc("t1.id")
.groupBy("t1.id")
.beanType(UserRelationVo.class);

// 返回分页对象
Page page = ComplexityWrapper.build(User.class, "t1")
.leftJoin(UserRelation.class, "t2", Join.on("t1.id", "t2.user_id", SqlOperator.EQ))
.colums(Colum.select("T1.id", "userId"))
.condition(Where.eq("t1.id", "410544b2-4001-4271-9855-fec4b62350d"))
.groupBy("t1.id")
.page(UserRelationVo.class, 1, 10);
```

## 参考文档
mybatis中文文档:https://mybatis.net.cn/getting-started.html

mybatis与spring整合版本对应关系参考:https://mybatis.org/spring/

jsqlparser:https://jsqlparser.github.io/JSqlParser/usage.html

hikari数据源配置参考: https://www.cnblogs.com/didispace/p/12291832.html

druid配置属性:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8