出现的原因

先来看一段jdbc连接mysql数据库进行查询的java代码

Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            DriverManager.getConnection("jdbc:mysql//192.168.2.240:3306/mybatis?characterEncoding=utf-8",
                    "root","root");
            String sql = "SELECT * FROM user WHERE user_name = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,"tom");
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                int id = resultSet.getInt("id");
                String useName = resultSet.getString("user_name");
            }
        }catch (Exception e){
            e.printStackTrace();
}

jdbc的问题

  • 数据库配置信息存在硬编码
    • 解决:使用配置文件
  • 频繁的创建和释放数据库连接资源
    • 解决:使用连接池
  • sql语句硬编码
    • 解决:使用配置文件存放sql
  • 手动封装结果集,较为繁琐
    • 解决:利用反射等机制自动封装结果

自定义思路

使用端:

项目使用自定义框架的jar包,提供数据库配置信息以及sql配置信息(语句,参数,返回值)
sqlMapConfig.xml 数据库配置信息,同时存放mapper.xml的全路径
mapper.xml sql配置信息

自定义持久层框架对jdbc的封装

  • 加载配置文件:根据配置文件的路径加载为输入流存储在内存中
    • 创建Resource类 方法 InputStream getResourceAsStream(String path)
  • 创建两个java bean,存放的就是对配置文件解析出来的内容
    • Configuration:核心配置类,存放SqlMapConfi.xml解析出来的
    • MapperStatement:映射配置类,存放mapper.xml解析出来的
  • 解析配置文件
    • 使用dom4j
    • 创建类:SqlSessionFactoryBuilder方法:build(InputStream in)
    • 使用dom4j解析配置文件,将解析出来的内容封装起来
    • 创建类SqlSessionFactory,生产sqlSession会话对象(工厂模式)
  • 创建SqlSessionFactory接口以及DefaultSqlSessionFactory实现类
    • openSession():用来生产sqlSession
  • 创建SqlSession接口以及实现类DefaultSqlSession
    • 定义对数据库的curd操作
  • 创建Executor接口以及实现类SimplExecutor
    • query(Configuration,MapperStatement,Object... params),执行jdbc代码

Q.E.D.