03【自定义mybatis框架】解析XML的工具类介绍


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、导入工具类

package com.gzlg.mybatis.utils;


import com.gzlg.mybatis.cfg.Configuration;
import com.gzlg.mybatis.cfg.Mapper;
import com.gzlg.mybatis.io.Resources;
import com.sun.org.apache.bcel.internal.generic.Select;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class XMLConfigBuilder {
//    解析主配置文件,把里面的内容填充到DefaultSqlSession所需要的地方
//使用技术:dom4j+path
    public static Configuration loadConfiguration(InputStream config){
        try {
//        定义封装连接信息的配置对象(mybatis的配置对象)
            Configuration cfg = new Configuration();
            //        1.获取SAReader对象
            SAXReader reder = new SAXReader();
            //        2.根据字节输入流获取Document对象;
            Document document = reder.read(config);
            //        3.获取根节点
            Element root = document.getRootElement();
            //        4.使用xpath中选择指定节点的方式,获取所有property节点
            List<Element> propertyElements = root.selectNodes("//property");
            //        5.遍历节点
            for (Element propertyElement : propertyElements) {
                //            判断节点是连接数据库的哪部分信息
                //            去除name属性值
                String name = propertyElement.attributeValue("name");
                if ("driver".equals(name)) {
                    //               表示驱动获取property标签value属性的值
                    String driver = propertyElement.attributeValue("value");
                    cfg.setDriver(driver);
                }
                if ("url".equals(name)) {
                    //                获取连接字符串
                    //                获取property标签value属性的值
                    String url = propertyElement.attributeValue("value");
                    cfg.setUrl(url);
                }
                if ("username".equals(name)) {
                    //                用户名
                    //                获取property标签value属性的值
                    String username = propertyElement.attributeValue("value");
                    cfg.setUsername(username);
                }
                if ("password".equals(name)) {
                    //                密码
                    //                获取property标签value属性的值
                    String password = propertyElement.attributeValue("value");
                    cfg.setPassword(password);
                }
            }
            //        去除mappers中所有mappper标签,判断他们使用了resource还是class属性
            List<Element> mapperElements = root.selectNodes("//mappers/mapper");
            //        遍历集合
            for (Element mapperElement : mapperElements) {
                //            判断mapperElement使用的是哪个属性
                Attribute attribute = mapperElement.attribute("resource");
                if (attribute != null) {
                    System.out.println("使用的是XML");
                    //                表示resource属性,使用的是XMl,取出属性值“com/gzlg/dao/IUserDao.xml
                    String mapperPath = attribute.getValue();
                    //                把映射配置文件的内容获取出来,封装成一个map
                    Map<String, Mapper> mappers = loadMapperConfiguration(mapperPath);
                    //                给configuration中的mappers赋值
                    cfg.setMappers(mappers);
                } else {
//                                    System.out.println("使用的是注解");
//                    //                表示没有resource属性,用的是注解
//                    //                获取class属性的值
//                                    String daoClassPath=mapperElement.attributeValue("class");
//                    //                根据daoClassPath获取封装的必要信息
//                                    Map<String,Mapper>mappers=loadMapperAnnotation(daoClassPath);
//                    //                给configuration中的mappers赋值
//                                    cfg.setMappers(mappers);
                }
            }
            //        返回configuration
            return cfg;
        }catch (Exception e){
            throw new RuntimeException(e);
        }finally {
            try {
                config.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    /**
     * 根据传入的参数,解析xml,并且封装到Map中
     * @param mapperPath   映射配置文件的位置
     * @return  map中包含了获取的唯一标识(key是由dao全限定类名和方法组成)
     * 以及执行所需的必要信息(value是一个Mapper对象,里面存放的是执行SQL语句和要封装的实体类全限定类名
     */
    private static Map<String, Mapper> loadMapperConfiguration(String mapperPath) throws IOException {
        InputStream in=null;
        try {
//            定义返回值对象(map比list查找速度快)
            Map<String,Mapper> mappers=new HashMap<String, Mapper>();
//            1.根据路径获取字节输入流
            in= Resources.getResourceAsStream(mapperPath);
//            2.根据字节输入流获取Document对象
            SAXReader reader=new SAXReader();
            Document document=reader.read(in);
//             3.获取根节点
            Element root=document.getRootElement();
//            4.获取根节点的namespace属性值
            String namespace=root.attributeValue("namespace");//是组成map中key的组成部分
//            5.获取所有的select节点
            List<Element> selectElements=root.selectNodes("//select");
//            6.遍历select节点集合
            for (Element selectElement:selectElements){
//                取出id属性值   组成map中key部分
                String id=selectElement.attributeValue("id");
//                取出resultType属性的值  组成map中key部分
                String resultType=selectElement.attributeValue("resultType");
//                取出文本内容sql语句
                String queryString=selectElement.getText();
//                创建key
                String key=namespace+""+id;
//                创建value
                Mapper mapper=new Mapper();
                mapper.setQueryString(queryString);
                mapper.setResultType(resultType);
//                把key和value存入mapper中
                mappers.put(key,mapper);
            }
            return mappers;
        } catch (DocumentException e) {
            e.printStackTrace();
        }finally {
            in.close();
        }
        return null;
    }
}
    /**
     * 根据传入的参数得到dao中所有被select注解标注的方法
     * 根据方法名称和类名,以及方法上注解value属性的值,组成Mapper的必要信息
     */
//    private static Map<String, Mapper> loadMapperAnnotation(String daoClassPath) {
////        定义返回值对象
//        Map<String,Mapper> mappers=new HashMap<String, Mapper>();
////        1.得到dao接口的字节码对象
//        Class daoClass=Class.forName(daoClassPath);
////        2.得到dao接口中的方法数组
//        Method[] methods=daoClass.getMethods();
////        3.遍历Method数组
//        for (Method method:methods){
////            取出每一个方法,判断是否有select注解
//            boolean isAnnotated=method.isAnnotationPresent(Select.class);
//            if (isAnnotated){
////                创建Mapper对象
//                Mapper mapper=new Mapper();
////                取出注解的Value属性值
//                Select selectAnno=method.getAnnotation(Select.class);
//                String queryString=selectAnno.value();
//                mapper.setQueryString(queryString);
////                获取当前方法的返回值,还要求必须带有泛型信息
//                Type type=method.getGenericReturnType();//list<User>
////                判断type是不是参数化的类型
//                if (type instanceof ParameterizedType){
////                    强转
//                    ParameterizedType ptype.getActualTypeArguments();
////                    得到参数化类型中的实际类型参数
//                    Type[] types=ptype.getActualTypeArguments();//
////                    取出第一个
//                    Class domainClass=(Class)types[0];
////                    获取domainClass的类名
//                    String resultType=domainClass.getName();
////                    给Mapper赋值
//                    mapper.setResultType(resultType);
//                }
////                组装key的信息,获取方法的名称
//                String methodName=method.getName();
//                String className=method.getDeclaringClass().getName();
//                String key=className+""+methodName;
////                给map赋值
//                mappers.put(key,mapper);
//            }
//        }
//        return mappers;
//    }
//}

二、使用步骤

1.导入daom4j坐标(pom.xml加入)

代码如下(示例):

<dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.6</version>
        </dependency>

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值