当前位置: 首页 > news >正文

使用Mybatis Plus进行DAO层开发

一、特性

Mybatis应该大家现在都知道,而且在项目中都在使用,因为这块ORM框架让大家能专心业务SQL的编写,数据库的连接,连接池的使用都不用关心,极大的提高了生产效率。

今天要给大家介绍的另外一款ORM框架,是Mybatis Plus,这块工具正如其官网说的:

1)润物无声

只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。

2)效率至上

只需简单配置,即可快速进行单表CRUD操作,从而节省大量时间。

3)丰富功能

代码生成、自动分页、逻辑删除、自动填充功能。

二、实战

1)相关依赖

还等什么,赶紧在项目中使用吧。

如果你的项目中已经能够通过正常访问Mysql数据库,那就非常简单,只需要下面依赖即可。

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

如果你是刚开始学习,那么数据库访问这块就必须加上这些依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

2)常用注解

接下来就需要在数据库建个表,如果你有表了那更方便,直接开始建实体类,现在以Order订单表为例:

@TableName("`order`")
public class Order implements Serializable {@TableId(type = IdType.AUTO)private Integer orderNo;private String prodName;private Float prodPrice;private Integer prodNum;public Integer getOrderNo() {return orderNo;}public void setOrderNo(Integer orderNo) {this.orderNo = orderNo;}public String getProdName() {return prodName;}public void setProdName(String prodName) {this.prodName = prodName;}public Float getProdPrice() {return prodPrice;}public void setProdPrice(Float prodPrice) {this.prodPrice = prodPrice;}public Integer getProdNum() {return prodNum;}public void setProdNum(Integer prodNum) {this.prodNum = prodNum;}@Overridepublic String toString() {return "Order{" +"orderNo=" + orderNo +", prodName='" + prodName + '\'' +", prodPrice=" + prodPrice +", prodNum=" + prodNum +'}';}
}

这里需要重点讲下,这个实体类用到了Mybatis Plus提供的两个注解:

@TableName

这个注解里面需要填的是表的名称,因为order和MySQL的关键字冲突了,因为需要额外再加一个单引号,否则后面执行程序会报错,如果你是正常的业务表名,不需要额外加单引号。

@TableId

这里针对主键字段需要加这个,表示其注解,类型可以根据数据库的实际情况选择,例如自增长就和我选一样。

3)接口定义

到这里,如果是Mybatis就需要写xxMapper.xml文件和一个xxDao的mapper接口类,今天我们使用的是Mybatis Plus,只需要写一个mapper接口类一步搞定。

@Repository
public interface OrderMapper extends BaseMapper<Order> {
}

这里就是官网提到的效率至上:只需简单配置,即可快速进行单表CRUD操作,从而节省大量时间。

下面我们就使用一下,看怎么访问数据库的。比如从订单表里捞取商品名称是apple的订单:

LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Order::getProdName, "apple");
List<Order> orderList = orderMapper.selectList(queryWrapper);
orderList.forEach(o -> System.out.println(o));

是不是非常简单,如果大家想知道基类,也就是BaseMapper里面提供了哪些操作,大家可以自己进入源码看看,总是单个插入、单个查询、批量查询、删除、更新、分页查询都有了。

3.1)LambdaQueryWrapper 和 QueryWrapper的区别

上面的代码中展示了LambdaQueryWrapper的使用方式,下面再用QueryWrapper实现同样的功能:

QueryWrapper<Order> queryWrapper = new QueryWrapper();
queryWrapper.eq("prod_name", "apple");
List<Order> orderList = orderMapper.selectList(queryWrapper);
orderList.forEach(o -> System.out.println(o));

LambdaQueryWrapper可以使用表对应的实体类直接调用get方法获取列名,而QueryWrapper只能填列名字符串,这样如果表有修改,很难知道哪些地方用到了此列名,会造成遗漏。

3.2)分页查询

