Giter VIP home page Giter VIP logo

awesome-mybatis-plus's Introduction

Awesome Mybatis-Plus

Awesome

🎉 A curated list of awesome things related to MyBatis-Plus

Resource

Official Resources

Official Examples

Examples

Waiting for your PR.

Blog Posts

Waiting for your PR.

Tutorials

Projects Using MyBatis-Plus

  • SpringWind:Java EE(J2EE)快速开发框架
  • Crown:Mybatisplus 3.0 教学版
  • Crab:WEB 极速开发框架
  • KangarooAdmin:轻量级权限管理框架
  • iBase4J:Java 分布式快速开发基础平台
  • BMS:基础权限开发框架
  • spring-shiro-training:简单实用的权限脚手架
  • center:系统管理中心系统
  • skeleton:Springboot-Shiro 脚手架
  • springboot_mybatisplus:基于 SpringBoot 的美女图片爬虫系统
  • guns:guns 后台管理系统
  • maple:maple 企业信息化的开发基础平台
  • jeeweb-mybatis:JeeWeb 敏捷开发平台
  • king-admin:前后端分离的基础权限管理后台
  • bing-upms:SpringBoot + Shiro +FreeMarker 制作的通用权限管理
  • slife:SpringBoot 企业级快速开发脚手架
  • pig:微服务 Spring Cloud 架构
  • mysiteforme:系统后台
  • watchdog-framework:基础权限框架
  • iartisan-admin-template:Java 快速开发平台
  • ifast:ifast 快速开发平台
  • roses:基于 Spring Cloud 的分布式框架
  • renren-security:人人权限系统
  • freeter-admin:飞特后台管理系统
  • vblog:VBlog 博客系统
  • hdw-dubbo:HDW快速开发平台
  • pybbs:更好用的Java语言社区(论坛)
  • SmallBun:SmallBun企业级开发脚手架
  • webplus:综合开发平台
  • x-boot:VUE 前后端分离开发平台
  • nice-blog-sys:基于SpirngBoot开发,好看的个人博客
  • Diboot:轻代码开发平台
  • tyboot:基于SpringBoot的快速开发脚手架
  • ac-blog:ac博客网站
  • spider-flow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫
  • goodskill:基于Dubbo + SpringBoot搭建的秒杀系统
  • SpringBoot_MyBatisPlus:SpringBoot集成MyBatisPlus
  • bootplus:基于SpringBoot + Shiro + MyBatisPlus的权限管理框架
  • Dice:一个Vue 2.x 和 SpringBoot 全家桶开发的前后端分离的个人内容管理系统:「博客」、「权限管理」、「代码段」、「媒体库」等。
  • thyme-boot:基于SpringBoot+Layui+Vue的快速后台开发框架
  • lamp-cloud:基于SpringCloud的微服务脚手架,可配置SaaS模式,含单体版
  • mybatis-plus-generator-ui:基于mybatis-plus-generator的图形化交互式代码生成工具
  • zealsay:基于spring boot + nuxt服务端渲染的前后端分离快速开发脚手架
  • ballcat:😸基于 Spring Boot + Ant Design Vue 的快速开发脚手架
  • tropical-fish:基于 Spring Boot + Mybatis-Plus 的快速开发脚手架
  • J2eeFAST:J2eeFAST 开源平台
  • MateCloud: Spring Cloud Alibaba微服务+VUE快速脚手架,让你只专注于业务
  • OPSLI: OPSLI 快速开发平台
  • mogu_blog: 蘑菇博客
  • paicoding: 技术派,一款好用又强大的开源社区

