springboot详细整合mybatisplus

news2024/11/23 18:30:58

SpringBoot详细整合mybatisPlus

文章目录

  • SpringBoot详细整合mybatisPlus
    • 一、引入mybatis_plus依赖
    • 二、修改mybatis_plus的yml配置
    • 三、添加mybatis_plus的其他配置以及包扫描
    • 四,修改mybatis的配置(这一步根据实际情况修改)

无奈,一个小的新项目只有mybatis不习惯,那就来加个plus吧~

一、引入mybatis_plus依赖

     <properties>
   <pagehelper.spring.boot.starter.version>1.4.6</pagehelper.spring.boot.starter.version>
        <mybatisplus.version>3.4.0</mybatisplus.version>
    </properties>

<!-- mybatisPlus  它的分页会与pagehelper分页冲突,目前系统用的pageHelper分页-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>

        <!-- pagehelper 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>${pagehelper.spring.boot.starter.version}</version>
        </dependency>

上面有一个注意的点就是mybatis_plus的分页会与pageHelper的分页冲突,因为他们的底层其实差不多的。我个人比较喜欢mybatis_plus的分页 ,因为pageHelper的联表分页会比较麻烦,而mybatis_plus的联表分页只需要在mapper层上面加上@Select注解写联表查询语句就可以了。 但是没办法少数服从多数,这里就用了pageHelper分页。

上面有一点要注意的是,引入了mybatis_plus的依赖后mybatis的依赖就不需要了可以干掉。

二、修改mybatis_plus的yml配置

首先看一下整个项目大概的包的层级,主要是为了映射上mapper和xml文件。

# MyBatis配置
mybatis:
    # 搜索指定包别名
    typeAliasesPackage: com.ruoyi.project.**.domain
    # 配置mapper的扫描,找到所有的mapper.xml映射文件
    mapperLocations: classpath*:mybatis/**/*Mapper.xml
    # 加载全局的配置文件
    configLocation: classpath:mybatis/mybatis-config.xml

#MyBatisPlus配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath*:/mybatis/**/**.xml
  type-aliases-package: com.ruoyi.project.chouzhou

三、添加mybatis_plus的其他配置以及包扫描

下面的两个配置一个是为了分页(当然,其实目前由于与pageHelper冲突就没用plus的分页了,含泪舍弃),另一个则是基础字段的填充和更新。

重要的是添加包扫描,对应你的mapper层的包路径。

ps:plus的删除是逻辑删除只需要在对应的删除标识字段上机上@TableLogic注解,查询的时候根据改字段筛选就可以了

/**
 * @author zmz
 * @since 2021/7/19 20:51
 */
//自动填充处理器用来自动填充处理时间 实现MateObjectHandler类
@Component
@Configuration
@MapperScan("com.ruoyi.project.chouzhou.*.mapper")
public class MybatisPlusConfig implements MetaObjectHandler {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));
        return interceptor;
    }
    

// 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", String.class, DateUtils.getTime());
    }

    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", String.class, DateUtils.getTime());
    }
}

四,修改mybatis的配置(这一步根据实际情况修改)

在mybatis配置中把SqlSessionFactoryBean替换为MybatisSqlSessionFactoryBean

下面是本项目的mybatis配置

/**
 * Mybatis支持*匹配扫描包
 * 
 * @author ruoyi
 */
@Configuration
public class MyBatisConfig
{
    @Autowired
    private Environment env;

    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";

