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语句)

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

(3)selectone:表示查询出一条记录进行映射。
(4) selectlist:表示查询出多条记录(列表)进行映射。

(5)parameterType:在映射文件中通过其指定输入参数的类型。
(6)resultType:在映射文件中通过其指定输出结果的类型。
2.4 mybatis更新操作
(1)插入:------自增主键返回

非自增主键返回(使用uuid)

(2)修改 、删除

2.5 mybatis与
hibernate的区别
(1)hibernate入门门槛较高,是一个ORM(对象关系映射)框架,对sql语句进行优化、修改比较困难;适用于需求变化不多的中小型项目,如后台管理项目等;
(2)mybatis专注sql本身,需要程序员自己编写sql语言(非全自动),优化、修改方便;也属于ORM框架(含有输入输出映射);适用于需求变化较多的项目,如互联网项目等。
2.6 sqlSession

2.7 原始dao层开发(需要些dao接口和dao接口实现类)
需要向dao实体类中注入SqlSessionFactory,在方法体内部通过SqlSessionFactory创建SqlSession。

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制定类型一致。


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


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

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

2.9 mapper映射配置文件
(1)输入映射
通过parameterType指定输入参数类型,可以是pojo(包装的多张数据表的字段、复杂查询条件)、简单类型和hashmap等。


2.10 输出映射
(1)resultType---表列名与pojo属性必须一致


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

2.11 动态sql
mybatis核心-对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
(1)where if 判断

(2)sql片段
将sql代码块抽取出来,组成一个sql片段,其他的statement中就可以引用sql片段,便于开发。
定义:

引用:

(3)foreach
向sql传递数组或者list,mybatis使用foreach解析。

2.12 高级映射
(1)一对一查询
resultType实现:

resultMap实现:



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

(2)一对多查询


(3)多对多查询




2.13 延迟加载
(1)什么是延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一以及一对多映射)association、collectio具备延迟加载功能。

(2)实现


(3)mybatis默认不开启延迟加载,改配置在mybatis中的核心配置文件中设置:

2.14 查询缓存
mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybatis提供了一级缓存和二级缓存。

(1)一级缓存

一级缓存的工作原理:
如果sqlsession去执行commit(更新)操作,清空sqlsession中的一级缓存,这样做的目的是让一级缓存中存储的是最新的数据,避免读取到脏数据。
mybatis默认支持一级缓存,不需要在配置文件中去配置。
一级缓存的应用:
在mybatis和spring进行整合开发中,事物是控制在service层中,一个service方法中包括很多的mapper方法。

(2)二级缓存

mybatis二级缓存原理:

二级缓存与一级缓存的区别:
二级缓存的范围更大,多个sqlseesion可以共享一个userMapper的二级缓存区域。userMapper有一个二级缓存区域(按namespace分),其他的mapper也有自己的二级缓存区域(按namespace分)。即每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,那么这两个mapper执行查询到的数据将存储在相同的二级缓存区域中。
开启二级缓存:
mybatis的二级缓存是mapper范围级别的,除了在SqlMapConfig.xml设置cacheEnabled属性(默认true开启);

还需要在userMapper.xml中开启二级缓存,userMapper.xml下的sql执行完会存储到它的缓存区域中(HashMap)。

调用pojo类实现序列化接口(Serializable接口):
为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,在内存中不一样。
注意:sqlSession必须进行close操作,才能将sqlSession获取的数据写到二级缓存区域。
二级缓存参数:

注:针对每次查询都需要最新的数据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接口的实现类型。

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

2.17 mybatis整合spring

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


(2)spring管理mapper.java
通过MapperFactoryBean创建代理对象(繁琐不推荐):

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

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