Who Using MyBatis-Plus

  • 正保远程教育集团
  • 苏州罗想软件股份有限公司
  • 上海箱讯网络科技有限公司
  • 青岛帕特智能科技有限公司
  • 成都泰尔数据服务有限公司
  • 北京环球万合信息技术有限公司
  • 北京万学教育科技有限公司
  • 重庆声光电智联电子科技有限公司
  • 锦途停车服务(天津)有限公司
  • 浙江左中右电动汽车服务有限公司
  • 迪斯马森科技有限公司
  • 成都好玩123科技有限公司
  • 深圳华云声信息技术有限公司
  • 昆明万德科技有限公司
  • 浙江华坤道威
  • 南京昆虫软件有限公司
  • 上海营联信息技术有限公司
  • 上海绚奕网络技术有限公司
  • 四川淘金你我信息技术有限公司
  • 合肥迈思泰合信息科技有限公司
  • 深圳前海蚂蚁芯城科技有限公司
  • 广州金鹏集团有限公司
  • 安徽自由纪信息科技有限公司
  • 杭州目光科技有限公司
  • 迈普拉斯科技有限公司
  • 贵州红小牛数据有限公司
  • 天津市神州商龙科技股份有限公司
  • 安徽银通物联有限公司
  • 南宁九一在线信息科技有限公司
  • 青海智软网络科技有限公司
  • 安徽银基信息安全技术有限责任公司
  • 上海融宇信息技术有限公司
  • 北京奥维云网科技股份有限公司
  • 深圳市雁联移动科技有限公司
  • 广东睿医大数据有限公司
  • 武汉追忆那年网络科技有限公司
  • 成都艺尔特科技有限公司
  • 深圳市易帮云科技有限公司
  • 上海中科软科技股份有限公司
  • 北京熊小猫英语科技有限公司
  • 武汉桑梓信息科技有限公司
  • 腾讯科技(深圳)有限公司
  • 苏州环境云信息科技有限公司
  • 杭州阿启视科技有限公司
  • 杭州杰竞科技有限公司
  • 北京云图征信有限公司
  • 上海科匠信息科技有限公司
  • 深圳小鲨智能科技有限公司
  • 深圳市优加互联科技有限公司
  • 北京天赋通教育科技有限公司
  • 上海(壹美分)胤新信息科技有限公司
  • 厦门栗子科技有限公司
  • 山东畅想云教育科技有限公司
  • 成都云堆移动信息技术有限公司
  • 杭州一修鸽科技有限公司
  • 北京乾元大通教育科技有限公司
  • 苏州帝博信息技术有限公司
  • 深圳来电科技有限公司
  • 上海银基信息安全有限公司
  • 济南果壳科技信息有限公司
  • 云鹊医疗科技(上海)有限公司
  • 昆明有数科技有限公司
  • 大手云(上海)金融信息服务有限公司
  • 深圳未来云集
  • 上海乔融金融信息服务有限公司
  • 苏州墨焱网络科技有限公司
  • 深兰科技(上海)有限公司
  • 济南悦码信息科技有限公司
  • 北京魔力耳朵科技有限公司
  • 宋城独木桥网络有限公司
  • 重庆景辉昱阳科技有限公司
  • 厦门亲禾教育科技有限公司
  • 济南申宝网络科技有限公司
  • 奇安信科技集团股份有限公司
  • 苏州时新集成技术有限公司
  • 中科传媒科技有限责任公司
  • 成都潇游科技有限公司
  • 深圳市游迷天下科技有限公司
  • 深圳市七姊妹科技有限公司
  • 北京泰康保险集团股份有限公司
  • 上海中兆信息技术有限公司
  • 上海御繁信息技术有限公司
  • 上海谆龙科技有限公司
  • 北京加菲猫科技有限公司
  • 北京大飞网络技术有限公司
  • 北京道天地科技有限公司
  • 西安荣峰软件科技有限公司
  • 中铁第四勘察设计院集团有限公司
  • 杭州知友网络科技有限公司
  • 山东亿云信息技术有限公司
  • 深圳市雪球科技有限公司

License

CC0

To the extent possible under law, baomidou has waived all copyright and related or neighboring rights to this work.

awesome-mybatis-plus's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

awesome-mybatis-plus's Issues

Unexpected token ON CONFLICT for Postgresql

hi team
im using mybatisplus for postgre sql and using plugins like tenantInteceptor, Audit Interceptor,...
those plugin use jsql parser to parse SQL syntax. but for my query:

