文档章节

mybatis学习(1)

杨健-YJ
 杨健-YJ
发布于 2018/12/15 16:27
字数 1764
阅读 20
收藏 0

JDBC连接方式:

1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。

2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利于系统维护。

3.使用PreparedStatement预编译的话(参数使用占位符),对变量位置设置123数字,这样的序号不利于维护,比如方法增加了传参。

4.返回result结果集也需要硬编码。

Mybatis:

ORM(object relation model 对象关系映射)框架,前身是ibatis,apache开源项目。

支持普通SQL,存储过程和高级映射的持久层框架。

消除了几乎所有JDBC的代码和参数的手工设置以及结果集的检索

通过使用简单的xml或注解,完成配置和原始映射,将接口和JAVA的POJO类映射成为数据库的表记录。

Mybatis的config全局配置,有几大标签:

比如Plugins,Mappers

1.mybatis的plugins标签中,提供拦截SQL的功能interceptor,可以实现mybaits接口,编写注解,重写接口方法,拦截query或者update等类型的sql,通过log输出SQL查询时间。但需要注意,<plugins>标签和其他标签,有先后顺序,不然会报一个xml格式错误。

2.Mappers标签中引入文件或指向文件,有四种方式 url,resource,class,packger,其中resource是IO流读取文件,class是通过类的动态代理invoke方法。

Mybatis注解annotation和xml优缺点:

xml的方式就是userMapper中,定义的都是SQL方法名称,而在mapper.xml中,定义表字段和POJO属性的映射和方法的SQL语句。

annotation注解,是在userMapper中,即定义方法的名称,又通过@select@update等注解,编写方法的SQL语句和入参,出参。

xml:增加xml文件,麻烦,条件不确定,容易出错,特殊字符转义。

注解(annotation):不适合复杂的SQL,收集SQL不方便,重新编译,适合单表查询。

#和$符号的区别:

都是对参数进行标记的符号。

#预编译,可以防止SQL注入行为。

$传参,SQL语句会进行拼接,导致SQL注入。

resultType与resultMap区别:

resultType进行返回结果,只会返回某一个pojo类型,且只有查询出来的列名和某个pojo类中的属性名一致,才会成功。

mybatis中使用resultMap完成高级输出结果映射。自定义返回结果映射,比如执行多表关联查询时,查询结果不是某一个pojo类型,这时候我们可以在mapper.xml文件中,定义resultMap,指定查询结果的映射关系。

mybatis之plugin:

逆向工程 Generator:

mybatis的主要特点是自己编写SQL,那么如果表很懂,可以使用mybatis官方提供的一个逆向工程,针对单表自动生成mybatis执行的代码,包括mapper.xml,mapper.java,pojo类等等。在一般开放中,常用逆向工程工具读取数据库的表生成代码。

1.引入jar.

2.配置generatorConfig.xml文件

配置文件支持有很多功能,根据需求自己查。可以通过配置去掉注释内容,还可以选择生成的代码,按注解方式还是 xml文件方式。

3.执行mybatis-generator:generate的运行命令。

 生成的pojo类有两种:

user.java

userExample.java

在JAVA中进行SQL操作时,有很多方法都是ByExample的,说明是可以通过操作对象来访问数据库。

Mybatis核心概念:

Configuration:管理mysql-config.xml全局配置关系类

SqlSessionFactory:Session管理工厂接口

Session:SqlSession是一个面向使用者的接口,提供了很多操作数据库的方法

Executor:执行器是一个接口(基本执行器,缓存执行器),作用:SqlSession内部通过执行器操作数据库

MappedStatement:底层封装对象,作用:对操作数据库存储封装,包括SQL语句,输入输出值

StatementHandler:具体操作数据库相关的handler接口

ResultSetHandler:具体操作数据库返回结果的handler接口

Mybatis执行过程:

1.通过Configuration创建SqlSerssionFactory

创建IO inputSteam流,读取mybatis-config.xml配置文件,得到xml对象,解析配置文件为Configuration类的JAVA对象。

