Mybatis是一个ORM框架。ORM(Object Relation Mapping)对象关系映射,就是将关系型数据库的数据表和代码对象建立映射关系,自动的完成数据表和对象的相互转换。
引入依赖
要使用Mybatis必须要引入Mybatis框架依赖和要操作的数据库驱动依赖。
在创建项目时在SQL依赖中找到Mybatis框架和对应的数据库驱动(使用什么数据库就装什么数据库)
配置数据库连接和Mybatis设置文件的保存路径
创建数据表对应的实体类
将数据表的表项映射为实体类的属性,属性的名称和表的列名要一一对应。
实体类必须要有set和get方法。
实现接口类
将操作数据库的的方法名写在接口里面。接口用@Mapper注释修饰,表示将这个接口托管给Mybatis。
方法的参数就是sql语句要用来查询的参数,方法的返回值就是用来接收sql语句的查询结果的,查询结果的值要和返回值的属性名一一对应。
设置sql查询语句
根据配置文件中配置的路径(classpath:/mybatis/*Mapper.xml),在resource文件夹下创建mybatis文件夹,然后创建和接口对应的Mapper.xm文件。
文件名可以前面可以随便取,后面必须符合配置的Mapper.xml。
然后复制粘贴xml配置模版
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
>
>
开始加入标签,绑定接口和接口参数,设置sql语句
注入接口对象,使用配置方法
配置完接口方法之后,就要使用这个接口了,直接在被类注释修饰的类中,用@Autowired注入接口对象,就可以使用接口的方法了。
sql语句中传入动态参数的方法
一个是 ${}另一个是#{}
注意:
综上:#{}和${}都有自身的局限和只有自己能实现的场景,主要还是看使用的时机,如果被传递的字符串是可以预期的,那就可以使用${}来接受,如果是不可预期到的那就使用#{}来接受更安全。
查找
select查询语句的标签就是
删除
delete删除语句的标签是
修改
update修改语句的标签是
插入
简单的插入
配置的参数只有id,默认的返回值是影响的行数
插入后返回被插入数据的在表中的主键id
配置的参数有id,useGenereatedKeys,keyProperty。
实现like模糊查询
模糊查询需要和‘%’进行字符串拼接,使用#{}和${}都不太合适。
#{}会将字符串自动的预处理成加了引号的形式
${}存在注入问题。
所以只需要使用到sql语法的函数concat,这些个方法可以将参数按参数顺序拼接成一个字符串,且不限参数个数。
一个类和数据表进行映射需要映射关系,默认的映射关系就是名称相同就能互相映射。如果想要让一个类的属性名和表的列名不相同也能映射,那就需要自己配置resultMap用来映射。
多表查询会遇到一个问题:多表查询的结果是多个表的联合结果,此时用什么类来映射这个临时结果呢?
例子:
查一篇文章数据,就需要查两个表,一个文章表,一个用户表,因为文章表中一般只有一个userid,用userid来查找到作者信息。联合查询到的信息才是前端展示这篇文章要用到的所有信息。
所以这个多表查询的的结果一般为文章表的所有信息,以及一个用户表的部分信息。
此时就遇到一个问题,用什么实体类来接收这个结果呢?
为了接收这个数据,就要专门再定义一个实体类,这个实体类需要有文章实体类的全部属性,并且添加一些用户类的属性。所以这个实体类可以继承文章类,然后添加字段,由于这个类是为了让前端获取数据方便而专门设计的,这个类名可以加上VO(View Out,前端输出)
使用继承而不是直接在原本的类中添加一个字段的好处是:
1.让代码的可读性更高,更易于理解
2.符合单一设计原则
继承的形成的子类实体类
使用@Data这个注解自动生成toString方法时要注意,如果是对子类使用这个注解,这个生成的toString只会将子类内定义的属性打印,不会打印父类中的属性。要自己重写toString方法。自己重写了之后@Data就不会再重写了。使用generate生成,并且选择添加父类toString的模本,
必须设置属性test,代表的是if标签的条件,满足了这个test的条件,就加入
If标签内容的逗号也是非常关键的,必须要思考一下,插入和不插入这个标签的值是否会影响原本语句,所以要想一下逗号的位置。
只要有一个必填项,就可以让必填项做末尾,然后其他的选填项都在名称后面添加逗号,但是如果一个必填项都没有,单独使用
trim就是用来解决逗号问题的,trim有四个属性,添加前缀prefix,添加后缀suffix,去除前缀prefixOverrides,去除后缀suffixOverrides。
Trim都是去除或添加在被Trim包裹的标签块内部的内容
Trim去后缀的好处是,如果有这个就去掉,如果没有也不做任何的改变。
当在where语句中,如果所有的条件判断都是非必填项,where条件在所有天剑都不插入的时候,就可能会出问题。
此时就可以使用where标签来包裹所有的if标签
where标签也可以使用trim代替。因为where标签的三个功能,trim标签都能实现。
和where标签差不多,也可以自动生成set,并且set标签会将多余的逗号后缀给去除。
如果set中没有信息,set标签就不会生成set,啥也不干
set标签也可以使用trim来代替
这个foreach就是将集合对象的所有值全部插入到sql语句中,并用separator这个属性的值作为每个值的分割符。
在使用时要用collection指定插入的集合名
Item来作为集合单个参数的别名
Open和close作为整个foreach标签内容的前缀和后缀
最终foreach呈现出的内容就是前缀和后缀包裹着foreach标签里面的内容复制成多份,每份用分割字符分割,份数就是集合内元素的数量
单元测试就是对程序的最小可测试单元进行功能性的验证的过程,简单来说就是测试功能是否符合预期。但是又和讲程序跑起来使用对应功能来测试不一样,单元测试是在代码中写下测试代码,只需要运行测试代码就可以测试出代码功能是否符合预期。
点击运行之后就可以运行起来此时代码了。
但是配完上面的还不行,因为sql语句日志默认级别是debug,而项目默认的日志打印级别是info,所以还要将默认日志级别改为debug。
Logging.leve.com.exmple.demo=debug