自定义持久层框架的设计思路

Terwer 后端开发 MyBatis评论1151字数 1343阅读4分28秒阅读模式

为什么要自定义框架

解决JDBC存在的那些问题1,同时理解MyBatis的底层原理。文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

核心要点

  1. 解析配置文件
  • 数据库配置信息
  • sql 的封装
    1. 构建 SqlSessionFactory,注意这里的 openSession 方法
    2. 拿到 SqlSesion
  • 定义 SqlSession 基本方法文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html
  • 封装具体的执行逻辑,Executor文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    Execute 的 query 方法就对应 jdbc 操作文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

  • 优化,使用 JDK 动态代理避免 statementId 的硬编码
    1. 将 SqlSession 的操作封装到 DAO 层

使用端(项目)

  • 引入自定义持久层框架的 jar 包
  • 提供两部分配置信息文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    • 数据库配置信息
    • sql 配置信息:sql 语句、参数类型、返回值类型
  • 使用配置文件来提供这两部分配置信息:

(1)sqlMapConfig.xml :存放数据库配置信息,存放 mapper.xml 的全路径文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

(2)mapper.xml :存放 sql 配置信息文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

自定义持久层框架本身(工程)

本质是对 JDBC 代码进行封装文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

  • 加载配置文件

    根据配置文件的路径记载成字节输入流,存储到内存中文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    创建 Resources 类文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    方法:InputStream getResourceAsStream(String path)文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

  • 创建两个 JavaBean(容器对象):存放的是配置文件解析出来的内容文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    Configuration:核心配置类,存放 sqlMapConfig.xml 解析出来的内容文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    MappedStatement:映射配置类,存放 mapper.xml 解析出来的内容文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

  • 解析配置文件:dom4j文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    创建类:sqlSessionFactoryBuilder 类,方法 build(InputStream in)文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    1、使用 dom4j 解析配置文件,将解析出来的内容封装到威器对象中文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    2、创建 SqlSessionFactory 对象,生产 SqlSession(会话对象),工厂模式文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

  • 创建 SqlSessionFactory 以及实现类 DefaultSqlSessionFactory文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    openSession():生产 SqlSession文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    • 创建 SqlSession 接口及实现类 DefaultSqlSession

    定义对数据库的 CRUD 操作:文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    selectList()
    selectOne()
    update()
    delete()
    
  • 创建 Executor 实现类以及实现类 SimpleExecutor

    query(Configuration configuration, MappedStatement mappedStatement, Object... params):执行 JDBC 代码文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

文章更新历史
2022/05/08 feat:新增 Kotlin 版代码实现
2022/03/14 feat:初稿 文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html


  1. JDBC 问题总结

    原始 jdbc 开发存在的问题如下:文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    1、 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    2、 Sql 语句在代码中硬编码,造成代码不易维护,实际应用中 sql 变化的可能较大,sql 变动需要改变 java 代码。文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    3、 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html

    4、 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便 

文章源自浅海拾贝-https://blog.terwergreen.com/custom-design-ideas-of-long-lasting-layer-framework-e3eoi.html
相关文章
  • 扫码加我微信
  • 验证消息请输入:来自你的博客
  • weinxin
  • 我的微信公众号
  • 微信扫一扫与我交流吧
  • weinxin
Terwer
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: