JDBC到持久层框架mybatis简单封装思路

public static void main(String[] args) {
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        // 加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 驱动管理器获取数据库连接
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root","root");
        // 编写sql语句,?号表示占位符
        String sql = "select * from user where username = ?";
        // 创建preparedStatement
        preparedStatement = connection.getPreparedStatement(sql);
        // 设置查询参数
        preparedStatement.setString(0,"tom");
        // 向数据库发出执行sql,获得结果集
        resultSet = preparedStatement.executeQuery();
        // 遍历查询结果集
        while(resultSet.next()) {
            int id = resultSet.get("id");
            String username = resultSet.get("username"); 
            //封装User
        }
    } catch(Exception e) {

    } finally {
        //关闭资源
    }
}

观察上述JDBC代码,会发现如下几个问题:
1.数据库连接创建,释放资源频繁,造成资源浪费,影响系统性能。
2.存在硬编码,sql语句会和java代码编写到一起,并且sql语句的查询条件使用占位符传参数,一旦参数变化,sql变化,都是极其不易维护的。
3.结果集的解析也存在硬编码,比如解析列名,假如一个表有大量字段,光一个结果集的解析就是很大的工作量。再加上sql变化导致解析代码变化,系统不易维护,试想,如果将数据库数据封装成pojo对象,解析就比较容易了。

针对JDBC的以上缺点给出解决思路:
1.数据库的频繁连接释放,可以使用数据库的连接池初始化连接资源。
2.可以将sql语句写到xml文件中,这样java代码与sql语句分离。
3.使用反射,内省等底层技术,将数据库字段与java实体属性映射,做到操作实体就相当于操作数据库的目的。

简单框架设计。
请求端:主要是核心配置xml文件sqlMapConfig.xml配置比如环境数据源等信息,还有配置sql的mapper.xml文件。
框架端:
1.采用流的方式读取配置文件,存放到以下两个类中
Configuration:此类主要存放一些数据库配置信息,以及一个Map<唯一标记,Mapper> 唯一标识:namespace + id;
MappedStatement:对应mapper.xml配置文件,sql语句,statement类型,输出类型,输入参数类型等。
2.SqlSessionFactoryBuilder类:调用build方法,创建出sqlSessionFactory类,build()方法,主要干的事情就是利用dom4j解析配置文件,将解析出来的配置文件封装到Configuration类中,以及MappedStatement中。
3.sqlSession接口及实现类:sqlSessionFactory.openSession();会封装一些操作数据库的方法,主要封装crud方法,比如selectList(), selectOne()。
具体实现:封装JDBC完成对数据库表的查询操作

sqlSession中的getMapper方法就是用到了代理模式。被代理的类只有接口没有具体实现类,为什么要把被代理的类设计成接口,主要是因为java是单继承的,而生成的代理类是要继承Proxy的,所以设计成接口就可以避免掉这一问题。低层就是jdk的动态代理,反射技术。CGlib实现动态代理 好像是生成了被代理类的子类,从而实现功能增强的。
涉及到的设计模式:
Builder构建者设计模式、工厂模式、代理模式

简单记录用到的关键内容:
sqlMapConfig.xml,Mapper.xml , 流,InputStream,javaBean来存储配置信息,Configuration,Map<唯一标识,MappedStatement> 唯一标识:namespace + "."+id, MappedStatement,
一、.qlSessionFactoryBuilder,build()方法,dom4j 1.解析配置文件,封装Configuration 使用XMLConfigerBuilder,2.创建 sqlSessionFactory
二、XMLConfigerBuilder 与 XMLMapperBuilder
SqlSessionFactory,DefaultSqlSession
sqlSession,DefaultSqlSession,openSession()

Executor query SimpleExecutor query方法里:封装低层 JDBC BoundSql对sql进行处理,反射技术给占位符赋值。返回结果集的时候

未完待续。。。

推荐阅读更多精彩内容