    public static String setTypeAliasesPackage(String typeAliasesPackage)
    {
        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
        List<String> allResult = new ArrayList<String>();
        try
        {
            for (String aliasesPackage : typeAliasesPackage.split(","))
            {
                List<String> result = new ArrayList<String>();
                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
                Resource[] resources = resolver.getResources(aliasesPackage);
                if (resources != null && resources.length > 0)
                {
                    MetadataReader metadataReader = null;
                    for (Resource resource : resources)
                    {
                        if (resource.isReadable())
                        {
                            metadataReader = metadataReaderFactory.getMetadataReader(resource);
                            try
                            {
                                result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
                            }
                            catch (ClassNotFoundException e)
                            {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                if (result.size() > 0)
                {
                    HashSet<String> hashResult = new HashSet<String>(result);
                    allResult.addAll(hashResult);
                }
            }
            if (allResult.size() > 0)
            {
                typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
            }
            else
            {
                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return typeAliasesPackage;
    }

    public Resource[] resolveMapperLocations(String[] mapperLocations)
    {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        List<Resource> resources = new ArrayList<Resource>();
        if (mapperLocations != null)
        {
            for (String mapperLocation : mapperLocations)
            {
                try
                {
                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
                    resources.addAll(Arrays.asList(mappers));
                }
                catch (IOException e)
                {
                    // ignore
                }
            }
        }
        return resources.toArray(new Resource[resources.size()]);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
    {
        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
        String mapperLocations = env.getProperty("mybatis.mapperLocations");
        String configLocation = env.getProperty("mybatis.configLocation");
        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
        VFS.addImplClass(SpringBootVFS.class);

//        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
  sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        return sessionFactory.getObject();
    }
}

好了,结束了,开干吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三个关键数字变化,剖析中国智能手机市场的趋势及其影响

近期&#xff0c;全球行业分析机构CounterpointResearch公布了《中国智能手机高端市场白皮书》&#xff0c;对中国智能手机市场数据进行详细分析。该报告揭示了几个关键数据&#xff0c;值得深入剖析。 上面的图表展示了中国智能手机市场在2012年至2022年的11年间销量、平均价格…

UE5《Electric Dreams》项目PCG技术解析 之 PCGDemo_Ditch关卡详解

文章目录 前导文章关卡概要PCGGraphPoints From Actor Tag作为PCG的分割工具分层装饰 一些知识点和技巧使用Attribute Operation将属性暂存到临时属性中是否生成碰撞 小结 前导文章 《UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流》《UE5《Electric…

mac系统通过终端连接远程服务器

mac系统通过终端连接远程服务器 1、通过自带终端连接1.1 命令直接连接1.2 方式2——创建连接 2、通过iTerm2连接2.1 方式一&#xff1a;命令直接连接 3. Mac上使用scp命令 1、通过自带终端连接 1.1 命令直接连接 如下&#xff1a;ssh -p 22 root远程IP1.2 方式2——创建连接 …

类Twitter风格的RSS阅读器

本文完成于 2 月中旬&#xff0c;其中的反代还是 frp npm 方案&#xff1b; 什么是 RSS ? RSS 是用 PHP、Laravel、Inertia.js、Tailwind 和 Vue.js 编写的简单的类Twitter 风格的 RSS阅读器&#xff0c;支持 RSS和ATOM 格式。 命令行安装 在群晖上以 Docker 方式安装。 官…

形式化验证,QED: Quick Error Detection Tests for Effective Post-Silicon Validation(二)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

chatgpt赋能python:如何用Python打造一个简单的抽奖程序

如何用Python打造一个简单的抽奖程序 随着互联网的不断发展&#xff0c;抽奖活动已经成为了各种营销活动的必备环节&#xff0c;因此如何快速便捷地实现一个抽奖程序也变得尤为重要。本文将介绍如何使用Python打造一个简单的抽奖程序。 一、抽奖程序的工作原理 抽奖程序的核…

Vue使用vue-3d-model组件预览3D三维文件、立体文件,支持旋转、自动播放

实现效果 Tips:先泼个冷水&#xff0c;这个预览3D组件有个致命的缺陷——不能设置材质、皮肤文件的目录路径&#xff0c;必须要和3d文件放在同一个目录&#xff0c;如果项目是用hash模式(url后面会有/#/这种井号)&#xff0c;就会导致无法读取根目录的材质文件。所以推荐了解下…

LabVIEW利用相机开发零件处理和检查系统

LabVIEW利用相机开发零件处理和检查系统 为了将自动化运用于飞机发动机轮机机翼的去毛刺和检查流程&#xff0c;设计了一个系统&#xff0c;该系统使用六轴机器人操作抖动&#xff0c;并结合两个关键操作。首先&#xff0c;使用专门选定的工具对机翼进行去毛刺&#xff0c;以去…

ssh 端口转发

本地转发 ssh -L -CTfN 9527:remote_server_ip:23 ssh_server_ipL 本地转发模式C 压缩数据T 禁用模拟终端f 后台运行N 不执行远程指令&#xff0c; 常用于仅做端口转发 在local_server上开启本地转发模式之后 。ssh_server就会出现2端的TCP链接。然后所有发向9527端口TCP数据…

ASCII、Unicode、UTF-8、GBK、全角/半角

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 目录 一、定义 1、ASCII 2、Unicode 3、UTF-8 4、GB2312 5、GBK 6、\u和\x 7、全角和半角 二、相互转化 1、str 与 ASCI…

[acwing周赛复盘] 第 110 场周赛20230701

[acwing周赛复盘] 第 110 场周赛20230701 总结5044. 求和1. 题目描述2. 思路分析3. 代码实现 5045. 三角形数1. 题目描述2. 思路分析3. 代码实现 5046. 智商药1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 状态不对&#xff0c;把自己写懵了。T1 模拟币T2 对向双指针…

关于Linux同步机制知识点整理

在Linux系统中&#xff0c;同步机制是操作系统中非常重要的一部分&#xff0c;以下是一些基本要点&#xff1a; 互斥锁 互斥锁是一种「独占锁」&#xff0c;比如当线程 A 加锁成功后&#xff0c;此时互斥锁已经被线程 A 独占了&#xff0c;只要线程 A 没有释放手中的锁&#…

梁宁:VisionPro、GPT、Web3三件套齐备,元宇宙开启

本文内容整理自图灵社区对谈栏目直播&#xff0c;主题为 ChatGPT 真需求&#xff0c;从产品的第一性原理解析。 上篇内容回顾&#xff1a;梁宁&#xff1a;为什么中国没有像 ChatGPT 和 Vision Pro 这样的创新产品&#xff1f; 梁宁&#xff0c;产品战略专家&#xff0c;曾任湖…

chatgpt赋能python:如何在Python中安装PIL

如何在Python中安装PIL Python Imaging Library&#xff08;PIL&#xff09;是一款用于处理图像的Python库&#xff0c;它提供了各种图像处理功能&#xff0c;包括大小调整、旋转、裁剪等等。如果你需要在你的Python项目中处理图像&#xff0c;那么PIL是一个不错的选择。 步骤…

DBeaver连接GaussDB

DBeaver 官网&#xff1a;https://dbeaver.io/打开DBeaver&#xff0c;点击菜单栏 “数据库”>“驱动管理” 点击“新建” 填入下面内容&#xff1a; 驱动名称&#xff1a;GS 驱动类型&#xff1a;Generic 类名&#xff1a;org.postgresql.Driver URL模板&#xff1a;jdbc…

Linux:LNMP上搭建discuz论坛(源码安装)

LNMP环境 Linux &#xff1a;LNMP&#xff08;源码包安装&#xff09;_鲍海超-GNUBHCkalitarro的博客-CSDN博客 discuz论坛 准备好源码包 LNMP环境正常 yum -y install unzip unzip Discuz_X3.3_SC_UTF8.zip # unzip 源码包名称 mv upload/ /usr/local/nginx/html/tarro…

信号链噪声分析13

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 接 触 ADC 或 DAC 时您一定会碰到这个经常被引用的公式&#xff0c;用于计算转换器理论信噪 比(SNR)。与其盲目地相信表象&#xff0c;不如从根本上了解其来源&#xff0c;因为…

Shell中的流程控制(if/case/for/while)

文章目录 Shell中的流程控制&#xff08;if/case/for/while&#xff09;1 if判断1.1 单分支1.2 多分支 2. case语句3 for循环3.1 第一种写法 (())3.2 第二种写法 in 4 while循环4.1 demo14.2. demo2测试let Shell中的流程控制&#xff08;if/case/for/while&#xff09; 1 if判…

【C】操作符详解

操作符 算术操作符移位操作符位操作符赋值操作符&#xff08;&#xff09;复合赋值操作符 单目操作符关系操作符逻辑操作符逗号表达式条件操作符下标引用&#xff0c;函数调用和结构成员 今天给大家带来一篇关于C语言操作符的详细介绍&#xff0c;在C语言中操作符主要有以下几种…

VS工程加载失败 | 找不到导入的项目CUDA xx.props解决方案

问题背景&#xff1a; 如果遇到VS项目某些工程无法加载&#xff0c;有一个可能的原因是属性表没有找到。即props文件无法加载&#xff0c;导致项目加载失败。 解决方案&#xff1a; 找到工程配置 .vcxproj 文件&#xff0c;编辑打开&#xff0c;查找props&#xff0c;发现电脑…