INSERT INTO the_table (id, column_1, column_2) 
VALUES (1, 'A', 'X'), (2, 'B', 'Y'), (3, 'C', 'Z')
ON CONFLICT (id) DO UPDATE 
  SET column_1 = excluded.column_1, 
      column_2 = excluded.column_2;

it cause exception:
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "CONFLICT" <S_IDENTIFIER> at line 202, column 14. Was expecting: "DUPLICATE", at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:26538), at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:26377), at net.sf.jsqlparser.parser.CCJSqlParser.Insert(CCJSqlParser.java:2155), at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:143), at net.sf.jsqlparser.parser.CCJSqlParser.Statements(CCJSqlParser.java:502), at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:186), at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:176), at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserMulti(JsqlParserSupport.java:63), ... 106 common frames omitted

here is my audit interceptor:

@RequiredArgsConstructor
public class AuditInterceptor extends JsqlParserSupport implements InnerInterceptor {

    @Override
    public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
        MPStatementHandler mpStatementHandler = PluginUtils.mpStatementHandler(sh);
        MappedStatement mappedStatement = mpStatementHandler.mappedStatement();
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        if (sqlCommandType == SqlCommandType.UPDATE || sqlCommandType == SqlCommandType.INSERT) {
            MPBoundSql mpBoundSql = mpStatementHandler.mPBoundSql();
            Class<?> entityType = mappedStatement.getParameterMap().getType();
            if (!mpBoundSql.sql().contains("REFRESH MATERIALIZED VIEW")) {
                mpBoundSql.sql(parserMulti(mpBoundSql.sql(), entityType));
            }
        }
    }

    @Override
    protected void processInsert(Insert insert, int index, String sql, Object obj) {
        Set<String> columnNames = getColumnNames(obj);
        if (CollectionUtils.isEmpty(columnNames)) {
            return;
        }
        // Set update time & tenant ID
        var now = new LongValue(System.currentTimeMillis());
        setInsertValue(insert, columnNames, AuditEntity.CREATED_COLUMN_NAME, now);
        setInsertValue(insert, columnNames, AuditEntity.MODIFIED_COLUMN_NAME, now);
        setInsertValue(insert, columnNames, AuditEntity.TENANT_ID_COLUMN_NAME, new StringValue(ContextUtils.getOrThrowTenantId()));
        setInsertValue(insert, columnNames, AuditEntity.ENVIRONMENT_COLUMN_NAME, new StringValue(ContextUtils.getEnvName()));
    }

    private Set<String> getColumnNames(Object obj) {
        TableInfo tableInfo = TableInfoHelper.getTableInfo((Class<?>) obj);
        if (tableInfo == null) {
            getLog().warn("Cannot find table info for class '{}'", obj);
            return Collections.emptySet();
        }
        return tableInfo.getFieldList().stream()
            .map(TableFieldInfo::getColumn)
            .collect(Collectors.toSet());
    }

    private LogTagHolder getLog() {
        return MosLog.wrap(log).tag1("AUDIT_INTERCEPTOR");
    }

    private void setInsertValue(Insert insert, Set<String> definedColumnNames, String columnName, Expression columnValue) {
        List<Column> columns = insert.getColumns();
        if (!isAccept(columnName, definedColumnNames, columns)) {
            return;
        }
        columns.add(new Column(columnName));
        ItemsList itemsList = insert.getItemsList();
        if (itemsList instanceof MultiExpressionList) {
            ((MultiExpressionList) itemsList).getExpressionLists().forEach(el -> el.getExpressions().add(columnValue));
        } else if (itemsList instanceof ExpressionList) {
            ((ExpressionList) insert.getItemsList()).getExpressions().add(columnValue);
        }
        // TODO remove after check
        MosLog.wrap(log).onPre().tag1("TAN_TEST").tag2("INSERT")
            .info("[{}][{}] Set insert value", insert.getTable().getName(), columnName);
    }

    /**
     * Check if column exist in table definition & not exist in INSERT/UPDATE command.
     */
    private boolean isAccept(String columnName, Set<String> definedColumnNames, List<Column> insertColumns) {
        if (!definedColumnNames.contains(columnName)) {
            return false;
        }
        Column insertColumn = insertColumns.stream()
            .filter(curInsertColumn -> StringUtils.equals(columnName, curInsertColumn.getColumnName())
                || StringUtils.equals("`" + columnName + "`", curInsertColumn.getColumnName()))
            .findFirst()
            .orElse(null);
        return (insertColumn == null);
    }

    @Override
    protected void processUpdate(Update update, int index, String sql, Object obj) {
        Set<String> columnNames = getColumnNames(obj);
        if (CollectionUtils.isEmpty(columnNames)) {
            return;
        }
        setUpdateValue(update, columnNames, AuditEntity.MODIFIED_COLUMN_NAME, new LongValue(System.currentTimeMillis()));
    }

    private void setUpdateValue(Update update, Set<String> definedColumnNames, String columnName, Expression columnValue) {
        List<Column> columns = update.getColumns();
        if (!isAccept(columnName, definedColumnNames, columns)) {
            return;
        }
        columns.add(new Column(columnName));
        List<Expression> expressions = update.getExpressions();
        expressions.add(columnValue);
        // TODO remove after check
        MosLog.wrap(log).onPre().tag1("TAN_TEST").tag2("UPDATE")
            .info("[{}][{}] Set update value", update.getTable().getName(), columnName);
    }

}

