自定义持久层框架
JDBC操作问题分析
- 数据库配置信息存在硬编码问题、频繁创建释放数据库连接
- SQL语句、设置参数、获取结果集均存在硬编码问题
- 手动封装返回结果集,较为频繁
解决思路
- 连接池解决连接问题
- 配置文件解决硬编码问题
- 反射和内省解决结果集问题
框架实现
-
使用端(引入自定义持久层框架的jar包)
-
配置信息:数据库配置信息、SQL配置信息:SQL语句、参数类型、返回值类型
-
sqlMapConfig.xml:存放数据库配置信息,存放mapper.xml的全路径
-
mapper.xml:存放SQL配置信息
-
自定义持久层框架本身(本质对就是队JDBC代码进行封装)
-
加载配置文件:根据配置文件路径加载配置文件成字节输入流,存储在内存中。创建Resources类 方法:InputStream getResourceAsStream(String path)
-
创建两个javaBean(容器对象):存放对配置文件解析出来的内容。Configuration:核心配置类:存放sqlMapConfig.xml解析出来的内容。MappedStatement:映射配置类:存放mapper.xml解析出来的内容
-
解析配置文件:dom4j。创建类:SqlSessionFactoryBuilder 方法:build(InputStream in)。第一:使用dom4j解析配置文件,将解析出来的内容封装导容器对象中。第二:创建SqlSessionFactory对象:生产SqlSessionFactory:会话对象
-
创建SqlSessionFactory接口及实现类DefaultqlSessionFactory。第一:openSession(),生产SqlSession
-
创建SqlSession接口及实现类DefaultSession,定义对数据库的crud操作:selectList()、selectOne()、update()、delete()
-
创建Executeor接口及实现类SimpleExecutor实现类:query(Configuration,MappedStatement,Object… params):执行JDBC代码
框架优化
- 问题1 dao的实现类中存在重复代码,操作过程模板重复(创建sqlSession、调用sqlSession方法和关闭sqlSession)
- dao的实现类中存在硬编码,调用sqlSession的方法时,参数statement的id硬编码
解决办法:使用代理模式来创建接口的代理对象
基本概念
对象/关系数据库映射(ORM Object Relation Mapping)
ORM全称Object/Relation Mapping:表示对象-关系映射的缩写
ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,程序员既可以利用面向对象程序设计语言的简单易用性,又可以利用关系数据库的技术优势。
ORM把关系数据库包装成面向对象的模型。
ORM框架是面向对象设计语言与关系数据库发展不同步时的中间解决方案。
采用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的形式来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层SQL操作。
ORM框架实现的效果:把对持久化对象的保存、修改、删除 等操作,转换为对数据库的操作。
简介
- 基于ORM的半自动化轻量级持久层框架
- 支持定制化SQL、存储过程和高级映射
- 避免了几乎所有的JDBC代码和手动设置参数及获取结果集
- 可以使用XML或注解来配置和映射原生类型、接口和Java的POJO(Plan Old Java Objects)为数据库中的记录
历史
-
Apache 开源项目iBatis
-
2020年6月 由Apache Software Foundation迁移至Google Code
-
团队转投Google iBatis3.x改名为 Mybatis,2013 11迁移GitHub
-
iBatis 来源于Internet 和abatis的组合,基于Java的持久层框架
优势
- 半自动化的持久层框架、SQL和Java编码分开,功能边界清晰,一个专注业务,一个专注数据
基本应用
快速入门
-
官网地址:http://www.mybatis.org/mybatis-3/
-
开发步骤
-
1:添加Mybatis的坐标
-
2:创建数据库表
-
3:编写实体类
-
4:编写映射文件XXXMapper.xml
- 动态sql语句
- if
- foreach
- collection:代表要遍历的集合元素,不要写#{}
- open:语句开始的部分
- close:结束部分
- item:遍历集合的每个元素,生成的变量名
- separator:分隔符
- sql:抽取重复的sql,使用时用include引用即可
- 动态sql语句
-
5:编写核心文件SqlMapConfig.xml
- configuration 配置
-
properties 属性 该标签可以加载额外配置的properties文件,如jdbc配置信息
-
- configuration 配置
-