今でもあなたは私の光丶

自定义持久层框架

jdbc操作问题

传统的jdbc代码

public class MyJDBC {
    //定义数据库连接四要素:驱动名,url,用户名和密码
    private static String Driver="com.mysql.jdbc.Driver";
    private static String Url="jdbc:mysql://localhost:3306/test";
    private static String UserName="root";
    private static String PassWord="1234567";
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet result = null;
    User user = new User();
    public static void main(String[] args) {
        try {
            //1.加载jdbc驱动
            Class.forName(Driver);
            //2.获取数据库连接
            connection = DriverManager.getConnection(Url,UserName, PassWord );
            //3.获取预处理对象
            String sql = "select * from JDBCTest where id = ?";
            statement = connection.prepareStatement(sql);
            statement.setString(1,"1");
            //4.执行sql语句
            result=statement.executeQuery();
            //5.获取结果集取数据
            System.out.println("id"+" "+"name");
            while (result.next()){
                int id=result.getInt("id");
                String name=result.getString("name");
                user.setId = id;
                user.setName = name;
            }
            System.out.println(user);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //6.关闭连接
            result.close();
            statement.close();
            connection.close();
        }
    }
}

问题分析

  1. 代码 数据库连接
     //1.加载jdbc驱动
               Class.forName(Driver);
               //2.获取数据库连接
               connection = DriverManager.getConnection(Url,UserName, PassWord );
  • 数据库配置信息存在硬编码 解决办法:配置文件
  • 频繁创建释放数据连接 解决方法:连接池
  1. 代码 sql语句
               //3.获取预处理对象
               String sql = "select * from JDBCTest where id = ?";
               statement = connection.prepareStatement(sql);
               statement.setString(1,"1");
               //4.执行sql语句
               result=statement.executeQuery();
               //5.获取结果集取数据
               System.out.println("id"+" "+"name");
               while (result.next()){
                   int id=result.getInt("id");
                   String name=result.getString("name");
                   user.setId = id;
                   user.setName = name;
               }
  • sql语句、设置参数、获取结果集参数均存在硬编码问题 解决方法:配置文件
  1. 代码 映射对象
    while (result.next()){
                   int id=result.getInt("id");
                   String name=result.getString("name");
                   user.setId = id;
                   user.setName = name;
               }
               System.out.println(user);
  • 手动封装返回结果集,较为繁琐 解决方法:反射、内省技术
自定义持久层框架

设计思路

  • 使用端(项目)
  • 引入自定义持久层框架jar包
  • 提供部分配置信息,使用配置文件
    • sqlMapConfig.xml
    • 数据库配置信息
    • 存放mapper.xml的全路径
    • mapper.xml:sql配置信息、参数类型、返回值类型
  • 自定义持久层框架(工程)
  • 本质:对JDBC的封装,规避JDBC操作问题
  • 设计思路
    1. 加载配置文件 根据配置文件的路径,加载配置文件成
      字节输入流,存储在内存 创建Resource类 方法:getResourceAsSteam(String path)
    2. 创建两个javaBean容器对象 存放的就是对配置文件解析出来的内容
    • Configuration 核心配置类 存放的就是对sqlMapConfig.xm解析出来的内容
    • MapperStatement 映射配置类 存放对Mapper.xml解析出来的内容
    1. 解析配置文件:dom4j
    • 创建类:SqlSessionFactoryBuilder
      • 方法:build(InputStream in)
      • 流程
      • 使用dom4j解析配置文件,将解析出来的内容封装到容器对象中
      • 创建SqlSessionFactory对象:
        生产sqlSession:
        会话对象 使用了工程模式
    1. 创建SqlSessionFactory接口及实现DefaultSqlSessionFactory openSession():生产sqlSession
    2. 创建SqlSession接口及实现类DefaultSession 定义对数据库的crud操作
    • selectList()
    • selectOne()
    • update()
    • delete()
    1. 创建Executor接口及实现类SimpleExecutor实现类 query(Configuration,MapperStatement,Object… params):
      执行的就是JDBC代码
  • 问题分析
    1. Dao层使用自定义持久层框架,存在代码重复,整个操作过程模板重复
    • 加载配置文件
    • 创建SqlSessionFactory
    • 生产SqlSession
    1. statementId存在硬编码问题
    2. 解决思路:使用代理模式生成Dao层接口的代理实现

项目地址

发表评论

2 条评论 “自定义持久层框架”