powernode godbatis 学习总结

b 站视频:035-手写godbatis框架第一步创建基础类_哔哩哔哩_bilibili

源码连接:https://gitee.com/sakurafpq/learn_powernode_godbatis.git

注意:

    Java 版本:17
    MySQL版本:8.x +
    Maven 3.8.x +


仅作学习参考

第一步:创建基础类

         1. 创建 Maven 项目,并加入依赖:dom4j、jaxen
         2. 创建基础类:Resources、SqlSessionFactoryBuilder、SqlSessionFactory

                       (1) Resources 类:工具类,专门完成类路径中资源的加载。
                       (2) SqlSessionFactoryBuilder 类:SqlSessionFactory 的构建器,通过 SqlSessionFactoryBuilder 的 builder 方法来解析 godbatis-config.xml 文件,然后创建 SqlSessionFactory 对象。
                        (3) SqlSessionFactory 类:一个数据库对应一个 SqlSessionFactory 对象。通过 SqlSessionFactory 对象可以获取 SqlSession对象(开启会话)。且一个 SqlSessionFactory 对象可以开启多个 SqlSession 会话。

第二步:分析 SqlSessionFactory 类该有的属性

        1. 分析 SqlSessionFactoryBuilder 中 new 出来的 SqlSessionFactory 的返回值需要那些内容?

                (1) 首先 SqlSessionFactoryBuilder 是通过 godbatis-config 来构建 SqlSessionFactory 对象的。
                (2) 在 godbatis-config 中,大致可以分类出:事务管理器属性、数据源属性、以及 SQL 相关内容,并把 SQL 相关的内容放在一个 Map 集合中(将它的 namespace + id 存为 Map 的 key,具体的 SQL 语句存为 Map 中的 value)
                (3) 所以创出封装 SQL 标签的实体类:MappedStatement。一个 MappedStatement 对象对应了一个 SQL 标签。

第三步:抽取事务管理器接口

        1. 将 SqlSessionFactory 的事务管理器属性由接口管理

                (1) 有利于在不同的事务管理器时候创建不同的接口实现类,比如事务管理器是 MySQL 时接口就由 MySQL 的实现类继承事务管理器的接口所以创建了事务管理器接口:Transaction。

第四步:事务管理器的实现

        1. 关于数据源的编写位置

                (1) SqlSessionFactory 对象中,在对 godbatis-config 解析的时候,是需要由数据源在 SqlSessionFactory 中。但是在写 SqlSessionFactory中的 Transaction 的继承类 JdbcTransaction 时候,发现里面的 commit、rollback、close方法 也需要数据源,所以可以直接把数据源写到 Transaction 的实现类里面,如果 SqlSessionFactory 需要数据源,可以调用 Transaction 接口实现类中的数据源。

第五步:数据源的实现

        1. 数据源的实现类都实现了 JDK 的内置接口 javax.sql.DataSource。
        2. JdbcTransaction 中的数据源可能为三种数据源:JNDI、UnPooled、Pooled。其中 UNPOOLED 是不使用连接池,每一次都新建 Connection 对象。
    而 JNDI 是使用第三方的数据库连接池获取 Connection 连接对象。POOLED 使用 godbatis 框架内置的数据库连接池来获取 Connection 对象。
    主要实现 UNPOOLED 为主。
        3. UNPOOLED 的数据源实现类是 UnPooledDataSource,在 UnPooledDataSource 中的构造方法通过传入的 driver 完成了注册驱动,
        并使用 JDBC 可以通过 getConnection 方法获取数据库的连接 connection。

第六步:事务管理器改造

        1. JdbcTransaction 方法中的 openConnection 方法。

                (1) 因为在数据管理器 JdbcTransaction 中的 commit、rollback、close 方法中需要用到数据库连接 connection。而且必须要保证三个方法中的 connection 是同一个,所以编写方法 openConnection 用于开启数据库连接。
        (2) 在 openConnection 中开始数据库连接时,如果 当前的事务管理器中的 connection 为空,则 getConnection 获取数据库连接,否则则使用已有的 connection。
        (3) 并且以及知道除了在事务管理器中要使用数据库的连接,所以将 connection 使用 getConnection 的方式将其抛出。

第七步:获取数据源对象

        1. 使用 dom4j.io.SAXReader 的包对 xml 文件进行解析

