😀前言
本文将继续深入研究自己实现 MyBatis 底层机制的过程,特别关注任务阶段2 - 编写执行器与数据库操作。这个任务阶段是自定义 MyBatis 底层机制的关键一步,它涵盖了执行器的创建和 SQL 查询操作的实现,为我们的自定义框架提供了重要的数据库操作功能。
.
在本文中,我们将详细探讨如何编写执行器,如何输入 SQL 语句,并完成数据库操作。我们将使用一个名为 WyxExecutor 的执行器实现类,它将执行 SQL 查询并将结果封装为对象。这一步骤对于理解 MyBatis 内部工作原理以及构建自定义 MyBatis 底层框架非常重要。
🏠个人主页:尘觉主页
 
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
在csdn获奖荣誉: 🏆csdn城市之星2名
        💓Java全栈群星计划top前5
        🤗 端午大礼包获得者
        🥰阿里云专家博主
        😉亚马逊DyamoDB结营
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
 如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊
文章目录
深入实现 MyBatis 底层机制的任务阶段2 - 编写执行器与数据库操作
实现任务阶段 2- 编写执行器,输入 SQL 语句,完成操作
分析示意图


创建Monster类
解读
@Getter 就会给所有属性 生成对应的getter
@Setter 就会给所有属性 生成对应的setter
@ToString 生成 toString…
@NoArgsConstructor 生成无参构造器
@AllArgsConstructor 生成要给全参构造器
@Data 注解相当于
Getter, Setter, RequiredArgsConstructor, ToString, EqualsAndHashCode, Value注解
package com.wyxdu.entity;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
/**
 * Monster 和 monster表有映射关系
 *
 * 解读
 * @Getter 就会给所有属性 生成对应的getter
 * @Setter 就会给所有属性 生成对应的setter
 * @ToString 生成 toString...
 * @NoArgsConstructor 生成无参构造器
 * @AllArgsConstructor 生成要给全参构造器
 * @Data 注解相当于Getter, Setter, RequiredArgsConstructor, ToString, EqualsAndHashCode, Value注解
 * 如何选择主要还是看自己需要
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Monster {
    private Integer id;
    private Integer age;
    private String name;
    private String email;
    private Date birthday;
    private double salary;
    private Integer gender;
}
 
创建Executor.java类
public interface Executor {
    //泛型方法
    public <T> T query(String statement, Object parameter);
}
 
创建WyxExecutor实现类
package com.wyxdu.wyxmybatis.sqlsession;
import com.wyxdu.entity.Monster;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class WyxExecutor implements Executor {
    //属性
    private WyxConfiguration wyxConfiguration =
            new WyxConfiguration();
    /**
     * 根据 sql 查找结果
     *
     * @param sql
     * @param parameter
     * @param <T>
     * @return
     */
    @Override
    public <T> T query(String sql, Object parameter) {
        //得到连接Connection
        Connection connection = getConnection();
        //查询返回的结果集
        ResultSet set = null;
        PreparedStatement pre = null;
        try {
            pre = connection.prepareStatement(sql);
            //设置参数, 如果参数多, 可以使用数组处理.
            pre.setString(1, parameter.toString());
            set = pre.executeQuery();
            //把set数据封装到对象-monster
            //说明: 这里做了简化处理
            //认为返回的结果就是一个monster记录
            //完善的写法是一套反射机制.
            Monster monster = new Monster();
            //遍历结果集, 把数据封装到monster对象
            while (set.next()) {
                monster.setId(set.getInt("id"));
                monster.setName(set.getString("name"));
                monster.setEmail(set.getString("email"));
                monster.setAge(set.getInt("age"));
                monster.setGender(set.getInt("gender"));
                monster.setBirthday(set.getDate("birthday"));
                monster.setSalary(set.getDouble("salary"));
            }
            return (T) monster;
        } catch (Exception throwables) {
            throwables.printStackTrace();
        } finally {
            try {
                if (set != null) {
                    set.close();
                }
                if (pre != null) {
                    pre.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }
    //编写方法,通过WyxConfiguration对象,返回连接
    private Connection getConnection() {
        Connection connection =
                wyxConfiguration.build("wyx_mybatis.xml");
        return connection;
    }
}
 
测试效果
修改 WyxMyBatisTest测试类 增加方法
    @Test
    public void query() {
        Executor executor = new WyxExecutor();
        Monster monster =
                executor.query("select * from monster where id=?", 1);
        System.out.println("monster-- " + monster);
    }
 

😄总结
在本文中,我们成功完成了任务阶段2 - 编写执行器与数据库操作。我们创建了一个名为 WyxExecutor 的执行器实现类,该类负责接收 SQL 语句和参数,并执行数据库查询操作。通过详细的步骤和代码示例,我们展示了如何获取数据库连接、执行 SQL 查询,并将结果封装为对象。
这一关键步骤为我们的自定义 MyBatis 底层机制提供了核心功能,使我们能够与数据库进行交互。下一步,我们将继续深入研究 MyBatis 的内部工作原理,逐步构建更多关键组件,以实现一个完整的自定义 MyBatis 底层框架。希望本文对您的学习和项目开发有所帮助。
😍深入解析:自己实现 MyBatis 底层机制系列
第一篇–>深入剖析:自己实现 MyBatis 底层机制的步骤与原理解析
第二篇–>深入解析:自己实现 MyBatis 底层机制的任务阶段1 - 读取配置文件与建立数据库连接
第三篇–>深入实现 MyBatis 底层机制的任务阶段2 - 编写执行器与数据库操作
第四篇-> 深入实现 MyBatis 底层机制的任务阶段3 - 封装 SqlSession 到执行器
第五篇–>深入实现 MyBatis 底层机制的任务阶段4 - 开发 Mapper 接口和 Mapper.xml
第六篇–>深入实现 MyBatis 底层机制的任务阶段 5- 开发和 Mapper 接口相映射的 MapperBean
第七篇–>深入实现 MyBatis 底层机制的任务阶段 6-实现任务阶段 6- 在 WyxConfiguration, 读取 XxxMapper.xml,能够创建 MappperBean 对象
第八篇->深入实现 MyBatis 底层机制的实现任务阶段 7- 实现动态代理 Mapper 的方法
      
                       
                       
 😁热门专栏推荐
            
 想学习vue的可以看看这个 
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