MyBatis

发布于:2024-10-16 ⋅ 阅读:(11) ⋅ 点赞:(0)

前言

  首先我们来回顾一下我们之前说过的应用分层,也就是三层架构模型:Controller,Service,Dao,我们说一般是由浏览器发起请求后,先请求到Controller这层,然后由Controller调用Service进行业务逻辑处理,如果需要我们数据库中的数据,就需要让Service来调用Dao,Dao层来从数据库中读取数据

  我们之前学习mysql,使用的是jdbc来操作数据库,很麻烦

什么这里打勾的操作,我们发现都很单一,完全可以交给spring让他来给我们作这一系列操作,我们只需要完成sql语句即可,所以我们就来学习mybatis这个更加快捷简单的操作数据库方法

(一)创建mybatis

 首先我们说mybatis是在Dao层工作的,所以他是一款持久层框架。

 1.引入依赖

 如果我们想要使用他。就必须要导入mybatis的依赖和mysql的驱动包

spring boot集成了这个依赖,所以我们只需要在创建时勾选上这两个依赖就可以

然后我们就发现pom文件中会有这两个依赖

2.数据准备

 我们先来在mysql中创建一个表,并且在我们idea中创建一个实体类

我们这里要遵守命名规范,idea中要使用小驼峰,表中字段名,如果两个单词要使用_来分隔

如果我们不按照规范来,在之后可能会出错,这个我们涉及到了再讲

3.配置数据库连接字符串

  我们数据创建完了,依赖也引入了,但是我们的idea现在和数据库仍然是没有任何关系的,因为我们没有进行连接,我们需要再yml中配置我们数据库的信息来建立连接(也可以配置properties文件)

   注意事项: 如果使⽤MySQL是5.x之前的使⽤的是"com.mysql.jdbc.Driver",如果是⼤于5.x使⽤的 是“com.mysql.cj.jdbc.Driver

一些常见错误

 在这里我们来说一下我们在这里可能会遇到的一些错误

 首先就是我们的配置信息错了,可能是服务器的账号密码出错了,idea会给我们报一个这样的错误

没有配置数据库(创建datasource失败)

数据库不存在(这个还是比较明显的,一下就能看懂)

表不存在

   然后还有一些错误,比如我们sql语句错了会报badsql和方法名不能重复,这些也都比较直观,这里就不多说了,上述的是配置文件可能会出现的一些错误,也是我们比较容易忽略的

(二)使用mybatis

 那我们准备工作做完了,之后就要开始写我们持久层的代码了

 首先我们要创建的是一个持久层接口

,在在这个接口中我们来写我们的数据库操作

这里也有一些规范,就比如我们mybatis的持久层接口规范一般都是***Mapper

 那我们再来看一下这里使用到的两个注解:

首先@Mapper注解:表示的是mybatis中Mapper接口,这个注解也可以类似五大注解,生成接口的代理对象(bean)然后交给spring ioc进行管理

       @Select这个注解很明显,就是select查询,也就是注解对应方法的具体实现内容

1.单元测试

我们创建好Springboot项目后,我们可以在test这个目录下,来测试我们的代码

我们可以右键然后创建一个test,打开这个页面后我们可以在低下勾选出我们想要测试的方法

   这样我们就成功的查询到了我们表中的数据(因为我这里配置了驼峰转换所以有一些名称没有对应上,也正常的赋值了,一会我们会说)

2.mybatis的基础操作

  1)打印日志

  我们发现我上述结果打印的日志显示出了很多信息。包括sql执行的内容,传递的参数和执行的结果,那其实这些也需要我们手动的取配置一下才能够显示,如果我们不配置就会变成这样(啥都没有)

2)参数传递

  我们如果有一些需求,需要我们查找一个指定id的信息,那我们就需要在sql传入一个可变的参数来让我们进行传值,我们来看一下要怎么实现

我们需要在sql语句要传入的参数哪里使用#{待传参数名称}来传递参数

   但是我们需要注意如果我们接口方法的形参只有一i个普通类型的参数,那#{}中的名称可以随便写,比如这里写成value也可以

  这是因为我们参数列表中只有一个参数,就算想要获取别的参数也没有了,所以只能拿这个,我们也可以通过@Param这个方式来起别名

那如果我们的名称对应不上,idea就会给我们报错

  这里我们发现还有一个param1这个参数,这个参数其实跟我们的value是一个,只不过spring这里面按顺序给我们参数列表中添加了一个值

 那假如我们要传递多个参数呢

