作为框架,是提供给使用方进行使用的,所以需要明确的给出使用条件,使用方需要提供什么内容,框架才可以正常使用呢?
    根据上面JDBC问题分析,使用方需要提供的内容如下:

    • 数据库信息的配置文件,包括使用的驱动包、连接信息等,暂时定为sqlMapperConfig.xml
    • Sql的配置信息,包括了sql、参数以及返回对象等,暂定为mapper.xml

    作为框架的创建者,我们需要根据使用方提供的信息来达到框架的功能,作为持久层就是执行sql,返回结果。本质就是对JDBC进行封装。框架要实现的功能点如下:

    • 读取配置文件,根据使用方提供的路径,来将配置文件转化为输入流,存储在内存中。这里我们创建Resource类,创建getResourceAsStream方法,方法的参数为path,也就是配置文件路径,返回参数为InputStream:InputStream getResourceAsStream(String path);
    • 读取完配置文件就需要对配置文件的内容进行解析封装,这里首先创建保存配置文件内容的对象,叫做容器对象:
      • Configration:核心配置类,用来存放数据库连接等配置信息,也就是sqlMapperConfig.xml的内容
      • MapperStatement:映射配置类,用来存放sql、参数以及返回对象信息,也就是mapper.xml的内容
    • 解析InputStream ,也就是解析xml文件,用来封装,上面只是创建了保存的容器,内容还未解析存放,解析xml使用dom4j,这里我们创建SqlSessionFactoryBuilder类,使用build方法,参数为InputStream,返回参数为SqlSessionFactory。
      • dom4j解析xml文件,封装容器。
      • 生产SqlSessionFactory对象,这个对象用来生产SqlSession会话对象,用来执行具体的Sql等。工厂模式
    • 上面用到生产SqlSessionFactory对象,应该设计为接口,来实现更好的解耦,所以我们创建SqlSessionFactory接口和DefaultSqlSessionFactory实现类,这个类的目的主要就是为了生产SqlSession,根据不同的参数来生产SqlSession,重载特性。
    • 同样,SqlSession也定义为接口,提供默认的实现DefaultSqlSession,用来定义具体的增删改查操作。比如说 selectList()、selectOne()、update()、delete()
    • 有了SqlSession,我们就要使用执行器去进行执行,创建Executor接口和SimpleExecutor默认实现,提供query等方法来执行JDBC的具体代码,query的参数应该包括两个容器类用来获取数据库连接对象和执行的sql信息,以及不定长参数来传递sql执行需要的参数
      • query(Configuration, MapperStatement, Object…. params)

    其实到了SqlSessionFactory这一步,下面的步骤更多的是前人的经验,目的是为了使代码更健壮、更好的扩展和维护而使用的,自我看法。