mybatisPlus

一、快速入门

  • 第一步:我们先创建一个springBoot项目。
  • 第二步:导入数据相关的坐标。那个lombok不属于数据库的坐标。
    在这里插入图片描述
  • 配置yaml文件。特别注意第二部分的tb_,因为我们创建的表名称叫tb_user,而在Java里面用来封装该数据的实体类叫User。mybatisplus在查询的时候会根据实体类的类名来创造一个表名称来查询,如果不配置这个,他会直接使用类名来做表名,但是我们数据库里面并没有一个叫user的表,查询肯定会失败,所以通过这个配置就会进行一个字符串的拼接从而生成一个tb_user的表名称用来查询。
  • 其他部分就是数据源属性配置、以及开启查询日志功能(该功能在项目上线的时候要去掉,切记!!!)。
    在这里插入图片描述
  • 第三步:创建java实体类,用来封装数据库里面的数据。这个类里面的属性名称是有要求的,他要和表里面的列名称保持一致。**注意:这个实体类里面可以只封装表里面的个别列数据,但是这个类里面不能出现表里面没有的列名称。**这里使用的@Data注解和另外一个,是用来构造set/get/有参/无参等方法的。
    在这里插入图片描述
  • 第四步:创建Mapper接口来继承BaseMapper接口,这里面的泛型就是我们发的Java数据封装类。该接口mybatisplus已经帮我们创建了许多操作表的方法,当然,我们也可以在该接口里面编写自己的操作方法,步骤和mybatis一样。千万别忘了给该接口添加@Mapper注解。
    在这里插入图片描述
  • mybatisplus帮我们实现的操作方式。
    在这里插入图片描述
  • 最后进行测试,通过将上面所写的接口注入进来,并且通过该接口对象来调用里面用来操作数据库的方法。
    在这里插入图片描述
  • 最后,有一个注意的地方,就是在配置yaml数据源那一块时,对于不同版本的数据库配置的驱动类和连接地址url是不一样。具体如何配置,请参考下图。
    在这里插入图片描述

二、BaseMapper接口内置函数的使用

2.1、增加数据

  • 这个是mybatisplus内带的保存数据的方法。如果你不想使用。也可以自己去写。
    在这里插入图片描述

2.2、删除数据

  • mybatisplus内带的删除方式有四种,下面演示了三种删除数据的方式。还有一种,这里没有进行演示。
  • 第一种是根据用户传递进去的id进行删除。
  • 第二种是将删除的条件写入到map里面,(可以写多个条件)。然后根据该map里面写的条件进行删除。根据打印出来的日志信息可知,删除的对象必须满足map里面所有的条件,才可以被删除。
  • 第三种是也是根据id进行删除,只不过是将要删除的信息id全部写到一个集合里面,然后根据集合里面的id删除数据。
    在这里插入图片描述

2.3、更改数据

  • 更改数据的方式也有好几种,这里就演示一下根据id进行更改,将需要更改的数据设置进去,然后根据mybatisplus的内置方法进行更改。注意,这个方式是通过id进行数据的更改,所以再更改时一定要将更改的那组数据的id传进去。
    在这里插入图片描述

2.4、查询数据

  • 查询数据的方式也有好几种,这里只演示了这一种。这是一个根据条件进行查询,但是将条件配置成null,因此就变成了查询全部。
    在这里插入图片描述

三、自定义数据库操作方式

  • 上面我们演示了plus里面的一些内置方法的使用。但是,那些方法仅仅是对部分业务有用。在面临一些其他业务时,还得我们自己来进行sql语句的编写。所以,接下来我们就讲讲如何配置自定义的的操作方式
  • 和mybatis一样,首先,现在相应的接口里面写上我们的方法名称以及需要的参数。
    在这里插入图片描述
  • 其次创建mapper文件,并在mapper文件里面创建该配置文件。如下图所示。这里值得一提的是,mapper文件是plus的默认使用的文件名称,如果我们将自己编写的xml配置文件放到其他名称的文件夹里面,则需要在yaml配置文件里面自行进行配置在这里插入图片描述
  • 编写mapper的配置文件,这和mybatis一样,就不再多说了。**在这里,我多说一句话,在mybatis里面可以配置别名,在这个里面如何配置呢?**请接着往下看,只需要在yaml文件配置上这么一句话,就会给该包里面的所有类都起一个别名。别名的语法格式就是类名。
    在这里插入图片描述
    在这里插入图片描述
  • 最后就是对我们自定义的方法进行测试。首先,先将我们自定方法所在的那个接口通过@Autowrite注入到该测试类里面,这样才能使用到我们这个接口里面的方法。
    在这里插入图片描述

