一、JDBC问题分析
- 数据库配置信息存在硬编码问题
解决:配置文件 - 频繁创建释放数据库链接
解决:连接池
- sql语句、设置参数、获取结果集参数均存在硬编码问题
解决:配置文件
- 手动封装返回结果集,较为繁琐
解决:反射、内省
二、自定义持久层框架设计思路分析
- 使用端(项目):引入自定义持久层框架的jar包
可以提供两部分配置信息:
数据库配置信息
sql配置信息(包括sql语句、参数类型、返回值类型)
我们使用配置文件来提供这两部分信息:
(1)sqlMapConfig.xml:存放数据库配置信息。
(2)mapper.xml:存放sql配置信息。
( mapper.xml配置文件的全路径可以放在sqlMapConfig.xml,这样的话将配置文件加载成字节输入流时,只需加载sqlMapConfig.xml即可)
- 自定义持久层框架本身(工程):本质就是对jdbc代码进行封装。
思路:加载配置文件成字节输入流,使用dom4j技术,将使用端的配置文件进行解析,并将解析出来的内容封装到JavaBean中,再将JavaBean层层传递,最后再JDBC代码执行过程中取出信息进行使用
- 加载配置文件:根据配置文件的路径,加载配置文件成字节输入流,存储在内存中
实现:创建Resources类,创建方法InputSteam getResourceAsSteam(String path)
- 创建两个JavaBean(容器对象):存放的就是对配置文件解析出来的内容
实现:
Configuration(核心配置类):存放sqlMapConfig.xml解析出来的内容
MappedStatement(映射配置类):存放mapper.xml解析出来的内容
- 解析配置文件:dom4j
实现:创建类SqlSessionFactoryBuilder,创建方法build(InputSteam in)
步骤:
第一:使用dom4j解析配置文件,将解析出来的内容封装到容器对象中
第二:创建SqlSessionFactory对象,用于生产sqlSession会话对象
(这里使用工厂模式,降低程序之间的耦合,同时可以针对不同的需求生产不同的对象)
- 创建SqlSessionFactory接口及实现类DefaultSqlSessionFactory
实现:创建openSession()方法:用于生产SqlSession
- 创建SqlSession接口及实现类DefaultSession
实现:定义对数据库的crud(增删改查)操作
selectList、selectOne、update、delete
- 创建Executor接口及实现类SimpleExecutor
实现:把jdbc的代码提取到SimpleExecutor中
创建方法query(Configuration, MappedStatement, Object... params):执行的就是JDBC代码
三、自定义持久层框架问题与解决
- 问题:
- Dao层使用自定义持久层框架,存在代码重复,整个操作的过程模板重复(加载配置文件、创建sqlSessionFactory、生成sqlSession)
- statementid硬编码问题
- 解决思路:使用代理模式生成Dao层接口的代理实现类
使用代理开发执行流程
详细代码与视频讲解下载