MyBatis-Flex学习记录1---请各位大神指教

简介(官网介绍)

MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。

官方文档连接:https://mybatis-flex.com/

特征(官网介绍)

1、轻量:除了 MyBatis,没有任何第三方依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。 这带来了几个好处:1、极高的性能;2、极易对代码进行跟踪和调试; 3、把控性更高。
2、灵活:支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper**^灵活** 可以轻易的帮助我们实现 多表查询链接查询子查询 等等常见的 SQL 场景。
3、强大:支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键逻辑删除乐观锁配置数据脱敏数据审计数据填充 等等功能。

快速开始

  1. 依赖引入
<dependencies>
<!--        mybatis-fiex代码生成器依赖-->
	<dependency>
        <groupId>com.mybatis-flex</groupId>
        <artifactId>mybatis-flex-codegen</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>com.mybatis-flex</groupId>
        <artifactId>mybatis-flex-spring-boot-starter</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
    <!-- for test only -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
  1. yml配置文件配置
spring:
  datasource:
    url: // 数据库连接
    username: // 数据库账户
    password: // 数据库密码
    
// 如果需要自己编写xml文件则添加该配置
mybatis-flex:
  mapper-locations:
    - classpath*:/mapper/*.xml
  1. 在控制类添加MapperScan(“mapper坐在包路径”)扫描mapper

代码生成器

package com.example.mybatisflexdemo.utils;

import cn.hutool.core.util.StrUtil;
import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author cyh
 * 注意:由于 MyBatis-Flex 的 APT 功能会自动帮我们生成了 Mapper 的 Java 类,
 * 如果我们在代码生成器中选择生成 Mapper, 则建议把 APT 的 Mapper 生成功能给关闭掉,
 * 否则系统中会存在两份一样功能的 Mapper。
 */
public class CodeGenerationUtil {

    public static void main(String[] args) {
        //配置数据源
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("数据库连接地址");
        dataSource.setUsername("数据库账号");
        dataSource.setPassword("数据库密码");

        // 输入信息
        // 根包名
        //表前缀
        //表名
        Map<String, Object> map = scannerInfo();
        String basePackage = map.get("basePackage").toString();
        String preFixTable = map.get("preFixTable").toString();
        String tableNames = map.get("tableNames").toString();
        //创建配置内容,两种风格都可以。
        GlobalConfig globalConfig = createGlobalConfigUseStyle1(basePackage, preFixTable, tableNames);

        //通过 datasource 和 globalConfig 创建代码生成器
        Generator generator = new Generator(dataSource, globalConfig);

        //生成代码
        generator.generate();
    }

    public static GlobalConfig createGlobalConfigUseStyle1(String basePackage, String prefixTable, String tableName) {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();

        //设置根包
        globalConfig.setBasePackage(basePackage);

        //设置表前缀和只生成哪些表
        if (StrUtil.isNotBlank(prefixTable)) {
            globalConfig.setTablePrefix(prefixTable);
        }
        // 输入表名则生成其中表,否则生成全部
        if (StrUtil.isNotBlank(tableName)) {
            String[] strings = tableName.split(",");
            globalConfig.setGenerateTable(strings);
        }

        //设置生成 entity 并启用 Lombok
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);

        //设置生成 mapper
        globalConfig.setMapperGenerateEnable(true);

        // 设置生成controller
        globalConfig.setControllerGenerateEnable(true);

        // 设置生成Service
        globalConfig.setServiceGenerateEnable(true);
        globalConfig.setServiceImplGenerateEnable(true);
//        //可以单独配置某个列
//        ColumnConfig columnConfig = new ColumnConfig();
//        columnConfig.setColumnName("tenant_id");
//        columnConfig.setLarge(true);
//        columnConfig.setVersion(true);
//        globalConfig.setColumnConfig("tb_account", columnConfig);

        // 生成APT
        globalConfig.setTableDefGenerateEnable(true);
        
        return globalConfig;
    }

    public static Map<String, Object> scannerInfo() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入根包名称(回车结束):");
        String basePackage = scanner.nextLine();
        System.out.println("\n");
        System.out.println("请输入表前缀(无前缀直接回车结束)");
        String preFixTable = scanner.nextLine();
        System.out.println("\n");
        System.out.println("请输入要生成的表名(多表名以,(英文逗号隔开)输入完成回车结束)");
        String tableName = scanner.nextLine();
        Map<String, Object> params = new HashMap<>();
        params.put("basePackage", basePackage);
        params.put("preFixTable", preFixTable);
        params.put("tableNames", tableName);
        return params;
    }
}

开启日志

@Slf4j
@Configuration
public class MyBatisFlexConfiguration {
    public MyBatisFlexConfiguration() {
        //开启审计功能
        AuditManager.setAuditEnable(true);

        //设置 SQL 审计收集器
        AuditManager.setMessageCollector(auditMessage ->
                log.info("{},{}ms", auditMessage.getFullSql()
                        , auditMessage.getElapsedTime())
        );
    }
}

初步使用

  1. 登录用户信息单表查询
    public SaTokenInfo login(LoginDto params) {
        QueryWrapper wrapper = QueryWrapper.create()
                .select(USER_INFO.ID)
                .where(USER_INFO.USERNAME.eq(params.getUsername()).and(USER_INFO.PASSWORD.eq(params.getPassword())));
        Long uid = userInfoMapper.selectOneByQueryAs(wrapper, Long.class);

        if (ObjUtil.isNull(uid)) {
            throw new BaseException(500, "账号或者密码错误");
        }

        StpUtil.login(uid);
        return StpUtil.getTokenInfo();
    }

// USER_INFO 是通过代码生成器 生成APT  
//globalConfig.setTableDefGenerateEnable(true);
// 自动生成的需要手动编码,以下类似
  1. 权限树形结构多表连接查询
public List<Map<String, Object>> getUserPermissions() {
        Long uid = Long.parseLong(StpUtil.getLoginId().toString());
        if (ObjUtil.isNull(uid)) {
            throw new BaseException(500, "登录信息获取失败,请刷新或重新登录");
        }

        QueryWrapper wrapper = QueryWrapper.create()
                .select(PERMISSIONS_TREE.ALL_COLUMNS)
                .select(META.ALL_COLUMNS)
                .from(ROLE_USER)
                .leftJoin(ROLE_PERMISSIONS)
                .on(ROLE_USER.R_ID.eq(ROLE_PERMISSIONS.R_ID))
                .leftJoin(PERMISSIONS_TREE)
                .on(ROLE_PERMISSIONS.P_ID.eq(PERMISSIONS_TREE.ID))
                .leftJoin(META)
                .on(PERMISSIONS_TREE.META.eq(META.ID))
                .where(ROLE_USER.U_ID.eq(uid));

        List<PermissionMeta> metas = roleUserMapper.selectListByQueryAs(wrapper, PermissionMeta.class);
        return menuTree.menuList(metas);
    }

SQL语句

SELECT pt.id, pt.path, meta.*
FROM tb_role_user as rs
LEFT JOIN tb_role_permissions as rp  
ON rs.r_id = rp.r_id  
LEFT JOIN tb_permissions_tree as pt
ON rp.p_id = pt.id 
LEFT JOIN tb_meta as meta
ON pt.meta  = meta.id
WHERE  rs.u_id = {uid}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值