Mybatis

作者: 五十米_深蓝 | 来源:发表于2018-12-09 23:36 被阅读3次

1、原生JDBC缺点
(1)数据库连接,使用时创建,不使用立即释放,对数据库进行频繁的连接开启和关闭,造成数据库资源浪费,影响数据库性能。
-----解决方法:使用数据库连接池管理数据库连接。
(2)将sql语句硬编码到Java代码中,如果sql语句修改,需要重新编译Java代码,不利于程序维护。------解决方法:将sql语句配置在xml文件中。
(3)向preparedStatement中设置参数,对占位符位置和设置参数值,硬编码在Java代码中,不利于代码维护-----解决方法:将sql语句和占位符号和参数全部配置在xml文件中。
(4)从resutSet中便利结果数据集时,存在硬编码。---------解决方法:将查询的结果集,自动映射成Java对象。
2、mybatis框架
2.1 mybatis介绍
(1)一个持久层的框架,是apache下的顶级项目,目前代码托管在github上。
(2)让程序员将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活的生成(半自动,大部分程序员需要自己编写sql语句)满足需要的sql。
(3)可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成Java对象(输出映射)。
2.2 mybatis框架
(1)配置文件:
sqlMapConfig.xml(名称可自定义)------是mybatis的全局配置文件,配置了数据源、事务等mybatis的运行环境。
mapper.xml------映射配置文件(配置sql语句)


image.png

(2)sqlSessionFactory(会话工厂)------创建sqlSession
(4)sqlSession(会话)------操作数据库,发出更新、查询指令。
(5)Executor(执行器)是一个接口(基本执行器、缓存执行器)------sqlSession内部通过执行器来操作数据库。
(6)mapped statement(底层封装对象)------对操作数据库存储封装,包括sql语句、输入参数、输出结果类型等。
2.3、mybatis查询小结
(1)${}:表示一个拼接符号,会引起sql注入,不建议使用。
(2)#{}:表示一个占位符号。


image.png
(3)selectone:表示查询出一条记录进行映射。
(4) selectlist:表示查询出多条记录(列表)进行映射。
image.png
(5)parameterType:在映射文件中通过其指定输入参数的类型。
(6)resultType:在映射文件中通过其指定输出结果的类型。
2.4 mybatis更新操作
(1)插入:------自增主键返回
image.png
非自增主键返回(使用uuid)
image.png
(2)修改 、删除
image.png
2.5 mybatis与
hibernate的区别
(1)hibernate入门门槛较高,是一个ORM(对象关系映射)框架,对sql语句进行优化、修改比较困难;适用于需求变化不多的中小型项目,如后台管理项目等;
(2)mybatis专注sql本身,需要程序员自己编写sql语言(非全自动),优化、修改方便;也属于ORM框架(含有输入输出映射);适用于需求变化较多的项目,如互联网项目等。

2.6 sqlSession


image.png
2.7 原始dao层开发(需要些dao接口和dao接口实现类)
需要向dao实体类中注入SqlSessionFactory,在方法体内部通过SqlSessionFactory创建SqlSession。
image.png
2.8 mapper代理方法(只需要关些mapper借口)
mapper接口规范:
(1)mapper.java接口中的方法名和mapper.xml配置文件(必须在mybatis配置文件中加载映射)中的statement的id值一致。
(2)在mapper.xml中namespace等于mapper.java接口的全限定名称。
(3)mapper.java接口中的方法输入参数类型和mapper.xml配置文件中的statement的parameterType值一致。
(4)mapper.java接口中的方法返回值类型和mapper.xml配置文件中的statement的resultType制定类型一致。
image.png
image.png

2.8 mybatis全局配置文件
(1)将数据库连接参数单独配置在jdbc.properties文件中,只需要在mybatis.xml中加载jdbc.properties的属性值。


image.png
image.png

(2)setting全局参数配置
比如:开启耳机缓存、开启延迟加载等。
(3)typeAliases(别名)---便于开发
在mapper.xml中,定义了statement,statement需要指定输入(parameterType)、输出结果映射类型(resultType)。
基本类型默认别名:int等对应包装类型;
针对pojo自定义别名:


image.png

(4)typeHandlers(类型处理器)
mybatis中类型处理器用于Java类型和jdbc类型映射,一般不需要自定义(提供的可以满足日常需要)。
(5)mappers(映射配置)


