远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

    • MyBatis

      • JDBC的问题分析
      • 自定义持久层框架的设计思路
        • 为什么要自定义框架
        • 核心要点
        • 使用端(项目)
        • 自定义持久层框架本身(工程)
      • 自定义持久层框架的代码实现一
      • 自定义持久层框架的代码实现二
      • 使用getMapper方式对自定义持久层框架进行优化
      • MyBatis的基本介绍及优势
      • MyBatis的基本使用
      • Mybatis基本流程及配置文件解析
      • MyBatis复杂映射开发之一对一查询
      • MyBatis复杂映射开发之一对多查询
      • MyBatis复杂映射开发之多对多查询
      • MyBatis常用注解及基本增删改查的注解实现
      • MyBatis的注解实现复杂映射开发
      • MyBatis缓存的概念
      • MyBatis的一级缓存
      • MyBatis的二级缓存
      • MyBatis的二级缓存整合redis
      • MyBatis-RedisCache源码分析
  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

  • 分布式框架

  • 后端开发
  • 开源框架
  • MyBatis
terwer
2022-08-27
目录

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

# 为什么要自定义框架

解决JDBC存在的那些问题[^1],同时理解MyBatis的底层原理。

# 核心要点

  1. 解析配置文件

    • 数据库配置信息
    • sql 的封装
  2. 构建 SqlSessionFactory,注意这里的 openSession 方法

  3. 拿到 SqlSesion

    • 定义 SqlSession 基本方法

    • 封装具体的执行逻辑,Executor

      Execute 的 query 方法就对应 jdbc 操作

    • 优化,使用 JDK 动态代理避免 statementId 的硬编码

  4. 将 SqlSession 的操作封装到 DAO 层

# 使用端(项目)

  • 引入自定义持久层框架的 jar 包

  • 提供两部分配置信息

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

(1)sqlMapConfig.xml :存放数据库配置信息,存放 mapper.xml 的全路径

(2)mapper.xml :存放 sql 配置信息

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

本质是对 JDBC 代码进行封装

  • 加载配置文件

    根据配置文件的路径记载成字节输入流,存储到内存中

    创建 Resources 类

    方法:InputStream getResourceAsStream(String path)

  • 创建两个 JavaBean(容器对象):存放的是配置文件解析出来的内容

    Configuration:核心配置类,存放 sqlMapConfig.xml 解析出来的内容

    MappedStatement:映射配置类,存放 mapper.xml 解析出来的内容

  • 解析配置文件:dom4j

    创建类:sqlSessionFactoryBuilder 类,方法 build(InputStream in)

    1、使用 dom4j 解析配置文件,将解析出来的内容封装到威器对象中

    2、创建 SqlSessionFactory 对象,生产 SqlSession(会话对象),工厂模式

  • 创建 SqlSessionFactory 以及实现类 DefaultSqlSessionFactory

    openSession():生产 SqlSession

    • 创建 SqlSession 接口及实现类 DefaultSqlSession

      定义对数据库的 CRUD 操作:

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

    query(Configuration configuration, MappedStatement mappedStatement, Object... params):执行 JDBC 代码

文章更新历史
2022/05/08 feat:新增 Kotlin 版代码实现
2022/03/14 feat:初稿

[^1]: ### JDBC 问题总结

原始 jdbc 开发存在的问题如下:

1、 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。

2、 Sql 语句在代码中硬编码,造成代码不易维护,实际应用中 sql 变化的可能较大,sql 变动需要改变 java 代码。

3、 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。

4、 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便
编辑 (opens new window)
#custom#dao#framework#persistence#mybatis#mybatis-2
上次更新: 2023/02/22, 13:47:25
JDBC的问题分析
自定义持久层框架的代码实现一

← JDBC的问题分析 自定义持久层框架的代码实现一→

最近更新
01
解决css部分border被圆角切掉之后圆角的边框消失问题
03-18
02
使用TypeScript开发一个自定义的Node-js前端开发脚手架
03-08
03
Github-Actions使用release-please实现自动发版
03-06
更多文章>
Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式