四、mybatisPlus的Service使用

  • 这个接口里面定义了大量操作数据库的方法,来供用户使用。下面我们就讲讲这个具体该怎么使用。
  • 首先,我们先得先写好一套上面快速入门得东西(mapper.xml配置,mapper接口,yaml配置)。
  • 然后,我们再定义一个UserService接口,并且继承IService接口。值得注意的是该接口已经有一个实现类ServiceImpl<>
    在这里插入图片描述
  • 然后再写一个该接口的实现类,并且让该类继承IService接口的实现类,别忘了给这个类添加@Service注解。如下图所示。注意里面的泛型
    在这里插入图片描述
  • 最后进行测试。先将上面的这个类通过@Autowrite注解注入到测试类中,然后再根据该对象调用IService里面的方法。
    在这里插入图片描述
  • 到这里就将该IService讲完了。里面还有很多其他的方法,具体如何使用可以通过官方文档进行学习。

五、mybatisplus的注解

5.1、@TableName()

  • mybatisPlus在使用时,有一个很奇怪的地方,就是我们在使用它内部自定义的方法来操作数据库时,我们压根就没有告诉他该区操作那张表,但是他总是能准确地找到我们要操作的那张表。这是为什么呢?那是因为mybatisPlus是将我们的实体类名称映射成数据库的表名,例如:我们创建一张user表,然后在Java里面创建一个对应的实体类User,从而通过类名就可以知道数据库的表名。那么肯定会有人有疑问,万一我们的数据库表名和Java实体类的名称不一致,那该怎么办。此时就需要通过@TableName()来指定我们数据库表名了。

5.2、@TableId

  • 我们再创建表的时候,一般都会创建一个主键。但是主键的名称叫什么是可以很随意的。但是mybatisplus底层默认是id,所以如果我们在创建表的时候没有将id作为主键的名称,那么就会出问题。于是我们就可以在Java实体类中,通过@TableId来指定该属性就是主键。并将该属性名称作为主键名称来使用。
  • 该注解有两个属性,一个是value,一个是type。
  • value:用来指定主键的字段
  • type:主键生成策略。这个值得注意一下
    在这里插入图片描述

5.3、雪花算法

在这里插入图片描述
在这里插入图片描述

5.4、@TableField

  • 当Java实体类里面的属性名称和数据表的列名称对应不上时,就会报错。但是难免出现数据库的字段名和实体类的属性不一致。比如:数据表用user_name表示用户名称,而Java实体类用name来表示。那么由于两者不一样,所以就无法进行匹配,因而报错。
    在这里插入图片描述
  • 因此,为了解决这个问题。我们可以使用@TableField注解来将Java实体类的属性名称和数据库的字段名称对应起来。从而解决这个问题。例如下图,name2属性对应的是数据表的user_name字段。但是两者名称不一致,因此就需要通过该注解进行匹配。
    在这里插入图片描述

5.5、@TableLogic

  • 讲到这个注解,我们得先聊聊逻辑删除和物理删除。逻辑删除是假删除,在创建数据库表的时候创建一个是否被删除的字段。如果删除了数据,则将该数据的状态设置为已删除状态,而实际上并未删除。仍然可以在数据表中看到该数据。物理删除是真删除,一旦删除,就彻底的删除了。通过使用逻辑删除,我们可以对数据库的数据进行恢复。
  • 而在mybatisplus中提供了该注解来配置是按照逻辑删除还是物理删除。具体的使用请参考下图:
    在这里插入图片描述
    在这里插入图片描述

六、Wapper类

  • 我们在前面学习那些mybatisplus自定义的操作数据的方法时,有的需要我们传入一个Wapper类。这个类主要就是用于设置一些查询时的条件。下面我们就来看看这个类该如何使用。

6.1、Wapper的介绍

在这里插入图片描述

6.2、Wrapper的使用

6.2.1、查询

  • 查询时必须满足所有的条件才可以被查询到。注意column指的是数据表的字段名,而不是Java实体类的属性名。
  • 查询user_name字段里面包含a,uid在1到4之间并且email不为null的用户。
    在这里插入图片描述

6.2.2、排序查询

  • 按照年龄升序排序,如果年龄相同则按照uid进行升序排序。
    在这里插入图片描述

6.2.3、删除

  • 删除uid在10到20之间的所有用户
    在这里插入图片描述