for now im using mybatis-plus:

<mybatis-plus.version>3.4.3.1</mybatis-plus.version>
		<mybatis-plus-join.version>1.2.1</mybatis-plus-join.version>
<dependency>
				<groupId>com.baomidou</groupId>
				<artifactId>mybatis-plus</artifactId>
				<version>${mybatis-plus.version}</version>
			</dependency>
			<dependency>
				<groupId>com.baomidou</groupId>
				<artifactId>mybatis-plus-boot-starter</artifactId>
				<version>${mybatis-plus.version}</version>
			</dependency>
			<dependency>
				<groupId>com.github.yulichang</groupId>
				<artifactId>mybatis-plus-join</artifactId>
				<version>${mybatis-plus-join.version}</version>
			</dependency>

please guide how to fix this? look like that lib only support MySQL syntax

【开源自荐】基于SpringBoot、Sa-Token、MybatisPlus开发的轻量级快速开发平台

EuBackend

基于SpringBoot开发的轻量级快速开发平台

license EuBackend

EuBackend是一套全部开源的前后端分离 Java EE 企业级快速开发平台,基于最新技术栈SpringBootSa-TokenMyBatisPlus等作为后端框架,使用RBAC作为权限控制模型,并且毫无保留给个人及企业免费使用。

项目特性

  • 简洁而不简单的RBAC权限管理体系
  • 强大的代码生成功能(从sql>mapper>java>前端页面 全部搞定)
  • 数据权限控制,通过注解轻松实现
  • 强大的登录体系:检查验证码、密码错误次数、账号状态等
  • 完善的日志记录体系简单注解即可实现
  • 完善的XSS防范及脚本过滤,彻底杜绝XSS攻击
  • 封装Excel导入导出,数据量大也不怕,使用更简单
  • 动态数据源,可以轻松实现多数据源切换

项目生态

开发环境

  • JDK:1.8+
  • Maven:3.8+
  • MySQL:5.7+
  • Redis:6.2+

主框架选型

  • SpringBoot 2.4.x
  • Sa-Token 1.34.x
  • MybatisPlus 3.4.x
  • Druid 1.1.x
  • Quartz 2.3.x
  • Knife4j 4.1.x

内置功能

  1. 用户管理
  2. 部门管理
  3. 岗位管理
  4. 角色管理
  5. 菜单管理
  6. 字典管理
  7. 通知公告
  8. 在线用户
  9. 定时任务
  10. 操作日志
  11. 代码生成
  12. API管理

演示图 [eu-vue2]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.