第八步:获取事务管理器对象

(要解析的 xml 文件来源就是调用 builder 方法时候传入的指向 godbatis-config.xml 文件的一个输入流。)
        (1) 获取事务管理器:通过对 xml 文件的解析得出数据源那块 xml 文件信息以及解析出事务的那块 xml 文件信息。
        (2) 获取数据源对象:通过这个信息,编写获取数据源对象、获取事务管理器的方法。
        (3) 获取数据源对象。

        1. 在获取事务管理器的时候,先判断事务管理器类型,再将对应的事务管理器构建完成并返回。

第九步:获取存储 SQL 的 Map 集合中

        1. 在构建 builder 方法中获取 mappedStatements(封装 sqlMapper 中的 sql 信息的 Map 集合)时:

                (1) 先对 godbatis-config 文件中的 mapper 标签整理成集合,再对集合中的每个标签中的对应的 sqlMapper 文件解析, 找到整个 sqlMapper 文件中的 namespace 后再加上每个 sql 语句代表的 id,便得到了 sqlId(namespace + id) 
        (2) 将得到的 sqlId 写为封装 MappedStatement 的 key,再将每个 sqlMapper 文件中的 sql 语句写入 Map 中的 value,这样便得到了 sqlMapper 文件中的所有的 sql 信息。

第十步:测试框架

        1. 目前测试结果:可以利用自己封装的 SqlSessionFactoryBuilder 创建出一个 SqlSessionFactory,里面存储了

第十一步:封装 SqlSession 对象

        1. sqlSession 对象是 sqlSessionFactory 中的方法 openSession 创建出来的,所以先在 sqlSessionFactory 中的 openSession

                (1) 数据源的信息
                (2) 是否开启事务
                (3) 把 sql 信息封装好的 sqlSessionFactoryMap 的数量、内容。

第十二步:insert 方法的实现

        1. 其实主要就是使用 JDBC 代码执行 inser 语句,完成操作。

                (1) 使用已经封装好的 SqlSessionFactory,通过其中的获取事务管理器接口,再获取获取数据库连接对象,从而建立连接。
                (2) 建立好连接之后,通过 SqlSessionFactory 中的 getMappedStatements 方法,将传入 insert 方法的参数 sqlId,获取 sqlId 对应的 sql 语句,并将 sql 语句中的占位符(例如:#{id}, #{name}, #{age})替换成 “ ? ”。并对 sql 语句进行预处理。

第十三步:动态给占位符传值        

        1. 编写将占位符转换为 ? 的方法。
        2. 先通过 sql 语句的占位符得到 POJO 中的对应的属性名,再将获取的属性名第一个字母转为大写,并在获取的属性名拼接上 "get" 字符串,

第十四步:测试插入数据

        1. 测试使用封装好的 insert 插入数据

                (1) 只需要提供实体类 POJO、godbatis-config.xml、sqlMapper.xml 即可完成数据插入
                (2) 存在一个问题:java.sql.SQLException: Can't call commit when autocommit=true
    插入测试成功。

第十五步:selectOne 方法的实现

        1. 执行查询语句,返回一个对象。该方法只适合返回一条记录的 sql 语句。
        2. 大概流程:

                (1) 建立连接对象
                (2) 创建封装 sql 信息的 MappedStatement 封装类
                (3) 对 sql 语句进行预处理:
                            a:把 sql 语句的占位符替换成 ?
                            b:把 sql 语句预编译
                (3) 在 sql 信息的封装类中获取用户提供的 sql 语句以及 sql 语句执行后的返回类类型(resultType),并获取返回结果集。
                (4) 如果返回结果集中有数据,则利用返回类型用 Java 的反射机制 new 出无参构造的对象。

第十六步:结果集转换为对象

         1. 将查询结果的列名作为要添加值的对象的属性名
         2. 通过查询返回结果集获取其中的元数据的条数,并通过循环获取元数据中所有的方法名,把他们拼接成 set 方法。
         3. 将获取到的 set 方法调用 Java 反射的 invoke 方法对要返回 / 添加数据的对象添加数据。

第十七步:测试查询数据

    1. 测试查询数据的时候只需要注意:

                (1) 插入的数据封装类的类型是 String 类型即可。

               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值