自定义Mybatis框架思路总结

    JDBC的弊端:

        1.数据库信息硬编码到Java代码中

        2.sql语句硬编码到Java代码中

        3.JDBC步骤太过于繁琐


    使用端:

        提供  核心配置文件

                xml文件,数据库信息的配置信息

                        sql语句的配置文件信息


    框架端:

        首先,我们需要解析使用端提供的xml核心配置文件,解析完后以流的形式存在,

        不能将配信息以流的形式放在内存中,不好操作,我们可以创建JavaBean来储存。

        创建两个JavaBean来封装这些配置信息

        Mapper:

            sql              sql语句

            resultType        返回值类型的全限定类名

        Configuration:

            数据库的基本信息

            一个大的Map<唯一标识,Mapper>      唯一标识:namespace+"."+id


        好,封装完xml核心配置后,我们需要创建SqlSession来完成jdbc操作的CRUD

        习惯性来一个SqlSession接口,因为这样可以考虑使用JDK的动态代理

        创建SqlSession实现类impl  依赖Configuration 我们需要cfg来实现解析xml

        发现SqlSession实现类写的东西太多了,还想满足不同数据库的需求

        就想到了工厂  SqlSessionFactory  工厂可以产生很多不同的SqlSession

        SqlSession 就可以把解析xml的任务交给工厂,

        这样工厂也就依赖了Configuration

        创建工厂步骤也是很多

        工厂可以选择构建者模式  ----来一个SqlSessionFactoryBuilder

        在build的类中解析xml文件



                知识点:  类加载器.getResourceAsStream("")  返回inputStream  is  类型


    框架过程也可以先创建一个构建者builder-->工厂-->sqlsession-->实现类

            为了使用端的方便:

            1.xml                    -------->最普通的就是了

            2.xml 跟 代理对象        -------->使用端只需要一个接口就可以

                                            框架端:在SqlSession接口中添加getMapper(Class clazz) 方法为动态代理使用

                                            在实现类实现方法,

            3.注解 跟 代理对象




    其中:涉及到自己模糊的知识点有:


反射贯穿其中。


动态代理:


public <E> E getMapper(Class clazz) throws Exception {

        //创建incocationHandler

        MapperProxyFactory proxy = new MapperProxyFactory(this);

        //创建动态代理对象

        return (E)Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] {clazz}, proxy);

    }

}


/////////////////////////////////////////////////////

public class MapperProxyFactory implements InvocationHandler{


    private SqlSessionImpl sqlSession;


    public MapperProxyFactory(SqlSessionImpl sqlSession) {

        this.sqlSession=sqlSession;

    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //获取当前接口的全限定类名

        String className = proxy.getClass().getGenericInterfaces()[0].getTypeName();


        //invoke方法:就是在查询数据库

        String mapperId = className+"."+method.getName();

        return sqlSession.selectAll(mapperId);

    }


}





元数据:

        获取查询数据结果中的列名

            JDBC:封装结果集



        user  类

            username

            password


        结果集resultSet

            username : zhangsan

            password : 123


        借助元数据:

            查询出所有的列名

            查询出列的个数

            获取数据库表名

    //2.元数据

            ResultSetMetaData metaData = rs.getMetaData();

            //获取数据库中的字段个数

            int count = metaData.getColumnCount();


            //获取所有字段的名字放入list集合中

            List<String> countlist = new ArrayList<String>();

            for (int i = 1; i <= count; i ++ ) {

                countlist.add(metaData.getColumnName(i));

            }


            while (rs.next()) {

                //创建实体对象

                Object object = clazz.newInstance();

                //赋值

                for (String countName : countlist) {

                    for (Method method : methods) {

                        if(method.getName().equalsIgnoreCase("set"+countName)) {

                            method.invoke(object, rs.getObject(countName));

                        }

                    }

                }

                //放入list

                list.add(object);

            }



XML文件解析:


    1.创建SAXReader

    SAXReader reader = new SAXReader();

    2.获取document对象

    Document document = reader.read("");

    3.获取根节点

    Element root = document.getRootElement();

        //根节点

        定位节点:

        1.selectNodes  指定标签获取  "//标签名"

        eg: root.selectNodes("//property");

        2.element

        3.elements


        //解析节点中的内容

        1. text    获取标签中的内容

        2.attributeValue  根据标签书属性获取属性的取值

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,571评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 赚钱绝学思维全集30之(十八)——3 夏珲论《聪明与智慧的区别》 人不怕不聪明,就怕太聪明。微信176996761...
    夏珲阅读 163评论 0 0
  • 昨晚夜里,做一个我一直想要实现的梦。醒来之后,我期待着梦成真,便开机看看,是否真像梦中那样,然而,梦与现实之间的关...
    Reborn_L阅读 195评论 2 1