14.从零开始学springboot-mybatis-多数据源-annotations注解方式

如何解决 java.lang.NoClassDefFoundError: org/apache/ibatis/annotations/Mapper...问题 | 亲测有效 记录:java.lang.NoClassDefFoundError: org/apache/ibatis/annotations/Mapper...【解决方案】 阅读详情

前言

上两章我们实现了springboot+mybatis基于annotations注解方式和mapper.xml方式对mysql的操作访问,那么springboot结合mybatis对多数据源的支持如何呢?答案是完全OK,本章我们就来实现 springboot-mybatis-多数据源-annotations注解方式的案例。

创建空项目

1.png

添加依赖

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

2.png

添加配置

application.yml:

spring:
  datasource:
    master:
      username: root
      password: 123456
      jdbc-url: jdbc:mysql://192.168.145.131:3306/test
      driver-class-name: com.mysql.cj.jdbc.Driver
    slave:
      username: root
      password: 123456
      jdbc-url: jdbc:mysql://192.168.145.131:3306/test2
      driver-class-name: com.mysql.cj.jdbc.Driver

建库

创建test、test2库
test:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) NOT NULL,
  `grade` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

test2:

CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) NOT NULL,
  `course` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


完善

目录结构
3.png

根据目录结构,请自行创建package和class。

config/MasterConfig

