手写一个MyBatis框架

爱被打了一巴掌 2023-02-21 14:19 216阅读 0赞

手写一个MyBatis框架

  • MyBatis框架分析
  • 手写简单的MyBatis框架
      • Configuration
      • SqlSession
      • Executor
      • ExecutorImpl
  • 手写完整的MyBatis框架
      • Executor
          • ExecutorImpl

MyBatis框架分析

  • MyBatis框架结构图:
    在这里插入图片描述
  • MyBatis框架组件调用关系图:
    在这里插入图片描述
  • MyBatis框架运行时序图:
    在这里插入图片描述

手写简单的MyBatis框架

  • 根据框架组件调用关系图开发Mybatis框架代码

    • 一个组件实体就对应一个实体类

Configuration

  1. public class Configuration {
  2. public <T> T getMapper(Class<T> clazz, SqlSession sqlSession) {
  3. return <T> Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{ clazz}, new MapperProxy(sqlSession));
  4. }
  5. }

SqlSession

  1. public class SqlSession {
  2. private Configuration configuration;
  3. private Executor executor;
  4. /** * 通过构造函数建立Configuration以及Executor和SqlSession的关系 */
  5. public SqlSession(Configuration configuration, Executor executor) {
  6. this.configuration = configuration;
  7. this.executor = executor;
  8. }
  9. /** * getMapper * @param clazz */
  10. public <T> getMapper(class<T> calzz) {
  11. return configuration.getMapper(calzz, this);
  12. }
  13. /** * selectOne * * @param statement SQL语句 * @param parameter SQL参数 * @return <T> T 查询结果 */
  14. public <T> T selectOne(String statement, String parameter) {
  15. return executor.query(statement, parameter);
  16. }
  17. }

Executor

  1. public interface Executor {
  2. <T> T query(String statement, String parameter);
  3. }

ExecutorImpl

  1. public class ExecutorImpl implements Executor {
  2. @Override
  3. public <T> T query(String statement, String parameter) {
  4. Connection connection = null;
  5. PreparedStatement preparedStatement = null;
  6. try {
  7. Class.forName("com.mysql.cj.jdbc.Driver");
  8. connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db?useUnicode=true&characterEncoding=utf-8");
  9. String sql = String.format(statement, Integer.parseInt(parameter));
  10. PreparedStatement ps = connection.prepareStatement(sql);
  11. ResultSet rs = ps.executeQuery();
  12. while (rs.hasNext()) {
  13. test = new Test();
  14. test.setId(rs.getInt(1));
  15. test.setNum(rs.getInt(2));
  16. test.setName(rs.getString(3));
  17. }
  18. } catch (ClassNotFoundException e) {
  19. e.printStackTrace();
  20. } finally {
  21. try {
  22. if (null != connection) {
  23. connection.close();
  24. }
  25. } catch (SQLException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. return (T)test;
  30. }
  31. }

手写完整的MyBatis框架

  • 简单的MyBatis框架中的Executor采用JDBC实现,采用了硬编码的方式,一次只能操作一张表:


    while (rs.hasNext()) {

    1. test = new Test();
    2. test.setId(rs.getInt(1));
    3. test.setNum(rs.getInt(2));
    4. test.setName(rs.getString(3));

    }

Executor

ExecutorImpl
  1. public class ExecutorImpl implements Executor {
  2. private Configuration configuration;
  3. public ExecutorImpl(Configuration configuration) {
  4. this.configuration = configuration;
  5. }
  6. public Configuration getConfiguration() {
  7. return configuration;
  8. }
  9. public void setConfiguration(Configuration configuration) {
  10. this.configuration = configuration;
  11. }
  12. public <E> E query(MapperRegistry.MapperData, Object parameter) throws Exception {
  13. /* * 初始化 StatementHandler -> ParameterHandler -> ResultHandler */
  14. StatementHandler handler = new StatementHandler(configuration);
  15. return (E) handler.query(mapperData, parameter);
  16. }
  17. }

发表评论

表情:
评论列表 (有 0 条评论,216人围观)

还没有评论,来说两句吧...

相关阅读