MyBatis-Plus及多数据源入门教程

开发环境配置

JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2、MySQL 8.0.34

框架介绍

MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis 是一款非常优秀的开源框架,用来简化数据库应用程序的开发,使开发人员能够专注于应用程序逻辑,而不必关注数据库和 SQL 语句细节

框架依赖

在 pom 文件中添加 MyBatis-Plus 、MySQL 依赖,如下:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.32</version>
            <scope>compile</scope>
        </dependency>

</dependencies>

开始使用

enity 层定义数据库实体类:
package com.zdxlz.lwq.enity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("grade")
public class Grade {
    @TableId
    private  int id;
    @TableField("p_id")
    private String p_id;
    @TableField("score")
    private int score;
    @TableField("level")
    private String level;

    public int getId() {
        return id;
    }

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

    public String getP_id() {
        return p_id;
    }

    public void setP_id(String p_id) {
        this.p_id = p_id;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }
}
注解详解

@TableName 表名注解,标识实体类对应的表

@TableId 主键注解,标识实体类主键字段

@TableField 字段注解,标识实体类非主键字段

更多注解参阅:注解 | MyBatis-Plus

重要说明:实体类所对应的数据库及表、字段应提前在 MySQL 中创建完毕,且名称、字段类型完全一致,并在 application.yml 中正确配置数据库信息,如下:

spring:
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.22.82:3306/my_db?useUnicode=true&useSSL=false
        username: root
        password: 123456
创建 Mapper

Mapper 是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),这些语句称为映射语句或者 SQL 映射语句。一个完整的 Mapper 映射器有Java 接口和 XML 文件(或注解)共同组成,它的作用包括:

  • 定义参数类型

  • 配置缓存

  • 提供 SQL 语句和动态 SQL

  • 定义查询结果和 POJO 的映射关系

具体介绍及使用可参阅:【Java ee】MyBatis核心配置——Mapper元素_mybatis映射文件中mapper元素_鸡兄长高了的博客-CSDN博客

为了简化开发,我们使用 MyBatis-Plus 提供的 Mapper 及一系列 SQL 接口,Mapper 实现如下:

package com.zdxlz.lwq.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zdxlz.lwq.enity.Grade;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface GradeMapper extends BaseMapper<Grade> {

}

Mapper 开发完毕后,需要在 Application 中增加 @MapperScan 注解,@MapperScan 注解用于扫描 Mapper 接口,并将其实例化后交给 Spring 容器管理,使得可以在其他组件中使用这些 Mapper 接口的实现类。如下:

@SpringBootApplication
@MapperScan("com.zdxlz.lwq.mapper")
public class SpringBootDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class,args);
    }
}
创建 Service

符合 Spring 开发 MVC 规范,创建 Service 层,在该层进行业务逻辑的具体实现

package com.zdxlz.lwq.service;

import com.zdxlz.lwq.enity.Grade;
import com.zdxlz.lwq.mapper.GradeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;

@Service
public class GradeService {
    @Autowired
    GradeMapper gradeMapper;
    public void insertMsg(String p_id,int score,String level){
        Grade grade=new Grade();
        grade.setP_id(p_id);
        grade.setScore(score);
        grade.setLevel(level);
        //插入一条新数据
        gradeMapper.insert(grade);
    }
    public void deleteMsgByID(int id){
        //根据主键删除数据
        gradeMapper.deleteById(id);
    }
    public void deleteMsgByMap(String key,String value){
        //根据条件删除数据
        Map<String,Object> map=new HashMap<>();
        map.put(key,value);
        gradeMapper.deleteByMap(map);
    }

}

各层详细说明见:Spring Boot项目中的Controller、Service、Mapper和Entity层的作用与联系_mapper层的作用_琴剑飘零西复东的博客-CSDN博客,MyBatis-Plus 的 Mapper 提供一系列的 CRUD 接口,方便我们快速开发、使用,相关接口使用参阅:CRUD 接口 | MyBatis-Plus

Controller 层操作数据库

在 Controller 中的自定义方法中操作数据库,代码如下:

   @Autowired
    private GradeService gradeService;
    @PostMapping("insertMsg")
    public String insertMsg(String p_id,int score,String level){
       gradeService.insertMsg(p_id,score,level);
       return "插入成绩:"+new Date();
    }

    @PostMapping("deleteMsgByID")
    public String deleteMsgByID(int id){
        gradeService.deleteMsgByID(id);
        return "删除成绩:"+new Date();
    }
    @PostMapping("deleteMsgByMap")
    public String deleteMsgByMap(String key,String value){
       gradeService.deleteMsgByMap(key,value);
        return "删除一组成绩:"+new Date();
    }

Postman 中发起网络请求,传递对应参数,即可完成数据库的相关操作

多数据源操作

dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的快速集成多数据源的启动器,框架只做切换数据源这件核心的事情,不限制你的具体操作,切换了数据源可以做任何 CRUD,详细介绍参阅:基础必读(免费) · dynamic-datasource · 看云

在 pom 文件中增加该框架依赖,版本选择参阅(版本记录和选择建议(免费) · dynamic-datasource · 看云):

<dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
     <version>3.5.2</version>
</dependency>

yml 文件配置数据库信息:

spring:
    datasource:
        dynamic:
            primary: db1 #设置默认的数据源或者数据源组,默认值即为master
            strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
            datasource:
                db1:
                    driver-class-name: com.mysql.cj.jdbc.Driver
                    url: jdbc:mysql://192.168.22.82:3306/order_db_1?useUnicode=true&useSSL=false
                    username: root
                    password: 123456
                db2:
                    driver-class-name: com.mysql.cj.jdbc.Driver
                    url: jdbc:mysql://192.168.22.82:3306/order_db_2?useUnicode=true&useSSL=false
                    username: root
                    password: 123456

定义数据库实体:

package com.zdxlz.lwq.enity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.math.BigDecimal;
import java.util.Date;

@TableName("t_order_1")
public class Order {
    @TableId
    private BigDecimal order_id;
    @TableField("price")
    private int price;
    @TableField("user_id")
    private int user_id;
    @TableField("status")
    private String status;
    @TableField("create_date")
    private Date create_date;

    public BigDecimal getOrder_id() {
        return order_id;
    }

    public void setOrder_id(BigDecimal order_id) {
        this.order_id = order_id;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Date getCreate_date() {
        return create_date;
    }

    public void setCreate_date(Date create_date) {
        this.create_date = create_date;
    }
}

创建 Mapper:

package com.zdxlz.lwq.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zdxlz.lwq.enity.Order;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OrderMapper extends BaseMapper<Order> {

}

创建 Service:

package com.zdxlz.lwq.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.zdxlz.lwq.enity.Order;
import com.zdxlz.lwq.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Random;

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    //插入默认数据源
    public void insertDB1(int price,int user_id){
        Order order=new Order();
        BigDecimal order_id=new BigDecimal(new Random().nextInt(999999));
        order.setOrder_id(order_id);
        order.setPrice(price);
        order.setUser_id(user_id);
        order.setStatus("SUCCESS");
        order.setCreate_date(new Date());
        orderMapper.insert(order);
    }

    //插入 DB2
    @DS("db2")
    public void insertDB2(int price,int user_id){
        Order order=new Order();
        BigDecimal order_id=new BigDecimal(new Random().nextInt(999999));
        order.setOrder_id(order_id);
        order.setPrice(price);
        order.setUser_id(user_id);
        order.setStatus("SUCCESS");
        order.setCreate_date(new Date());
        orderMapper.insert(order);
    }

}

注解说明:自定义方法未添加 @DS 注解,操作默认数据源,添加 @DS 注解,将操作指定数据源,详见:基础必读(免费) · dynamic-datasource · 看云

Controller 操作数据库:

   @Autowired
    private OrderService orderService;
    @PostMapping("insertDB1")
    public String insertDB1(int price,int user_id){
       orderService.insertDB1(price,user_id);
       return "插入默认数据库DB1:"+new Date();
    }

    @PostMapping("insertDB2")
    public String insertDB2(int price,int user_id){
        orderService.insertDB2(price,user_id);
        return "插入数据库DB2:"+new Date();
    }

测试验证:

使用 Postman 分别发起请求 insertDB1、insertDB2,请求完成后使用 MySQL 可视化工具,分别查看两个数据库的插入情况

开源项目地址:GitHub - liuweiqiang2016/SpringBootDemo: SpringBoot 框架入门学习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速了解Spring AOP的概念及使用

文章目录 1. AOP概念1.1 什么是AOP&#xff1f;1.2 什么是Spring AOP&#xff1f; 2. Spring AOP的使用2.1 引入Spring AOP依赖2.2 编写AOP程序 3. Spring AOP详解3.1 Spring AOP核心概念1. 切点&#xff08;Pointcut&#xff09;2. 连接点&#xff08;Join Point&#xff09;3…

C++ day37 贪心算法 单调递增的数字 监控二叉树

题目1&#xff1a;738 单调递增的数字 题目链接&#xff1a;单调递增的数字 对题目的理解 返回小于或等于n的最大数字&#xff0c;且数字是单调递增&#xff08;单调递增数字的定义&#xff1a;每个相邻位上的数字满足x<y&#xff09; 贪心算法 注意本题的遍历顺序是从…

【算法刷题】Day7

文章目录 283. 移动零1089. 复写零 283. 移动零 原题链接 看到题目&#xff0c;首先看一下题干的要求&#xff0c;是在原数组内进行操作&#xff0c;平切保持非零元素的相对顺序 这个时候我们看到了示例一&#xff1a; [ 0, 1, 0, 3,12 ] 这个时候输出成为了 [ 1, 3, 12, 0, …