package com.mrcoder.sbmmultidbannotations.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.mrcoder.sbmmultidbannotations.mapper.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterConfig {

    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "masterSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

config/SlaveConfig

package com.mrcoder.sbmmultidbannotations.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.mrcoder.sbmmultidbannotations.mapper.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaveConfig {

    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

entity/Student

package com.mrcoder.sbmmultidbannotations.entity;
import java.io.Serializable;

public class Student implements Serializable {
    private int id;

    private String name;

    private int age;

    private int grade;

    public Student() {
    }

    public Student(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", grade=" + grade +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
}

entity/Teacher

package com.mrcoder.sbmmultidbannotations.entity;
import java.io.Serializable;

public class Teacher implements Serializable {

    private int id;
    private String name;
    private int age;
    private int course;

    public Teacher() {
    }

    public Teacher(String name, int age, int course) {
        this.name = name;
        this.age = age;
        this.course = course;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", course='" + course + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getCourse() {
        return course;
    }

    public void setCourse(int course) {
        this.course = course;
    }
}

mapper/master/StudentMapper

package com.mrcoder.sbmmultidbannotations.mapper.master;
import com.mrcoder.sbmmultidbannotations.entity.Student;
import org.apache.ibatis.annotations.*;
import java.util.List;

public interface StudentMapper {
    @Select("SELECT * FROM student")
    List<Student> getList();

    @Select("SELECT * FROM student WHERE id = #{id}")
    Student getById(int id);

    @Insert("INSERT INTO student(age,grade,name) VALUES(#{age}, #{grade}, #{name})")
    void insert(Student student);

    @Update("UPDATE student SET name=#{name},age=#{age}, grade=#{grade} WHERE id =#{id}")
    void update(Student student);

    @Delete("DELETE FROM student WHERE id =#{id}")
    void delete(int id);
}

mapper/slave/TeacherMapper

package com.mrcoder.sbmmultidbannotations.mapper.slave;
import com.mrcoder.sbmmultidbannotations.entity.Teacher;
import org.apache.ibatis.annotations.*;
import java.util.List;

public interface TeacherMapper {
    @Select("SELECT * FROM teacher")
    List<Teacher> getList();

    @Select("SELECT * FROM teacher WHERE id = #{id}")
    Teacher getById(int id);

    @Insert("INSERT INTO teacher(age,course,name) VALUES(#{age}, #{course}, #{name})")
    void insert(Teacher teacher);

    @Update("UPDATE teacher SET name=#{name},age=#{age}, course=#{course} WHERE id =#{id}")
    void update(Teacher teacher);

    @Delete("DELETE FROM teacher WHERE id =#{id}")
    void delete(int id);
}

controller/CurdController

package com.mrcoder.sbmmultidbannotations.controller;
import com.mrcoder.sbmmultidbannotations.entity.Student;
import com.mrcoder.sbmmultidbannotations.entity.Teacher;
import com.mrcoder.sbmmultidbannotations.mapper.master.StudentMapper;
import com.mrcoder.sbmmultidbannotations.mapper.slave.TeacherMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class CurdController {

    @Autowired
    private StudentMapper studentMapper;

    @Autowired
    private TeacherMapper teacherMapper;

    @RequestMapping("/students")
    public List<Student> getStudentList() {
        List<Student> studentList = studentMapper.getList();
        return studentList;
    }

    @RequestMapping("/teachers")
    public List<Teacher> getTeacherList() {
        List<Teacher> teacherList = teacherMapper.getList();
        return teacherList;
    }
}

运行

http://localhost:8080/students 访问master数据源(test库)读取student表
http://localhost:8080/teachers 访问slave数据源(test2库)读取teacher表

项目地址

https://github.com/MrCoderStack/SpringBootDemo/tree/master/sbm-multidb-annotations

https://gitee.com/MrCoderStack/SpringBootDemo/tree/master/sbm-multidb-annotations

请关注我的订阅号

订阅号.png

mybatis generator 生成 annotations mapper 生成 mybatis 注解类型的mapper 工具 立即下载

相关推荐

ABP多租户实现

abp会调用ITenantStore.Find(Guid)方法去查tenant是否存在。要骗过abp就得自己实现ITenantStore并替换原来的实现。abp会自动解jwt里的tenant id,并且尝试验证它。这时候我们之前实现的ITenantStore就可以骗过abp。你要不想骗它也成,反正这个类是可以依赖注入的,你爱咋验证就咋验证。不用open id dict,只用jwt,让abp轻起来。在原来生成jwt的地方加入tenantId。module上也要加DependsOn。

m0_46704355的博客 470

Mybatis基本原理及整合Spring

Mybatis基本原理及整合Spring MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 MyBatis 以及与Spring的整合过程中需要解决以下问题 xml文件中的sql语句如何与接口映射 mappe

weixin_43519121的博客 327

M6 Mac mini涨价2500值不值?深度拆解硬件成本与购买决策

统一内存架构将CPU、GPU和内存封装在一起,通过共享高带宽内存池提升数据交换效率,尤其适合本地AI推理和视频渲染等场景。在苹果生态中,起步内存和存储的配置直接决定设备生命周期,因为后期无法自行升级。M6 Mac mini将起步内存从16GB提升至24GB、存储从256GB提升至512GB,同时芯片制程和GPU核心数均有升级,持续负载性能保持率明显改善。对于开发者、内容创作者和本地大模型推理用户,这些变化能转化为实际效率收益;而轻度办公用户则可能面临性能冗余。理解硬件成本结构与自身工作流需求,才能判断这25

weixin_30846347的博客 264

spring、mybatis实现数据库多数据源和多数据源事务

多数据源就是在一个程序服务里面,需发连接多个数据库。动态数据源在多数据源的基础上,要实现数据源的动态切换。这两种复杂系统的数据库联接有相关性,也有不同应用场景的区别。如要连接两个不同的业务库,一般会使用多数据源,如要动态切换不同数据源的相同业务库,会选择使用动态数据源。分布式事务要支持多数据源的事务,只能用JTA事务管理(没用过 -_-||),而且应用服务器还不能是Tomcat(一直在用tomca...

前G厂程序员/架构/产研经理,AI 进化派,一线 OPC 实践者。 持续分享编程、职场、AI、副业/创业干货~ 5009

用Python+OpenCV搞定线激光相机标定:从棋盘格到3D点云的保姆级实战

本文详细介绍了使用Python和OpenCV进行线激光相机标定的全流程实战,从硬件准备到3D点云重建。涵盖相机内参标定、激光平面方程拟合、三维重建等关键技术,提供完整的代码实现和工程优化建议,帮助开发者实现毫米级精度的工业检测和三维测量系统。

weixin_29227425的博客 281

手把手教你在VirtualBox里复活Win98,并搞定驱动和文件传输(含资源寻找攻略)

本文详细指导如何在VirtualBox中安装和配置Windows 98,包括驱动安装、文件传输等实用技巧。通过逐步教程和资源寻找攻略,帮助技术爱好者完美复刻这一经典操作系统,满足怀旧或兼容性测试需求。

weixin_29596051的博客 324

org.mapstruct.Mapper与org.apache.ibatis.annotations.Mapper

1、org.mapstruct.Mapper: 这是 MapStruct 映射框架提供的注解,用于标记接口或抽象类为 MapStruct 的映射器接口 2、org.apache.ibatis.annotations.Mapper: 这是 MyBatis 持久层框架提供的注解,用于标记接口为 MyBatis 的映射器接口

xu_xin96的博客 1403

小白的MatSWMM使用心路(二)——用matlab修改INP文件参数/使用matlab查找txt内容并修改多行内容

说是修改inp,但是里面的内容大部分还是讲怎么修改txt的……(?)。包含如何找到需要的参数(关键字)位置,以及修改那个位置的txt这样的内容。希望能帮助大家吧……Matlab你要多出好用的功能啊!

weixin_44276743的博客 4530

@org.apache.ibatis.annotations.Mapper 中的 Mapper 异常 Invalid bound statement (not found)

问题描述 引入注解 @org.apache.ibatis.annotations.Mapper 中的 Mapper 异常标红 Invalid bound statement (not found)。 mapper 内容如下: import com.demo.zhulong.base.beans.Images; import tk.mybatis.mapper.common.Mapper; ...

HeyShHeyou的博客 6823

YOLOv8改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLOv8 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 351

万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

杨秀璋的专栏 2万+

springboot项目配置多数据库连接

以上基于springboot多数据库连接的项目我是重新新建项目后一步步验证后发出来的。测试有效。如果后续有更完善的内容,将会在这边进行更新出来。希望能帮助到大家。

m0_67402096的博客 1653

Qt C++ 电子海图与作战叠加(Overlay)系统

lab_pos->setText(QString("坐标: X%1 Y%2").arg(p.x(),0,'f',0).arg(p.y(),0,'f',0));lab_distance->setText(QString("距离: %1 海里").arg(dist,0,'f',1));lab_bearing->setText(QString("方位: %1°").arg(bear,0,'f',1));// 绘制S-57海图基底。scene->addText("封锁线").setPos(450,180);

寒寒豆豆软件公司的博客 496

SpringBoot踩坑记录--org.mybatis.spring.annotation

SpringBoot踩坑记录--org.mybatis.spring.annotation 在IDEA_2021上运行SpringBoot项目时,包是正常导入的_执行方法编译时报程序包org.mybatis.spring.annotation不存在。 后来我注释掉pom.xml文件中热部署部分,项目就能正常启动了。 但是在后来的项目中,即使包含热部署部分,好像也没有影响。搞不懂。。。。 ...

河山入梦来的博客 2087

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring:spring与mybatis的整合(纯注解)

MyBatisAutoConfiguration: package com.baizhiedu.mybatis; import com.alibaba.druid.pool.DruidDataSource; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context...

dengfengling999的博客 2458

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

学习java遇到的问题

java基础学习过程中遇到的问题

qq_43596356的博客 1448

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java: 程序包org.mybatis.spring.annotation不存在

java: 程序包org.mybatis.spring.annotation不存在 clean->install

qq_39733939的博客 1万+

java: 无法访问org.mybatis.spring.annotation.MapperScan

解决该问题,之前使用的Mybatis-spring依赖的版本3.0.1太高,将版本改为2.2.2,使用maven重新reload project,再次编译,该问题被解决。

S852509769的博客 6784

Error:(3,37) java: 无法访问org.mybatis.spring.annotation.MapperScan

这个项目我是在2022版建的,然后jdk17配置什么的都用的最新版,所以不加这个也起来了,但是我笔记本上的IDEA是2019版的,配置什么的我也往低了调。我还没有去同步我的数据库 ,修改了application.properties中关于数据库的配置适配我本机上的数据库后。编译的时候不通过,原因是我因为版本太高了,我换了个低的版本编译就没问题了。加进去之后就ok了,不知道是不是因为我IDEA版本的问题,如果没有看到target,就是隐藏了,这么点就出来了。然后我就对照了之前的项目,然后发现少了这个配置。

weixin_51315942的博客 6762

Spring系列第53篇:Spring集成MyBatis

1、本文内容【文末送书】本文主要介绍mybatis和spring集成的两种方式,对MyBatis不熟悉的,建议先看一下MyBatis高手系列目前注解的方式我们用的比较多,所以主要介绍注解...

路人甲Java 4650

IDEA导入项目的时候报错 找不到 org.mybatis.spring.annotation

IDEA导入项目的时候报错 一开始去网上找了很多办法 都没有解决,然后把鼠标放到红字上,根据提示ADD…然后居然可以了 谢天谢地。

weixin_43871692的博客 1万+

AnnotationFormatError : org.mybatis.spring.annotation.MapperScan.factoryBean

声明下,报这个错的原因可能很多,这个可能只是其中的原因之一,大家可以试下看看自己是不是这个原因。 SpringBoot集成MybatisPlus,启动的时候总是报如下错误: java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.mybatis.spring...

jiang_zf的博客 1万+

Spring与Mybatis整合,注解开发

注解开发,事务处理,Mapper.xml文件

m0_70156589的博客 341

还不会用mybatis-plus,手把手教你

本文主要介绍mybatis-plus这款插件,针对springboot用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。 本文项目代码gitee地址:gitee.com/wei_rong_xi… 关于mybatis-plus是什么,不多做介绍了,看官方文档:baomidou.com/,咱们直接代码撸起来。 一、快速开始 本文基于springboot、maven、jdk1.8、mysql开发,所以开始前我们需要准备好这套环境。我的环境使用了nacos作为.

m0_66491772的博客 1511

SpringBoot mybatis基于注解的方式实现多数据源配置

SpringBoot mybatis基于注解的方式实现多数据源配置第一步 修改配置文件第二步:实现基于注解数据源动态切换第三步:禁止springboot自动注入数据源配置项目地址(包含数据库): 当项目需要使用到两个或多个数据源时,就需要采用多数据源配置了 第一步 修改配置文件 spring: datasource: dbcp1: #第一个数据源 driver_class_name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysq

weixin_42254034的博客 1373
上一篇: 19.从零开始学springboot-jdbc-atomikos多数据源分布式事务案例
下一篇: 15.从零开始学springboot-mybatis-多数据源-xml方式
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值