image.png
2.9 mapper映射配置文件
(1)输入映射
通过parameterType指定输入参数类型,可以是pojo(包装的多张数据表的字段、复杂查询条件)、简单类型和hashmap等。
image.png
image.png
2.10 输出映射
(1)resultType---表列名与pojo属性必须一致
image.png
image.png

动态的代理对象中是根据mapper方法的返回值类型确定是调用selectOne还是selectList。
(2)resultMap
mybatis中使用resultMap完成高级输出结果映射。


image.png
2.11 动态sql
mybatis核心-对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
(1)where if 判断
image.png
(2)sql片段
将sql代码块抽取出来,组成一个sql片段,其他的statement中就可以引用sql片段,便于开发。
定义:
image.png
引用:
image.png
(3)foreach
向sql传递数组或者list,mybatis使用foreach解析。
image.png
2.12 高级映射
(1)一对一查询
resultType实现:
image.png
resultMap实现:
image.png
image.png
image.png

一对一查询时resultMap与resultType的对比:


image.png
(2)一对多查询
image.png
image.png
(3)多对多查询
image.png
image.png
image.png
image.png
2.13 延迟加载
(1)什么是延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一以及一对多映射)association、collectio具备延迟加载功能。
image.png
(2)实现
image.png
image.png
(3)mybatis默认不开启延迟加载,改配置在mybatis中的核心配置文件中设置:
image.png
2.14 查询缓存
mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybatis提供了一级缓存和二级缓存。
image.png
(1)一级缓存
image.png
一级缓存的工作原理:
如果sqlsession去执行commit(更新)操作,清空sqlsession中的一级缓存,这样做的目的是让一级缓存中存储的是最新的数据,避免读取到脏数据。
mybatis默认支持一级缓存,不需要在配置文件中去配置。
一级缓存的应用:
在mybatis和spring进行整合开发中,事物是控制在service层中,一个service方法中包括很多的mapper方法。
image.png
(2)二级缓存
image.png
mybatis二级缓存原理:
image.png
二级缓存与一级缓存的区别:
二级缓存的范围更大,多个sqlseesion可以共享一个userMapper的二级缓存区域。userMapper有一个二级缓存区域(按namespace分),其他的mapper也有自己的二级缓存区域(按namespace分)。即每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,那么这两个mapper执行查询到的数据将存储在相同的二级缓存区域中。
开启二级缓存:
mybatis的二级缓存是mapper范围级别的,除了在SqlMapConfig.xml设置cacheEnabled属性(默认true开启);
image.png
还需要在userMapper.xml中开启二级缓存,userMapper.xml下的sql执行完会存储到它的缓存区域中(HashMap)。
image.png
调用pojo类实现序列化接口(Serializable接口):
为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,在内存中不一样。
注意:sqlSession必须进行close操作,才能将sqlSession获取的数据写到二级缓存区域。
二级缓存参数:
image.png
注:针对每次查询都需要最新的数据sql,可以设置为禁用缓存。
刷新缓存:一般执行完commit操作都需要刷新缓存,(mapper的statement属性)flashCache=true(默认)表示刷新缓存。
2.15 mybatis整合ehcache

mybatis无法实现分布式缓存,需要和其他分布式缓存框架进行整合。
*分布缓存(Redis、ehcache、memcached):提高系统并发、性能,一般对系统进行分布式部署(集群部署方式)。
(1)整合方法:
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可;例如:mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
(2)配置mapper总cache中的type为ehcache对cache接口的实现类型。


image.png
(3)加入ehcache的配置文件(classpath下加入ehcache.xml文件)
2.16 二级缓存应用场景
(1)访问多的查询请求且用户对查询结果实时性要求不高的;
(2)耗时较高的统计分析sql,电话账单查询,产品代码查询等;
(3)设置缓存刷新时间间隔flashinterval属性;
(4)二级缓存的局限性:对细粒度的数据缓存实现不好;
image.png

2.17 mybatis整合spring



(1)spring通过单例模式管理sqlSessionFactory


image.png
image.png
(2)spring管理mapper.java

通过MapperFactoryBean创建代理对象(繁琐不推荐):


image.png
通过MapperScannerConfigurer(扫描)自动创建代理对象(推荐):

2.18 逆向工程
mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表(数据库表)自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、po...)
(1)运行逆向工程(建议使用Java程序方式,不依赖开发工具)
(2)生成代码的配置文件
(3)执行生成程序

(4)使用生成的代码(将生成工程所生成的代码拷贝到自己的工程中)

相关文章

网友评论

      本文标题:Mybatis

      本文链接:https://www.haomeiwen.com/subject/llbvmftx.html