16.spirng源码解析-registerBeanPostProcessors

注册拦截bean创建的bean处理器 此部分实质上是在BeanDefinitions中寻找BeanPostProcessor&#xff0c;之后调用BeanFactory.addBeanPostProcessor方法保存在一个List中&#xff0c;注意添加时仍然有优先级的概念&#xff0c;优先级高的在前面。

内测分发平台是否支持敏捷开发和持续集成?

大家好&#xff0c;我是咕噜-凯撒。敏捷开发和持续集成是软件开发中非常重要的流程和方法。内测分发平台作为应用开发和测试的关键环节需要具备这种能力。下面我简单的介绍一下敏捷开发和持续集成和提供的功能。图片来源&#xff1a;news.gulufenfa.com 敏捷开发是一种迭代、协…

在 The Sandbox 设置总部,SCB 10X 和 T-POP 为 4EVE 元宇宙音乐会揭幕

协作学习为全球粉丝提供了无限的可能性&#xff0c;让他们通过革命性的元宇宙体验沉浸在泰国流行文化中。 作为 SCBX 集团背后的创新力量&#xff0c;SCB 10X 很高兴宣布与 T-POP Incorporation 展开开创性合作&#xff0c;T-POP Incorporation 是泰国流行文化在全球舞台上的领…

leetcode算法之字符串

目录 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//法一&#xff1a;两两比较string ret strs[0];for(int i1;i<strs.size();i){ret f…

Ps:子路径的上下排列以及对齐与分布

不论是一个形状图层&#xff08;或图层的矢量蒙版&#xff09;上的多个形状还是同一路径层上多个路径&#xff0c;只要对应“路径”面板的一个路径层&#xff0c;可以将这些路径称为该路径层的“子路径”&#xff0c;也称为“组件”。 当一个路径层上有两个以上的子路径时&…

量子力学:科技前沿的探索与挑战

量子力学:科技前沿的探索与挑战 一、量子力学的魅力与挑战 量子力学是研究微观粒子如电子、光子等行为的物理学分支。与经典力学不同,量子力学描述了一个充满不确定性和概率性的世界。在这个世界里,粒子可以同时处于多个状态,只有当我们对其进行测量时,它才会“选择”一个…

【Python基础】爬取豆瓣电影Top250+爬取知乎专栏文章标题

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

xcode opencv

1、导入报错 Undefined symbols: linker command failed with exit code 1 (use -v to see invocation) 直接添加如下图内容即可

Spark_Spark高阶特性

wscg filter导致断链 Codegen 向量化 simdjson Orc Parquet 支持批量读取 spark本身对parquet支持比较好&#xff0c;因为parquet

服务器中深度学习环境的配置

安装流程 11.17 日&#xff0c;周末去高校参加学术会议&#xff0c;起因&#xff0c; 由于使用了某高校内的公共有线网络&#xff0c; 远程连接服务器后&#xff0c;黑客利用 ssh 开放的 22 端口&#xff0c; 篡改了主机的配置&#xff0c; 使得只要一连上网络&#xff0c; 服…

如何用Python批量删除视频的头尾(88)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 关注我&#xff0c;一起趣味学编程&#xff01; 今天我们继续用Python玩转视频。 还是用Python的第三方库moviepy。 如果你对此文章感兴趣的话&#xff0c;可以看看之前的…

跨越威胁的传说:揭秘Web安全的七大恶魔

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

nodejs669在线图书借阅管理系统vue前端

系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理用户模块、用户表模块、图书借阅模块、图书归还模块、图书分类模块、token表模块、收藏表模块、书籍信息模块、图书资讯模块、留言板模块、书籍信息评论表模块、注册用户模块、配置文件模块、处罚记录模块、在线客…

excel表格在线编辑(开源版)

文章目录 前言一、Luckysheetvue3vite 例子如有启发&#xff0c;可点赞收藏哟~ 前言 本文记录好用的开源在线表格 具体如图显示 另外记录下更名后的univer~&#xff0c;如下图&#xff08;有兴趣可自行详细了解&#xff09; univer 在线思维导图 一、Luckysheet 参考git…

从苹果到蔚来,「车手互联」网罗顶级玩家

作者 |Amy 编辑 |德新 汽车作为家之外的第二大移动空间&#xff0c;正与手机这一移动智能终端进行「车手互联」。 车手互联始于十年前的苹果CarPlay&#xff0c;一度成为时代弄潮儿&#xff0c;不断有后继者模仿并超越。时至今日&#xff0c;CarPlay2.0依旧停留在概念阶段&am…

idea社区版免费下载方式

1.访问中国区网站 下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 2.完成下载安装

【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…