SSM学习10:整合MyBatis、MyBatisPlus

news2025/1/11 14:26:13

SpringBoot整合MyBatis

与创建spring web项目类型,添加上相应依赖
在这里插入图片描述
实体类

public class Account {
    private int id;

    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 double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    private String name;
    private double money;
}

接口

@Mapper
public interface AccountDao {
    @Select("select * from account where id = #{id}")
    public Account getAccount(int id);
}

@Mapper 注解主要用于标记数据访问层(DAO 层或称为 Mapper 层)的接口。这个注解是 MyBatis 框架的一部分,用于与 Spring 框架集成时自动创建这些接口的实现类,并将其作为 Bean 注入到其他需要的地方。

数据库配置
resources/application.yml

# 数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123abc!@#

测试类中运行

@SpringBootTest
class BootMpApplicationTests {

    @Autowired
    private AccountDao accountDao;

    @Test
    void contextLoads() {
        Account account = accountDao.getAccount(1);
        System.out.println(account.getName());
    }
}

在这里插入图片描述

MyBatisPlus

简介

MyBatisPlus是基于Mybatis框架基础上开发的增强型工具,用于简化开发、提高效率。

项目搭建

在上面项目的基础上添加对应的依赖,在dependencies中添加

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

AccountDao2.class

// 需要使用mybatis-plus提供的的BaseMapper
@Mapper
public interface AccountDao2 extends BaseMapper<Account> {
}

测试类中运行

@SpringBootTest
class BootMpApplicationTests {

    @Autowired
    private AccountDao accountDao;

    @Autowired
    private AccountDao2 accountDao2;

    @Test
    void contextLoads() {
        Account account = accountDao.getAccount(1);
        System.out.println(account.getName());

        // 使用mybatis-plus提供的方法
        Account account1 = accountDao2.selectById(1);
        System.out.println("使用mybatis-plus获取:" + account1.getName());
    }

}

在这里插入图片描述

补充
使用lombok简化实体类,在pom.xml中添加

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
</dependency>

简化前:

public class Account {
    private int id;

    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 double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    private String name;
    private double money;
}

简化后

@Getter
@Setter
@ToString
public class Account {
    private int id;
    private String name;
    private double money;
}

或者

@Data
public class Account {
    private int id;
    private String name;
    private double money;
}

@Data 为当前实体类在编译期设置对应的get/set方法,无惨/有惨 构造方法,toString方法等

分页功能

配置
config/MpConfig .class

@Configuration
public class MpConfig {
    // 设置mybatis-plus的分页功能
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        // 1、创建拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 2、添加分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

使用

// 设置当前页码和每页显示的条数
 IPage page = new Page(1, 2);
 accountDao2.selectPage(page, null);
 System.out.println("总页:" + page.getPages());
 System.out.println("总条数:" + page.getTotal());

在这里插入图片描述
在控制台开始执行日志

application.yml

# 开启日志输出(输出到控制台)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

条件查询

mybatis-plus将书写复杂的sql查询条件进行了封装,使用编程的形式完成查询条件的组合

QueryWrapper

QueryWrapper qw = new QueryWrapper();
// 查询金钱大于1000的
qw.gt("money", 1000);
List<Account> list = accountDao2.selectList(qw);

System.out.println("总条数是:" + list.size());

在这里插入图片描述

lambda表达式方式

QueryWrapper<Account> qw = new QueryWrapper();
// 查询金钱大于1000的
qw.lambda().gt(Account::getMoney, 1000);
List<Account> list = accountDao2.selectList(qw);

System.out.println("总条数是:" + list.size());

或者

LambdaQueryWrapper<Account> qw = new LambdaQueryWrapper<>();
qw.gt(Account::getMoney, 1000);
List<Account> list = accountDao2.selectList(qw);

System.out.println("总条数是:" + list.size());
LambdaQueryWrapper<Account> qw = new LambdaQueryWrapper<>();
// 多条件查询,查询金额大于1000并且姓名为张三
qw.gt(Account::getMoney, 1000)
        .eq(Account::getName, "张三");
List<Account> list = accountDao2.selectList(qw);

System.out.println("总条数是:" + list.size());

在这里插入图片描述
查询投影

用于指定查询时返回哪些字段

LambdaQueryWrapper<Account> qw = new LambdaQueryWrapper<>();
// 查询投影,只查询name和money
qw.select(Account::getName, Account::getMoney);
List<Account> list = accountDao2.selectList(qw);

System.out.println("总条数是:" + list.size());

或者

QueryWrapper<Account> qw = new QueryWrapper<>();
 // 查询投影,只查询name和money
 qw.select("id", "money");
 List<Account> list = accountDao2.selectList(qw);

