手写一个简单的mybatis框架

 

本项目分为两部分,IPersistence为主体部分(包括连接数据库、动态sql的拼接、执行sql等功能),IPersistence_Test为测试部分。

  1. IPersistence_Test
  • 导入IPersistence
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>IPersistence</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
  • 使用
    输入图片说明
  1. IPersistence

项目启动时先加载sqlMapConfig.xml配置文件
输入图片说明
文件中包含了数据库连接信息,以及动态sql的mapper文件

使用dom4j将sqlMapConfig.xml中的数据库连接信息、以及动态sql(注意:每个sql都有一个唯一标识,起名规则为 namespace + id)解析出来,返回Configuration对象
输入图片说明
输入图片说明

通过DefaultSqlSessionFactory工厂对象创建Session会话,SqlSession中定义了相关操作,具体实现类DefaultSqlSession
输入图片说明

DefaultSqlSession类详解
构造器
通过外部传递一个Configuration对象,该对象中包含了数据库连接信息,以及动态sql解析信息

    public DefaultSqlSession(Configuration configuration) {
        this.configuration = configuration;
    }

查询列表(selectList)
先创建一个执行器SimpleExecutor对象,然后调用执行器的query方法进行查询
在query方法中按照java的常规数据库查询,得到的结果通过反射或者内省,根据数据库表和实体的对应关系,完成封装,并返回结果

    public <E> List<E> selectList(String statementid, Object... params) throws Exception {

        //将要去完成对simpleExecutor里的query方法的调用
        SimpleExecutor simpleExecutor = new SimpleExecutor();
        MappedStatement mappedStatement = configuration.getMappedStatementMap().get(statementid);
        List<Object> list = simpleExecutor.query(configuration, mappedStatement, params);

        return (List<E>) list;
    }

    public <E> List<E> query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws Exception {
        PreparedStatement preparedStatement = getStatement(configuration,mappedStatement,params);
        // 5. 执行sql
        ResultSet resultSet = preparedStatement.executeQuery();
        String resultType = mappedStatement.getResultType();
        Class<?> resultTypeClass = getClassType(resultType);

        ArrayList<Object> objects = new ArrayList<Object>();

        // 6. 封装返回结果集
        while (resultSet.next()){
            Object o =resultTypeClass.newInstance();
            //元数据
            ResultSetMetaData metaData = resultSet.getMetaData();
            for (int i = 1; i <= metaData.getColumnCount(); i++) {

                // 字段名
                String columnName = metaData.getColumnName(i);
                // 字段的值
                Object value = resultSet.getObject(columnName);

                //使用反射或者内省,根据数据库表和实体的对应关系,完成封装
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(columnName, resultTypeClass);
                Method writeMethod = propertyDescriptor.getWriteMethod();
                writeMethod.invoke(o,value);
            }
            objects.add(o);

        }
        return (List<E>) objects;

    }

 

 代码下载地址:https://gitee.com/zhurencong/persistence-mybatis

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值