1.什么是mybatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
上面这些话你们肯定很懵吧 什么是映射?什么是xml?怎么把他们联系起来
慢慢来,你首先需要明白的就是mybatis就是封装了jdbc,你使用jdbc的时候每次都需要加载驱动,连接数据库,执行sql语句,然后关闭资源。jdbc这一系列操作,特别浪费资源,加大io的操作,但是mybatis就是封装jdbc,你不需要考虑关闭资源,如何加载驱动,怎么执行sql语句。
我先给讲讲配置和流程以及使用,和自己使用mybatis遇到的一些坑,在深入底层讲讲mybatis这个半自动的orm框架!
题外话(其实在学习mybatis的时候,强烈建议把jdbc学会,深入了解一下,就跟你学习springmvc的时候,先将servlet学的透彻)
2.使用流程和配置以及springboot中使用mybatis
(1)如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
上面的version就是你想使用的mybatis版本这个你就根据你的需要添加
(2)添加完成后,我画了一张草率的mybatis的流程图
跟着这个图来使用mybatis
1.引入依赖如果你是maven构建项目的话就是添加我上面说的依赖坐标
2.全局配置文件 mybatis-config.xml
这个xml配置文件去扫描映射你的mapper 这里的xml我就不写了我也很久没有写过,大部分项目就是springboot构建,在yml中配置就行了,但是网上有很多详细的xml配置
我说说几个xml的配置信息吧!
(1.)事务管理器,jdbc的事务管理器
(2)数据源,池类型的数据源
(3)因为mybatis是封装jdbc,所以在xml中,需要去配置数据驱动和连接,比如你的用户名啊数据库啊密码啊对吧
其实mybatis很强大,还有缓存机制
一级缓存和二级缓存,默认开启一级缓存,像二级缓存你就需要去实例化pojo,然后去手动开启你的二级缓存,底层只是就是上面的那个架构图跟着架构图去读源码,源码的话后面会更新的,没得序章,但是我就是记录下过程!
写一点自己以前遇到的问题吧
(1)比如resulttype和resultmap的区别?
像单表查询的时候,你就返回使用resulttype返回他的pojo就行,两个不能一起使用
像联合查询的时候,有两个实体类,但是需要合在一起的时候,你就是创建一个model类,让他们组合,这时候你就需要使用resultmap
(2)springboot配置文件
(3)当你报啥什么getter啊和setter的时候?
就好好检查下自己的实体类啊还有你的数据库字段名和你的实体类名是否一一对应
(4)报你的mapper/dao下面某个方法找不到?
啥也别想了,就是你的xxmapper.xml和你的mapper接口没有映射起来,mybatis无法加载因为认不到他们的关系,我一般写完接口和xml映射的时候,就习惯鼠标上去点一点,看是否能不能跳过去
(5)再就是自己设计数据库的时候,要根据你的业务需要给你字段给出一个比较合理的大小,以前才学mysql的时候,一个sort排序的int 我都要给255,你给的太大了,增加他的io操作,影响数据库性能,你给小了,它又要把报错,真不好将就?
(6)说说平时代码是怎么一个顺序写的?
controller--->service---->mapper--->db
db--->mapper---->service--controller
我一般都是先搭环境就是先从mapper接口写好和xml 在去service去调用mapper,因为你写好后,可以测试一下,你后面报错的时候,就肯定不是mapper的问题了啊 对吧
后面继续在这个下面讲mybatis底层了 我去准备准备
现在脑海里回想一下,jdbc的加载过程是怎么连接数据库然后执行sql语句?
1.我就常用的MySQL讲起吧,首先你肯定要有个加载MySQL的数据库驱动对吧 要不然怎么认识数据库,其次你要连接数据库对吧,比如端口啊,还有用户名还有密码,如果是本地连接就可以用localhost来代替你的ip地址或者你的服务器地址。你加载成功连接成功后,肯定是要写一个sql语句对吧,然后在去执行sql语句
之前jdbc写sql的时候 那真是一个麻烦 and 多重and表关系,但是在你的mybatis中,就有动态sql出现 真的动态sql着是真的方便也安逸,可读性也超级好读,开始吧
(1)trim
先贴一段我写的例子 Mybatis修改语句:
先来解释下 <trim prefix="set" suffixOverrides=",">
prefix:给sql语句拼接的前缀
suffix:给sql语句拼接的后缀
prefixOverrides:去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"
suffixOverrides:去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定
上面的语句,就是做一个判断处理,如果为空就不修改!
(2)foreach
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合
其实想讲讲in的用法(这次就算了 我在开一个mysql的基础和高阶的文章)
=======================================================
foreach元素的属性主要有 item,index,collection,open,separator,close
item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么结束。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可
对于一个collection有4种实现方式
先看看我一条的删除语句
DELETE FROM library_book_info where id in(1,2,5)
然后跟foreach 关联起来 怎么关联
where in () ,看看上面我写的啥?open和close,加上1,2,5是一个数组,所以collection=array
那么:
<foreach collection="array" open="(" close= ")" item="ids" separator="," >#{ids}</foreach>
看看完整的代码: