美文网首页我爱编程
自定义Mybatis框架思路总结

自定义Mybatis框架思路总结

作者: sanqi37 | 来源:发表于2018-04-10 14:25 被阅读0次

    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  根据标签书属性获取属性的取值

相关文章

  • 自定义Mybatis框架思路总结

    JDBC的弊端: 1.数据库信息硬编码到Java代码中 2.sql语句硬编码到Java代码中 ...

  • 新手如何快速简单自定义MyBatis框架

    MyBatis入门到自定义MyBatis框架 第一个 MyBatis 程序(XML配置) 在上一篇中,简单总结了一...

  • SSM项目搭建

    总结加套路,建立框架思路 先整合SS,在加入Mybatis 1.建立maven工程,搭建SSM环境 1.1 因为初...

  • Spring和MyBatis整合笔记

    对于 Spring 框架和 MyBatis 框架整合,摸爬滚打总结了这篇笔记,MyBatis 用 XML 文件替代...

  • 手动实现自己的ORM框架

    手动实现自己的ORM框架 一、Mybatis框架流程简介 二、梳理自己的Mybatis的设计思路 根据上文Myba...

  • Mybatis(一)

    Mybatis简介 MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了...

  • MyBatis技术总结

    MyBatis技术总结 分类:JavaEE框架技术原创文章作者: 张岩 什么是MyBatis?MyBatis 是一...

  • MyBatis基础搭建及架构概述

    MyBatis 是什么? MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。 MyBatis...

  • MyBatis入门

    MyBatis入门 MyBatis是一个第一类持久性框架,支持自定义SQL,存储过程和高级映射。MyBatis几乎...

  • Java SSM整合学习总结

    SSM学习总结 SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个...

网友评论

    本文标题:自定义Mybatis框架思路总结

    本文链接:https://www.haomeiwen.com/subject/toxnhftx.html