前言
首先我们来回顾一下我们之前说过的应用分层,也就是三层架构模型: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
我们查询的时候仍然会出现数据库表名和我们属性名不同,我们使用的方法仍然是在注解中的三种,第一种起别名和第三种配置大小写转换这里就不说明了,跟注解中一样,唯一有一些区别的是第二种映射的方式