6.2.4、条件优先级

  • 有时候在做查询的时候会出现条件优先级的问题。比如:年龄大于20并且用户名包含a,或者邮箱为null;和年龄大于20,并且用户名包含a或者邮箱为null;这两个条件看起来字是一模一样,但是表达的逻辑关系却是不一样的。前一个用户名包含a和年龄大于20是一个整体,而后面用户名包含a和邮箱为null是一个整体。实现想不明白了也没关系,下面我会把SQL语句给写出来。现在,我们先来测试第一个条件,注意:条件满足,则将user_name字段的值修改为“01_name”
  • 该条件的SQL语句为:UPDATE tb_user SET user_name=? WHERE is_delete=0 AND (user_name LIKE ? AND age >= ? OR email IS NOT NULL) 主要看我加黑的这一部分。

在这里插入图片描述

  • 再看另外一个条件的测试
  • SQL语句为:UPDATE tb_user SET user_name=? WHERE is_delete=0 AND (user_name LIKE ? AND (age >= ? OR email IS NULL))。仔细和上面的那个SQL语句进行比较你就会理解了。
    在这里插入图片描述

6.2.5、使用updateWrapper进行条件设置并进行值的更改

  • 在上面举得例子中,我们是单独写一个user类,并将要进行更改的值封装了进去。那能不能不写那个user类,也可以实现字段值的修改?肯定是可以的。接下来我们就来看看是怎么做到的。
  • 很清晰的可以看出来,首先,先进行条件的配置(我配置的是name=赵六),然后再将需要进行修改的信息填写进去(我配置的是,满足条件则将user_name字段的值修改为03_name)。
    在这里插入图片描述

6.2.6、查询指定的字段值

  • 上面几个例子大家会发现,每次查询的时候会将整张表的所以字段都给查询出来。但是在实际业务开发中,我们也许只需要查询个别字段,而不是所有字段。接下来我们就来看看如何只查询个别字段,很简单。我们只需要将需要查询的字段名称传递给queryWrapper的select方法就行。然后根据该条件进行查询即可。
    在这里插入图片描述

6.2.7、子查询

  • 在实际业务中子查询也是不可避免的一种查询方式,可能有的人已经把子查询忘了,不知道他是什么。下面我就先举个例子。select * from user where uid in( select id from dog );相信大家都能看懂,如果看不懂那你可真的的赶紧去复习一下SQL语句了。那如何实现这种查询呢?请看下图:通过使用insql()方法,结合我给的SQL语句和下面的图结合起来看,相信就会比较好理解了。SQL语句学的比较深的同学可能还知道子查询里面还可以包含子查询,具体怎么写大家可以自己去探索一下。
    在这里插入图片描述

6.2.8、模拟结合前端的信息进行查询

  • 在实际应用场景中,很可能就是通过前端进行信息的选择,然后将前端设置的信息反馈给后台,后台根据前端的信息进行查询。下面我就模拟实现一下。假如前端设置的查询信息是:user_name字段要包含a这个字母,并且年龄范围在10~20之间。下面就是相应的后端处理。那三个属性就相当于是前端传递过来的信息。细心的人可能发现了,我这次在配置条件的时候里面有三个boolea判断。这个是为什么?仔细想一下,如果前端给传过来一个空字符或者beginAge给传来一个null,那我们是不是就应该进行相应的判断。如果判断为假,则不使用这个条件,比如beginAge传一个null。那么下面的条件就变成了 user_name字段要包含a这个字母,并且年龄<=20。其次就是有人会注意到(User::getXXX)这种类型的写法,这是什么意思?其实这个就是为了获取字段名称,在面的操作中,需要那个字段名都是我们自己手写进去的,但是万一写错了,或者后期表的字段名称发生变化我们这边的操作都会出问题了。所以为了解决这个问题就使用这种写法来获取相应的字段名称。
    在这里插入图片描述

6.2.9、LambdaQueryWrapper和LambdaUpdateWrapper的使用

  • 这两个类其实和QueryWrapper和UpdateWrapper类一样,只不过支持一些特殊的语法格式而已,这种语法格式会避免我们的程序出现一些问题。用法和上面几乎一样。没有太大区别。
    在这里插入图片描述
    在这里插入图片描述

七、分页插件

7.1、分页功能的使用

  • 大家在学习mybatis的时候肯定学过分页查询,mybatisPlus一样,也有这个功能。接下来就让我们看看plus是如何实现的。
  • 首先,我们先写一个配置类,在该配置类里面向容器注入一个MybatisPlusInterceptor对象。**注意里面的那个DbType.MYSQL属性值,根据自己使用的数据库类型进行选择,我使用的是mysql所以就选这个。**做完这些就完成了配置。接下来我们就可以使用分页功能了。
    在这里插入图片描述
  • 分页功能的使用,这一块的具体使用我就不多写了。大家去查相应的API就行。
    在这里插入图片描述
  • 这个就是分页功能相应的API。
    在这里插入图片描述

