mybatis-plus保姆级入门教程,手把手教你轻松实现增删改查

一、前言

通过前几期的基础教学,想必大家都已经掌握springboot项目的创建及项目启动等基本内容了吧(如果还没掌握,请去复习我上几期的内容,好伐?)。

今个儿我要来整点高级的,使用组件的方式来轻松实现数据库交互,大家想不想学?好的,看到大家的积极性如日中天啊,老夫深感欣慰。那bug菌将不遗余力地传授给大家,同时也希望大家在学习的过程中,打好基础,认真听哦。

上一期我们是通过注入jdbc模板类进行数据库查询对吧,虽然这种交互方式可以,但是面对不常用数据类型,就不好使了,所以我要教大家一种最省事最方便的,那就是mybatis-plus,超级好用的一个组件,省去大量手写sql的体力活,让你一切查询变得简单而又透彻。这期我的目的就是引领你们入门。 具有很好的教学价值,希望小伙伴们根据这篇文章可以有所收获,建议小伙伴们先收藏后阅读哦。

首先,我们先来了解一下,mybatis-plus为何物?与mybatis有何不同?最关键也是最重要的部分,它如何使用?

好的,别着急,咱们接着往下看。

二、mybatis-plus概览

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

愿景:

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

三、mybatis-plus优势:

特性

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

损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

支持 Lambda 形式调用:通过 Lambda 表达式,方便地编写各类查询条件,无需再担心字段写错

支持主键自动生成:支持多达 4 主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 即可进行强大的 CRUD 操作

支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

支持数据库

任何能使用 mybatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。

mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss ,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb

达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库

#框架结构

四、mybatis-plus实战演练

1、老规矩,使用前先引入pom依赖;添加如下:

<!--mybatis-plus-->com.baomidoumybatis-plus-boot-starter3.2.0<!--代码自动生成器配置-->com.baomidoumybatis-plus-generator3.2.0复制代码

ps:如果有小伙伴图省事,可以使用代码生成器,超级方便,但由于此篇是入门级教学,那我就手把手带着大家手动创建控制器,分发器等文件吧,日后再带大家熟悉使用自动生成器,行吧?感兴趣的小伙伴也可以参考bug菌写的这篇《mybatis-plus代码生成器入门教学》,自己动手实战一下,很简单的。

2、引入完依赖之后,结合阿里开发规范,对业务逻辑进行分层,本着低耦合高内聚的目的而去。

3、由于我前几期已经创建了一个 UserController 对吧,接着来创建实体类,UserService接口层,UserServiceImpl接口实现层,及最后的UserMapper 持久层。

UserEntity

**@TableName(“table_name”):**指定数据库表名。

**@TableId :**指定type = IdType.AUTO 表示数据库id为自增型。

**@TableField(value = "name") :**指定数据库字段名。

添加get set方法即可。

package com.example.demo.Entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; /** 用户基本信息实体 */ @TableName("user") public class UserEntity {

@TableId(value = "id", type = IdType.AUTO) //表示该id为自增,新增时候不需要手动设置id。

privateInteger id;@TableField(value="name")privateString name;@TableField(value="age")privateInteger age;@TableField(value="sex")privateString sex;@TableField(value="address")privateString address;publicIntegergetId(){returnid;}publicvoidsetId(Integer id){this.id = id; }publicStringgetName(){returnname; }publicvoidsetName(String name){this.name = name; }publicIntegergetAge(){returnage; }publicvoidsetAge(Integer age){this.age = age; }publicStringgetSex(){returnsex; }publicvoidsetSex(String sex){this.sex = sex; }publicStringgetAddress(){returnaddress; }publicvoidsetAddress(String address){this.address = address; } }

**

然后再多添加几条数据吧!方便后续查询接口浏览查询。

UserService

编写两个接口!分别为不带参数与带一个参数,作为演示:具体代码如下