主要拿到mappers节点,进一步解析,根据mapper的配置的方式url,resource,class,packger,再进入不同方法,去找到映射的文件mapper.xml。

解析完毕后,会创建一个SqlSerssionFactory对象。

2.通过SqlSerssionFactory创建executor执行器

SqlSerssionFactory会默认创建一个openSerssion,开启事物,然后初始化simpleExecutor和CacheExecutor(一级缓存)执行器。执行器包括默认的执行器和我们自己添加的执行器!比如前面我们监视SQL的执行器。

useCache=“true/false”,flushCache="true/false",

责任链方式使用场景:拦截器执行方式,异常抛出方式。

3.mappedStatement

mappedStatement作为JAVA对象,对应是mapper.xml文件,通过namespece+sql名id,可以找到唯一的SQL方法。

执行SQL操作时,会创建CacheKey,key由id+sql+limit+offset等等相关参数生成。相当于自动生成缓存。这就是一级缓存。拿到key会判断是否存在,不存在就查询数据库。

Mybatis的缓存机制:

每当我们使用mybaits开启一次和数据库的会话,mybatis会创建一个sqlsession对象表示一次数据库会话。在对数据库的一次会话中,我们可能会反复的执行完全相同的查询语句,如果不采取一定措施的话,每一次查询都会执行一次查询数据库,而我们短时间内做了相同的操作,结果极可能完全相同。由于查询一次数据库消耗的资源很大,造成浪费。

为了解决这个问题,mybatis会在sqlsession中创建一个简单的缓存,将每次查询结果换存起来,当下次查询时,先判断是是否是一样的查询,会直接从缓存中提取结果,发挥用户,不会对数据库再次查询。

cache key: id + sql + limit + offsetxxx

一级缓存:一级缓 是session级别的作用域,经过sqlsession.commit()方法后,会话结束,就会失效。

二级缓存:作用域为全局,在userMapper.xml中,添加<cache eviction="LRU" type="xxxxx.mybatisRedisCache">标签,开启二级缓存。比如mybatis整合redis时。

缓存击穿:查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。

本文转载自:https://my.oschina.net/xiaoyoung/blog/write/draft/2295762

共有 人打赏支持
上一篇: mybatis学习(2)
下一篇: 个人修炼,随写
杨健-YJ
粉丝 4
博文 36
码字总数 14802
作品 0
私信 提问
如何在MyBatis-3.2.7中使用Log4j2 rc2——MyBatis学习笔记之十九

前天我上传了我的MyBatis系列课程(http://edu.51cto.com/course/course_id-1110.html)的第六讲,主要内容是如何使用Log4j2(具体版本为v2.0-rc1)为MyBatis 3.2.7配置日志。实际上目前最新...

NashMaster2011
2014/07/09
0
0
MyBatis多对多关联查询示例——MyBatis学习笔记之十八

MyBatis系列的上一篇博客发表时,笑笑还没有出生。转眼间八个月过去了,他已经是个大宝宝了。这么长时间未更新MyBatis系列的博客,想来真是罪过。不过有了宝宝之后,的确会分散自己很大一部分...

NashMaster2011
2014/04/23
0
0
MyBatis多对多保存示例——MyBatis学习笔记之十七

前几天有网友问到MyBatis多对多的问题,不过愧对网友厚爱的是,最近一直忙,直到现在才有时间处理此事。今天就先写一个多对多保存的示例,算是对这位网友的初步回应,以后会有更多相关的博文...

NashMaster2011
2013/08/11
0
0
mybatis学习旅程

了解了MYSQL的大致流程,也会用mybatis做为中间件与mysql交互, 1.但是从spring--》mybatis-->mysql的流程还是不理解, 2.对mybatis黑箱操作也不敢说精通, 3.以及spring和mybatis怎么用事务...

杭电任宇翔
2016/09/28
38
0
springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits [TOC] 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,...

brianway
2016/03/30
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
29分钟前
0
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部