7.2、自定义分页功能

  • 上面我们使用的都是框架自带的一些分页操作,但是万一我们需要编写符合自己业务场景的分页,那该怎么办?接下来就讲讲吧。
  • 首先,先在mapper接口里面定义一个方法,方法的返回值必须是Page< User >。然后在mapper.xml文件里面去写相应的SQL语句。最后就可以使用了。
    在这里插入图片描述

在这里插入图片描述

八、乐观锁

8.1、什么是乐观锁

8.2、场景

  • 如下图所示:
    在这里插入图片描述
  • 在阅读完上述场景后,你能理解他在说了一个什么样的问题吗?其实就是一些不正规的操作引起数据库的数据出现了问题。而现在需要解决这个问题。首先,我们先还原一下上述的场景,如下图所示:测试的最后,老板获取的商品价格是70,而不是自己预料的120。这就是由于发生了数据的覆盖从而导致的问题。接下来,我们就是用乐观锁来解决这个问题。
    在这里插入图片描述

8.3、乐观锁的使用

  • 在mybatisPlus中,框架已经提供了许多方法实现了乐观锁,我们只需要进行配置即可。
  • 首先,就上面的问题而言,我们得知道该问题的解决方式是什么。小李和小王同时读取同一个数据,但是小李在将数据修改且会回写到数据库中之后小王并不知道,所以小王任然是对最早的那个数据进行修改并回写,而不是对小李修改之后的数据进行修改。因此,我们常常回添加一个version(版本)字段。在每一次修改之后都对该数据的版本进行一个更新,从而通过版本的判断就可以知道他们修改的是不是同一个数据。
  • 具体的配置。首先,我们现在创建的Java实体类的version属性上添加一个@Version注解,如下图所示。
    在这里插入图片描述
  • 其次配置一个乐观锁插件,如下图示:
    在这里插入图片描述
  • 最后,我们再来测试,测试代码和上面一样,但是结果却不一样,这次运行之后结果是150。但是有人肯定还会说,不对呀应该是120才对。没错,但是这是因为我写的这个代码并不完善。这都不重要,下面会补完善。我们先来分析一下为啥又变成150了。原因很简单,正是因为我们使用了乐观锁,所以在每次更改数据之后都会进行版本的更新。两人读取相同的数据后,获取到的数据是同一个版本的。小李首先对数据进行来更改,从而导致数据的版本进行改变,从而小王在进行数据更新的时候时SQL语句(见下图的中被注释起来的SQL语句)的条件判断部分发现版本不同,从而就无法执行小王的操作,因此数据就停留在小李更改之后的状态,也就是150。
    在这里插入图片描述
  • 上面我们使用了乐观锁虽然解决了两个之间同时对数据进行更改而发生的数据覆盖,但是,我们仍然没有将数据修改成我们需要的那个。这不是说这个锁用的不对。而是我们的代码逻辑不完善,接下来我们就对我们的代码在进行完善处理。这个大家就得知道SQL语句执行无效的返回值是什么,是0。所以我们只需要加上一个判断语句,判断看执行之后是否为0,如果为0则从新获取数据,然后再去修改。这个重新获取就会获取到小李更改之后的数据,然后再取进行修改就会达到我们预计的效果。代码如下
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

九、多数据源的配置

  • 读写分离不知道有没有人听过,不同的数据库负责不同的功能,有的就是只负责读取,有的就只负责修改。所以学习多数据源的配置很有必要。接下来就看看如何使用mybatisPlus配置多数据源。

9.1、多数据源环境的搭建

  • 首先我们先在两个不同的数据源下分别创建一个数据表。
  • 我分别在我的数据库里面创建两个数据源一个叫mp,另一个是mp2并且分别创建了一个表。一个user表,一个product表。另外一个我就不贴上去了
    在这里插入图片描述
  • 接着干,在创建号数据表之后,我们接着来在idea中部署项目。
  • 首先,导坐标。如果导了这个坐标但是后面不起作用,那就刷新一下。我把我踩的坑全部都写出来。
    在这里插入图片描述
  • 编写yaml配置文件。注意这个配置文件,下面一共配置了两个数据源一个是mp的一个是mp2的。写的时候千万不要以为两个数据源的url参数是一样的。
    在这里插入图片描述
  • 在配置好之后,就开始代码的书写了。
  • 首先,先创建继承BasseMapper接口的UserMapper接口和ProdectMapper接口。如下图:
    在这里插入图片描述
    在这里插入图片描述
  • 然后创建继承了IService接口的UserService接口和ProductService接口。要注意这两个接口里面泛型是哪个,不要乱写
    在这里插入图片描述
    在这里插入图片描述
  • 接着创建继承了ServiceImpl<T,Y>这个类的上面这两个接口的实现类。如下图所示:别忘了写注解。下面我来说说这个@DS注解。还记不记得我们在前面yaml文件里面配置的那两个数据源。在每个数据库源上面都有一个名称,这个名称随便起,叫啥都行。我给一个叫master,另一个叫salve_1。所以在@DS注解里面我写了这两个名称,也就是说,你想让哪个对象来操作哪个数据库,你就把哪个数据源给配置到哪个类上
    在这里插入图片描述
    在这里插入图片描述
  • 到这里,搭建工作就完成了。接下来我们来进行测试。我分别从两个不同的数据源里面读取id=1的值,卡、看能不能读取到;结果是可以的。
    在这里插入图片描述