分页查询要注意的是不能直接用BaseMapper里面的selectPage方法,需要在配置类中引入Page拦截器,这里推荐官方的拦截器。

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfiguration {/*** 新增分页拦截器,并设置数据库类型为mysql*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

写一个测试类跑一跑

@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderMapper orderMapper;@RequestMapping("/page")public Page<Order> queryPage(@RequestParam("num") Integer pageNum,@RequestParam("size") Integer pageSize){Page<Order> page = new Page(pageNum, pageSize);LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();Page page1 = orderMapper.selectPage(page, queryWrapper);return page1;}
}
{"records": [{"orderNo": 1,"prodName": "apple","prodPrice": 3.6,"prodNum": 3}, {"orderNo": 2,"prodName": "apple","prodPrice": 3.8,"prodNum": 4}, {"orderNo": 3,"prodName": "pear","prodPrice": 7.5,"prodNum": 2}, {"orderNo": 4,"prodName": "pear","prodPrice": 7.2,"prodNum": 3}],"total": 6,"size": 4,"current": 1,"orders": [],"optimizeCountSql": true,"searchCount": true,"countId": null,"maxLimit": null,"pages": 2
}

三、总结

今天这篇文章的重点是介绍mybatis-plus这块效率工具,希望大家都能尽快的在项目中使用,有什么问题大家相互交流,这样才能提高。

相关文章:

使用Mybatis Plus进行DAO层开发

一、特性 Mybatis应该大家现在都知道&#xff0c;而且在项目中都在使用&#xff0c;因为这块ORM框架让大家能专心业务SQL的编写&#xff0c;数据库的连接&#xff0c;连接池的使用都不用关心&#xff0c;极大的提高了生产效率。 今天要给大家介绍的另外一款ORM框架&#xff0…...

Android中如何不编译源生模块

如果想让自己的app 替换系统的app 比如使用闪电浏览器替换系统的Browser 首先把闪电浏览器放到 vendor/rockchip/common/apps Android.mk LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE : Lightning LOCAL_SRC_FILES : $(LOCAL_MODULE).apk LOCAL_MODULE_C…...

安装Vue_dev_tools

Vue控制台出现Download the Vue Devtools extension for a better development experience: 下载Vue_dev_tools,这里给出网盘链接&#xff0c;有Vue2和Vue3的&#xff0c;dev_tools 以Google浏览器为例 点击设置&#xff08;就是那三个点&#xff09;->扩展程序->管理扩…...

【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)

【数据结构入门指南】二叉树顺序结构: 堆及实现&#xff08;全程配图&#xff0c;非常经典&#xff09; 一、前言&#xff1a;二叉树的顺序结构二、堆的概念及结构三、堆的实现&#xff08;本篇博客以实现小堆为例&#xff09;3.1 准备工作3.2 初始化3.3 堆的插入3.3.1 向上调…...

css实现三角形的几种方法

css实现三角形的方法&#xff1a;1、使用边框实现三角形&#xff0c;利用透明边框和实色边框的组合&#xff0c;可以创建不同方向和大小的三角形&#xff1b;2、使用伪元素实现三角形&#xff0c;通过使用伪元素来创建一个占据父元素一半大小的实心三角形&#xff1b;3、使用tr…...

❤ Vue工作常用的一些动态数据和方法处理

❤ Vue工作常用的一些动态数据和方法处理 &#xff08;1&#xff09;动态拼接相对路径结尾的svg 错误写法一 ❌ 正确写法 &#x1f646; <img :src"require(/assets//amazon/svg/homemenu${index}.svg)" style"height: 20px;display: block;margin: 0 au…...

SQLite的命令用法

学习数据库直达网站 https://www.runoob.com/sqlite/sqlite-tutorial.html&#xff08;菜鸟教程&#xff09; 这里只分享&#xff0c;基础操作&#xff0c;数据库创建打开……等等 用到查菜鸟教程即可 文章目录 学习数据库直达网站创建一个数据库方式1方式2 创建一个表格插入一…...

在jupyter notebook中使用海龟绘图

首先&#xff0c;安装ipyturtle3 ref:ipyturtle3 PyPI pip install ipyturtle3然后&#xff0c;安装ipycanvas ipycanvas是一个需要安装在与JupyterLab实例相同环境的包。此外&#xff0c;您需要安装nodejs&#xff0c;并启用JupyterLab ipycanvas小部件。 所有这些都在ipy…...

密码学学习笔记(十八):Diffie–Hellman (DH) 密钥交换

DH算法是第一个密钥交换算法&#xff0c;也是第一个得到形式化描述的公钥密码算法。 群论 DH密钥交换算法基于数学中的群论&#xff0c;群论也是当今大多数公钥密码的基础。 要使集合及其运算成为一个群&#xff0c;需要满足以下性质&#xff1a; 封闭性&#xff1a;群中两…...

Linux —— 进程间通信(管道)

目录 一&#xff0c;进程间通信 二&#xff0c;管道 匿名管道 命名管道 一&#xff0c;进程间通信 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;&#xff0c;即在不同进程之间进行信息的传播或交换&#xff1b;由于一般进程用户地址空间是…...

python常用

环境配置 conda Conda自动补全 在终端激活conda环境的时候按tab不能自动补全activate和环境名。安装后可用tab进行补全。 安装 conda-bash-completion 插件&#xff1a;GitHub 安装方法&#xff1a; conda install -c conda-forge conda-bash-completion常用命令 #创建虚拟…...

jeecg如何创建报表并配置到菜单中

当使用jeecg创建单表之后,需要进行报表显示,并把报表配置到菜单中,该如何操作呢?下面进行详细讲解。这里以课程表这张表为例进行讲解。 一.表单创建完成,并配置好菜单栏。具体步骤略,如下图: 二.创建积木报表 1.左侧边栏展开低代码开发菜单,进入报表设计器栏目 2.进…...

Servlet+JDBC实战开发书店项目讲解第12讲:会员管理功能

ServletJDBC实战开发书店项目讲解第12讲&#xff1a;会员管理功能 实现思路&#xff1a; 显示会员列表&#xff1a; 创建一个管理页面&#xff0c;用于显示所有会员的信息。在后端&#xff0c;创建一个Servlet来处理显示会员列表的请求。在该Servlet中&#xff0c;通过JDBC从数…...

java面向对象——继承以及super关键字

继承的概念 1. 被继承的类称为父类&#xff08;超类&#xff09;&#xff0c;继承父类的类都称为子类&#xff08;派生类&#xff09; 2. 继承是指一个对象直接使用另一个对象的属性和方法&#xff0c;但是能继承非私有的属性和方法&#xff1b;(1) 构造方法不能被继承。(2) 但…...

[机缘参悟-101] :IT人 - 遵从世界本源的样子,不带个人情感、道德、认知倾向,接纳一切,你就拥有无限的力量

目录 道的本义 如来的本义 观音的本义 无为而治本质是顺势而为 儒家的本质 感悟&#xff1a; 道的本义本质&#xff1a;天地的力量和运行规律 "天地以万物为刍狗"是出自《道德经》第五十章的一句话。在这句话中&#xff0c;"天地"指的是宇宙&#x…...

C++--深度理解智能指针

PS:智能指针简单应用看这里 http://t.csdn.cn/qN7IK 1.智能指针的介绍 在C中&#xff0c;智能指针有三个版本&#xff0c;分别为&#xff1a; auto_ptr unique_ptr shared_ptr 这三个版本的智能指针中&#xff0c;shared_ptr最为完善&#xff0c;auto_ptr基本上没有太大用…...

Spring Boot使用MySQL的默认连接池

笔者在近期秋招面试的时候被问到了这个问题&#xff0c;现在简单梳理一下便于后期重新回顾&#xff0c;并加深记忆。 Spring Boot 默认使用的数据库连接池是 HikariCP(开源库地址)。 HikariCP 是目前性能最好的连接池之一&#xff0c;它具有高度的性能、可靠性和可扩展性&…...

conda使用教程

Conda介绍 conda可以理解为一个工具&#xff0c;也是一个可执行命令&#xff0c;其核心功能是包管理和环境管理。包管理与pip的使用方法类似似&#xff0c;环境管理则是允许用户方便滴安装不同版本的python环境并在不同环境之间快速地切换。 conda的设计理念 conda将几乎所有…...

什么是LLM大语言模型?

什么是LLM大语言模型&#xff1f; 大语言模型&#xff08;英文&#xff1a;Large Language Model&#xff0c;缩写LLM&#xff09;&#xff0c;也称大型语言模型&#xff0c;是一种人工智能模型&#xff0c;旨在理解和生成人类语言。它们在大量的文本数据上进行训练&#xff0…...

jenkins同一jar包部署到多台服务器

文章目录 安装插件配置ssh服务构建完成后执行 没有部署过可以跟这个下面的步骤先部署一遍&#xff0c;我这篇主要讲jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 安装插件 Publish Over SSH 这…...

(四)Doceke安装MySQL镜像+Docker启动MySQL容器

Doceke安装MySQL镜像/Docker启动MySQL容器 一、doceke安装MySQL镜像 切换到root用户&#xff0c;su root 。 1、启动Docker 启动&#xff1a;sudo systemctl start docker 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 查看docker运行…...

Android Studio:Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7

原项目使用jdk8&#xff0c;升级gradle后出现的该问题。 java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:43)at org.codehaus.gro…...

Spring Clould 搜索技术 - elasticsearch

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; 初识ES-什么是elasticsearch&#xff08;P77&#xff0c;P78&#xff09; 1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能…...

android核绑定cpuset配置与检测进程所在核cpuset方法

一、开机阶段 开机有如下阶段。抛开开机动画需要的audio、surfaceflinger等进程&#xff0c;大部分android程序是在/data分区加载完整以后开始加载。所以cpuset的配置可以在 post-fs-data之后。注意&#xff0c;init.rc的不同阶段脚本都可能覆盖前面配置的cpuset。配置好检查与…...

Lnton羚通关于如何使用nanoPC-T4 安装OpenCV?

nanoPC-T4 安装 OpenCV Note: OpenCV has been pre-installed in FriendlyCore/FriendlyDesktop (Version after 201905) and does not require manual installation. Please download the latest FriendlyCore/FriendlyDesktop Image file from the following URL: http://do…...

内存泄漏:前端开发者的噩梦——内存泄露的原因及排查

在前端开发中&#xff0c;内存泄漏是一个常见但令人头疼的问题。它会导致应用程序变得缓慢&#xff0c;不稳定&#xff0c;最终可能崩溃。本文将介绍内存泄漏的概念、常见泄漏原因以及如何排查和预防内存泄漏。 什么是内存泄漏&#xff1f; 内存泄漏是指应用程序中的内存被错…...

高效使用ChatGPT之ChatGPT客户端

ChatGPT客户端&#xff0c;支持Mac, Windows, and Linux 下载地址见文章结尾 软件截图 Windows: Mac&#xff1a; 说明 chatgpt桌面版&#xff0c;相比于网页版的chatgpt&#xff0c;最大的特色是支持历史聊天对话记录导出&#xff0c;且支持三种格式&#xff1a;PNG、PDF、…...

【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据

【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据 文章目录 【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据前言出现的背景一、TDSQL-C数据库是什么&#xff1f;二、TDSQL-C 的特点三、TDSQL-C的应用场景四、基于TD…...

leetcode 6450. k-avoiding 数组的最小总和

给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组&#xff0c;如果其中不存在任何求和等于 k 的不同元素对&#xff0c;则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1&#xff1a; 输入&#xff1a;n 5, k 4 输出&#…...

变压器绝缘油耐压试验

试验目的 绝缘油是电气设备常用的绝缘、 灭弧和冷却介质。 为保证它在运行过程中具有良好的性能&#xff0c; 必须定期对其进行各项试验&#xff0c; 尤其是耐压试验。 绝缘油的耐压试验是在专用的击穿电压试验器中进行的&#xff0c; 试验器包括一个瓷质或玻璃油杯、 两个直径…...

asp网站漏洞修复插件/seo优

数组中的问题其实最常见 通过基础问题&#xff0c;掌握写出正确算法的“秘诀”巧妙使用双索引技术&#xff0c;解决复杂问题对撞指针- 滑动窗口 1 从二分查找法看如何写出正确的程序 本节学习重点&#xff1a;处理边界问题&#xff01; 1.确定边界范围方法&#xff0c;先用区…...

做策划需要进的网站/网络营销的应用研究论文

jvm classLoader architecture : a, Bootstrap ClassLoader/启动类加载器主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. b, Extension ClassLoader/扩展类加载器主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的ja…...

山海关网站制作/免费二级域名分发网站源码

2019独角兽企业重金招聘Python工程师标准>>> 今天做了个数据库的备份脚本&#xff0c;顺便系统得学习一下Linux下定时执行脚本的设置。Linux下的定时执行主要是使用crontab文件中加入定制计划来执行&#xff0c;设置比Windows稍微复杂一些(因为没有图形界面嘛)&…...

高端的丹阳网站建设/买卖网交易平台

戳蓝字“hi 知兮寒兮”关注我们哦&#xff01;前言通过本篇的学习&#xff0c;你将学会Base64在实战中的使用&#xff0c;此工具包提供了常用的方法&#xff0c;如下&#xff1a;text明文【转】Base64字符串&#xff1b;text的Base64字符串【转】明文&#xff1b;文件(图片、pd…...

江苏网站建设渠道/汉中网络推广

涉及的知识点 css实现元素背景色从左侧滑动到右侧 :root、var原声JS操作class 介绍 展示由若干个节点组成的步骤进度条&#xff0c;可以进入上一节点或者返回上一节点&#xff0c;切换时相应节点样式会发生改变。 代码 html: <div id"step-container">&…...

常州做网站公司排名/微博搜索引擎优化

原文地址为&#xff1a; ASP.NET Web API系列教程&#xff08;目录&#xff09;注&#xff1a;微软随ASP.NET MVC 4一起还发布了一个框架&#xff0c;叫做ASP.NET Web API。这是一个用来在.NET平台上建立HTTP服务的Web API框架&#xff0c;是微软的又一项令人振奋的技术。目前&…...