如果我们参数名称严格对应就不会出错

但如果我们还想只传递一个参数一样,参数名称不对应呢?

就会导致我们仍然找不到想要的值

  这里的返回值也需要我们注意,就比如我们select的返回值,是查询到的对象,如果我们只有一个结果返回,可以使用对象或者集合来接收,如果有多个结果,那就必须要使用集合来接收,不然会给我们报错

使用注解来完成增删改查

1)insert

通常我们不会传一个固定的值,所以我们这里要把sql中的常量转换为动态的参数

我们这里直接使用UserInfo中的对象属性名来获取参数

注意这里不可以使用对象.属性名的方式,不然会报错

  如果我们想使用对象.属性名的方式,我们需要使用@Param这个注解,这样我们注解中的参数,我们会把他当成一个对象就可以使用对象.属性名了

返回主键

  insert默认的返回值是受影响的行数,但是有时候我们数据插入后还要针对这个数据来进行一些操作,此时我们需要获取到插入的这个数据id,那如果想要拿到这个自增的id就需要使用到@Options这个注解

注意我们设置useGeneratedKeys=true 之后,⽅法返回值依然是受影响的⾏数,⾃增id 会设置在上述 keyProperty 指定的属性中.

2)Delete

  其实使用注解来完成一些简单的增删改查,他们的代码结构都很类似

3)Update

 

4)Select 

  之前我们在查询的时候,我们着重说了要注意规范命名,如果命名不规范就可能会有一系列问题,这里我们就来演示一下

    此时我们发现,我们取到的deleteFlag等信息是null,这就是因为,我们数据库返回的时候,发现数据库字段和java属性不一致

   那如何让我们数据库字段和java属性一致呢?

 最简单的方法就是更改我们的名称,但是如果我们的名称一般都是协商好了的,所以不可以随便修改,这时还有三种处理办法

 1.起别名

2.结果映射

这里我们需要用到一组新注解@Results和@Result

column中是数据库字段名,property中就是java属性

3.配置驼峰自动转换

那我们如果每次都要写这么多重复映射,我们就可以把这些映射关系提取出来使用

(这也是为什么要求我们要命名规范)

使用xml来完成增删改查

  xml的一些配置以及使用xml

 我们mybatis的开发方式有两种:注解,xml

 上面我们学习的是注解的方式,接下来我们要学习xml的方式

首先我们还是要配置一些东西

此步骤我们要进行两项设置,数据库连接字符串设置和mybatis的xml文件设置

首先我们要在yml中配置xml的文件路径

然后我们需要写持久层代码(分为两部分)1.方法定义 (一个接口)2.方法实现(  .xml)

这里面namespace是我们要实现的方法接口路径,我们可以直接在接口方法中复制路径加类名

这里是对应关系

到这里我们就可以正式的写我们xml代码了

   我们先来一下代码在哪写,我们上述说了方法的定义和方法的实现分开了,我们需要定义一个接口,在这个接口中定义方法,然后我们需要在配置文件指定的路径创建一个xml文件,在这个文件中指定方法的路径,然后再<mapper></mapper>中实现不同的方法

 那现在我们就来创建一个接口,在接口中写一个抽象方法

然后我们在xml文件中实现这个方法(记得要写路径)

id是我们要实现的方法,resultType是返回值的类型,也要写成一个路径

然后我们就可以进行单元测试了

  这里我还是要再提醒自己一遍,一定要加上@SpringBootTest这个注解,不然spring扫描不到,依赖就会注入失败,我这里给我报空指针异常给我整一愣

 1)insert

  那接下来我们就可以实现用户的增加,删除以及修改操作了

我们发现跟注解类似同时注解有的功能他也有,我们也可以使用@Param来改变名称

  那这里我们也可以返回自增的id,接口不需要改变,我们只需要再xml中更改一些参数,设置useGeneratedKeys和keyProperty

这样就能够返回我们的自增id了

 2)delete

delete没有什么特别操作,注意映射关系即可

 3)update

 4)select

   我们查询的时候仍然会出现数据库表名和我们属性名不同,我们使用的方法仍然是在注解中的三种,第一种起别名和第三种配置大小写转换这里就不说明了,跟注解中一样,唯一有一些区别的是第二种映射的方式


网站公告

今日签到

点亮在社区的每一天
去签到