packagecom.example.demo.service;importcom.baomidou.mybatisplus.extension.service.IService;importcom.example.demo.Entity.UserEntity;importjava.util.List;/**

* 用户管理业务层接口

*/publicinterfaceUserServiceextendsIService{/** 

    * 不分页查询所有用户信息

    */ListgetUsers();/**    * 根据性别查询所有用户    *    *@paramsex 性别    */ListgetUsersBySex(String sex);}

UserServiceImpl

继承接口实现上方两方法。

由于是使用了该mybatis-plus的查询方式,顾语法有些不一样。这个后续给大家详细讲讲。

packagecom.example.demo.service.impl;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.example.demo.Entity.UserEntity;importcom.example.demo.dao.UserMapper;importcom.example.demo.service.UserService;importorg.springframework.stereotype.Service;importjava.util.List;/**

* 用户管理业务层

*/@ServicepublicclassUserServiceImplextendsServiceImplimplementsUserService{/**

    * 不分页查询所有用户信息

    */@OverridepublicListgetUsers(){//直接可使用IService 封装好的一些方法,这个自行点进去看。returnthis.list();    }/**    * 根据性别查询所有用户    *    *@paramsex 性别    */@OverridepublicListgetUsersBySex(String sex){//条件构造器QueryWrapper wrapper =newQueryWrapper<>();//eq 代表“ = ”;例如 eq("sex", "男") ---> sex = '男';等同于拼接在sql语句后边的where条件。wrapper.eq("sex",sex);//将条件带入返回List list =this.list(wrapper);//返回数据returnlist;    }}

UserMapper

packagecom.example.demo.dao;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.demo.Entity.UserEntity;importorg.springframework.stereotype.Component;/**

* 用户管理持久层

*/@Componentpublic interface UserMapper extends BaseMapper {}

以上 添加就大功告成了;

最后是controller类,调用刚才我们写的那两接口进行访问,看看结果如何

分发器代码如下:

packagecom.example.demo.controller;importcom.example.demo.Entity.UserEntity;importcom.example.demo.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;/**

* 用户管理分发器

*/@RestController@RequestMapping("/user")public class UserController {@Autowiredprivate UserService userService;/**

    * 不分页查询所有用户信息

    */@GetMapping("/get-users")    public List getUserList() {returnuserService.getUsers();    }/**

    * 根据性别查询所有用户

    *

    * @param sex 性别

    */@GetMapping("/get-users-by-sex")    public List getUsersBySex(@RequestParam(name ="sex") String sex) {returnuserService.getUsersBySex(sex);    }}

接下来,不用我说大家也知道了吧!接口访问,一切从简,那就直接打开浏览器访问咯

奥对了在访问之前,咱们再做一件事,添加一下控制台sql打印输出,方便我们查看到底执行了什么?对吧。做法只需在application-dev.yaml 中配置如下即可。

# 日志设置logging:level:# 持久层日志级别com.example.demo.dao:debug

ok~咱们先来访问第一个接口;浏览器直接访问。

http://localhost:8080/user/get-users

ps:如果中途报错,找不到basemapper

那你请在启动类 DemoApplication 中添加如下这行,表示指定扫描 dao。

@MapperScan("com.example.demo.dao")

完事之后,接着干正事,看看能否查询到五条数据?咱们拭目以待~

很好。成功查询出了五条数据

然后我们再看下控制台,看看执行了什么sql语句?请看如下:

第一个查询语句,成功输出,也打印并返回五条数据值。

接下来我们来访问第二个接口,带性格参数。看看能否成功?

http://localhost:8080/user/get-users-by-sex?sex=男

结果如下:

结果上看,明显是进行了条件查询,只查询出了性别为男的数据!证明带参也是没问题。

我们来确认一下,回到idea控制台,请看下边,朋友们,sql语句已经告诉了我们一切,很显然,是把sex = '男' 作为了where 条件 进行了数据过滤!

把参数换成 '女' 试试,能否数据过滤

结果如下:

也是根据性别参数成功过筛数据。

好啦!接下来你们就随便玩随便造啦。想怎么玩就怎么玩,反正就是引领入门,修行靠个人啦~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容