9.2、配置多数据源遇到的问题

9.2.1、问题一:@DS注解找不到,就是那种写上去直接爆红提示 not find

  • 按理来说,只要将多数据源所依赖的坐标导进去,在使用@DS注解是,就会自动提示。但是我的不但不提示,而且我手写上去还直接爆红。最后打开加载的依赖里面虽然有这个坐标,但是坐标里面什么都没有,我想可能是导坐标时出问题了。然后就clear,然后重新加载。果然重新加载之后就好了。

9.2.2、问题二、

  • 我创建的User类里面负责存储id字段的那个属性名称叫uid。因为我的数据库里面也叫uid。但是运行之后,SQL语句后面本来应该是uid = XXX。结果成了null = XXX。我后来想起来,好像是mybatisplus在后端操作时默认就叫id,如果你要用uid,就得在uid字段上添加@TableId注解。告诉框架,uid是主键。再改完之后就好了。但是过了几天我把这个注解给去了再去运行又不报错了。我只能说,这个的用玄学来解释了。

十、MyBatisX插件

10.1、相关介绍

  • mybatisPlus为我们提供了强大的mapper和service模板,能够大大的提高开发效率。但是在实际开发中,我们常常需要写一些复杂的SQL语句,多表联查等等。我们就得自己去写SQL语句,但是该插件可以帮我们完成书写,很方便。下面就让我们来了解一下该插件。

在这里插入图片描述

10.2、MybatisX插件的安装

  • 该插件需要在ieda中安装。在idea的setting中搜索plus,然后再去搜索该插件。搜到之后下载并安装就行了。如下图:
    在这里插入图片描述

10.3、该插件的使用

  • 安装好之后,就来看看他都有那些功能。首先,我们现在idea的最左侧或者最有测找到database,如下图所示:
    在这里插入图片描述
  • 然后打开它,点击左上角的加号,然后选择Data Source,染后选择MySQL。如下图所示。
    在这里插入图片描述
  • 之后进入到该界面,编写nama、host、user、pasworrd、database,然后TestConnection,如果失败,则按照提示进行解决。解决之后,点击ok。
    在这里插入图片描述
  • 点击之后进入下面界面,就可以看见,已经将mp里面的表全部导进来了。
    在这里插入图片描述

10.3、利用该插件字懂生成代码

  • 在做好上面的操作之后,我们来看看该如何利用该插件来生成代码。
  • 首先我先来说说他会生成那些代码。
  • 我们在之前,我们总会创建一个实体类来存放从数据库里面获取到的数据。比如上面的User类、Product类。没错,现在不要我们手写了。其次,就是我们写的mapper接口类,现在也不用我们来写了,最然后就是service那一套也不要我们来写了,最后就是mapper.xml文件也不用了。下面我们就来看看他是怎么样实现的。

代码生成过程

  • 首先,我们先看需要对那个数据表进行这一套配置,例如下图,我挑选的是tb_dog这张表。右键这张表,如下图所示,选择第一项;
    在这里插入图片描述
  • 选择之后就会跳转到下面的这个界面,首先,我们先来选择将他创建到哪个项目里,点击module path就会出现下图界面。然后选择项目名称。选择之后点击ok。
    在这里插入图片描述
  • 点击之后就会返回到这个界面来。如下图。然后将包结构改成自己的模式,我的是com.zjh。**写到这里,我发现,我有点描述的不太清除,具体怎么样去配置下面这个界面,大家可以去官网查看,也可以去看视频。官网连接,我将官网连接放到这里,在官网写的很详细。
    在这里插入图片描述
  • 最后就会生成下图这些代码
    在这里插入图片描述
    到这里不要以为就学完这个插件了,这才是刚刚开始,因为我所学也有限,就先写道这一步。后面仍然需要继续学习。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值