 System.out.println("总条数是:" + list.size());

在这里插入图片描述

映射匹配兼容

表字段与编码属性设计不同步
正常情况下实体类中的属性名与数据库中的字段名称时一致的。但也会出现不一致的情况,这时候可以使用TableField去进行关联

public class User{
    @TableField(value = "username")
    private String name;
    
    private int age;
}

编码中添加了数据库中未定义的属性
数据库中不需要改字段,但是实体类中需要该属性

public class User{
    @TableField(value = "username")
    private String name;
    
    private int age;
    
    // 该字段,表中不存在
    @TableField(exist = false)
    private int isOnline;
}

设置属性是否参与查询

// 查询数据时不返回密码
@TableField(select = false)
private String password;

数据库表名与实体类类名不一致

@TableName("t_user")
public class User{}

id生成策略

public class Account {
    // 使用雪花算法生成id
    @TableId(type = IdType.ASSIGN_ID)
    private int id;
}
  • AUTO:使用数据库id自增控制id的生成
  • NONE:不设置id生成策略
  • INPUT:用户手工输入
  • ASSIGN_ID:雪花算法生成id
  • ASSIGN_UUID:以UUID生成算法作为id生成策略

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

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

相关文章

word打印---doc转html后进行打印,window.print、print-js、vue-print-nb

提示&#xff1a;word预览方式—插件 文章目录 [TOC](文章目录) 前言一、vue-office-docx把docx转换html二、调取window.print三、print-js四、vue-print-nb总结 前言 word预览 一、vue-office-docx把docx转换html npm install vue-office-docx -S-DofficeDocx.vue <templ…

Meta发布最新图形分割模型SAM 2:实时视频分割性能大幅提升

Meta发布最新图形分割模型SAM 2:实时视频分割性能大幅提升 在人工智能领域,图形分割是一项重要的技术,它能够识别和提取图像或视频中的目标对象。Meta近期发布的SAM 2(Segment Anything 2)模型在这一领域取得了重大突破。本文将详细介绍SAM 2的创新之处及其在视频对象实时…

vue3学习day02-组合式API-setup选项、reactive(将非响应式数据变为响应式数据)、computed(基本思想和vue2一致)、watch

6、setup选项 &#xff08;1&#xff09;setup选项的执行时机&#xff08;获取不到this&#xff0c;this是undefined&#xff09;&#xff1a;beforeCreate函数之前&#xff0c;自动执行 &#xff08;2&#xff09;写法 1&#xff09;原始写法 需要返回 ①在script中导出s…

【DeepSeek-V2 技术要点介绍】

DeepSeek-V2 是一款基于 Transformer 架构的先进模型&#xff0c;其中每个Transformer块由一个注意力模块和一个前馈网络&#xff08;FFN)组成。然而&#xff0c;对于注意力模块和 FFN&#xff0c;研究团队设计并采用了创新的架构。旨在通过创新的设计提升推理和训练效率。以下…

行为验证码的分类推荐

行为验证码 行为验证码是一种用于确认用户身份或验证用户行为的技术手段&#xff0c;通常用于防止自动化程序&#xff08;例如机器人&#xff09;对网站或应用程序进行恶意操作。它的核心思想是通过要求用户执行特定的交互动作来验证其为真实的人类 是一种通过用户的操作行为…

SDK 多版本管理控制利器 SDKMAN 介绍及使用

一、SDKMAN 假如你同时参与了一个使用JDK 8的项目和一个采用JDK 17特性的项目。每次在两个项目之间切换时&#xff0c;你都面临着版本冲突的问题。如果有那么一个工具类似于 Python 中的 anaconda 工具&#xff0c;可以帮助你管理不同版本的 SDK &#xff0c;是不是非常有用&a…

【32单片机篇】项目:LCD实时显示温湿度

一、项目需求 使用 ESP8266 连接 OneNET 云平台&#xff0c;并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、硬件部分 四、项目源码及实现 1.项目源码 https://gitee.com/GeekerGao/upload-the-temperature-and-humidity-to-OneNET 2.项目实现

C语言 之 理解数组(8)数组和指针相关的题目 详细解答 快来观看

文章目录 1. 数组和指针相关题1.1 一维数组1.2 字符数组代码1代码2代码3代码4代码5代码6 1.3 二维数组 1. 数组和指针相关题 这里主要讲解的是通过sizeof和strlen来对数组和指针进行更深入的一些了解&#xff0c;建议有兴趣与初学者可以先尝试自己思考来完成。 1.1 一维数组 …

GPT-Pilot —— 让AI来写代码

1.概述 什么是GPT-Pilot&#xff1f; 一个AI开发者伴侣&#xff0c;可以从0开始构建应用程序&#xff0c;可以自己编写代码、配置开发环境、管理开发任务、调试代码。 项目地址&#xff1a;https://github.com/Pythagora-io/gpt-pilot 不仅仅是一个自动完成功能或 PR 消息的助…

CSP-J 2022 读程题16.答案与解析

知识点 普及 逻辑运算 16. 01 #include <iostream> 02 03 using namespace std; 04 05 int main() 06 { 07 unsigned short x, y; 08 cin >> x >> y; 09 x (x | x << 2) & 0x33; 10 x (x | x << 1) & 0x55; 11 y (y …

常见离线语音识别模块功能说明——天问ASR;机芯智能;海凌科;轻语音

本文章从开发方式及功能等方面上进行说明&#xff0c;便于开发者进行选择与开发。 本文章依据截至2024年8月1日各网站资料进行整理编写。 总结&#xff1a; 开发方式上&#xff1a; 天文ASR 有着最灵活的开发方式&#xff0c;可完全按照程序员意愿进行开发&#xff0c;同时有…

零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级

目录 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 一、进程状态 二、僵尸和孤儿进程 1、僵尸进程 Z&#xff08;zombie&#xff09; 2、孤儿进…

[012-1].第12节:Mysql的配置文件的使用

6.配置文件的使用 6.1.配置文件的格式 1.查看配置文件&#xff1a;vim /etc/my.cnf 2.在配置文件中华定义了很多组&#xff0c;组名就分别是server&#xff0c;mysqld&#xff0c;mysqld_safe,client,mysql,mysqladmin&#xff0c;每个组下面就可以定制很多启动项&#xff1b…

scrapy框架2

scrapy框架2 一、中间件 &#xff08;下载中间件&#xff09; 利用中间件加cookie 案例&#xff1a;登录以后下载豆瓣的电影信息 def get_cookie_dict():cookie_str登陆后的cookiecookie_dict{}for item in cookie_str.split(";"):key,valueitem.split(""…

遇到缓存问题

问题&#xff1a;在事务中在进行数据库查询所有的数据后&#xff0c;将其中的数据更改几个后&#xff0c;重新进行查询。发现此时返回的数据并不是修改之后的数据。 经过学习后发现是Mybatis的一级缓存问题,同时也了解的Mybatis的二级缓存&#xff1a; Mybatis一级缓存: 当在…

SpringCloud网关 SpringBoot服务 HTTP/HTTPS路由/监听双支持

背景 一般来说SpringCloud Gateway到后面服务的路由属于内网交互&#xff0c;因此路由方式是否是Https就显得不是那么重要了。事实上也确实如此&#xff0c;大多数的应用开发时基本都是直接Http就过去了&#xff0c;不会一开始就是直接上Https。然而随着时间的推移&#xff0c…

WebGoC题解(16) 386.山洞

题目描述 小C和弟弟一起参观影视城&#xff0c;发现里面有m个圆形排列的“小山洞”&#xff0c;山洞用半径20、颜色号为编号的圆表示&#xff0c;由边长是100的线连接&#xff0c;均匀的发布一圈&#xff08;1号洞在正上方&#xff09;。m为8时如下图&#xff1a; 小C跟弟弟提议…

点赞10W+,销售额上百万,如何搭上奥运的流量快车?

2024巴黎奥运会正如火如荼进行中。一边是紧张的赛事与各种抓马事情&#xff0c;一边是法国的浪漫与中国00后的松弛&#xff0c;这届奥运会的看客仿佛瓜田里的猹&#xff0c;忙得不可开交。 作为全球范围内的重大体育盛事&#xff0c;奥运会一直以来都备受公众的热烈关注。 据腾…

Python PDF处理技巧 - 加密和解密PDF

目录 安装Python PDF库 使用Python加密PDF 使用Python设置PDF的安全权限 使用Python解密PDF PDF文档在我们的个人生活和工作中扮演着重要角色。从机密的商业报告到敏感的个人记录&#xff0c;PDF广泛应用于存储和共享重要信息。然而&#xff0c;随着数据泄露和未经授权访问…

facebook脸书登入协议分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;若有侵权&#xff0c;请添加&#xff08;wx&#xff1a;wyqlxl99&#xff09;联系删除 前言: 前段…