设为首页 加入收藏

TOP

day02-自己实现Mybatis底层机制-01(二)
2023-07-25 21:42:18 】 浏览:90
Tags:day02- Mybatis -01
,就不使用数据库连接池了,直接使用原生的connection 连接

package com.li.limybatis.sqlsession;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;

/**
 * @author 李
 * @version 1.0
 * 用来读取xml文件,建立连接
 */
public class MyConfiguration {
    //属性-类的加载器
    private static ClassLoader loader = ClassLoader.getSystemClassLoader();

    //读取xml文件并处理
    public Connection build(String resource) {
        Connection connection = null;
        try {
            //先加载配置文件 my-config.xml,获取对应的InputStream
            InputStream stream = loader.getResourceAsStream(resource);
            //解析 my-config.xml文件
            SAXReader reader = new SAXReader();
            Document document = reader.read(stream);
            //获取 xml文件的根元素 <database>
            Element root = document.getRootElement();
            System.out.println("root=" + root);
            //根据root解析,获取Connection
            connection = eva lDataSource(root);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    //解析 my-config.xml 的信息,并返回 Connection
    private Connection eva lDataSource(Element node) {
        if (!"database".equals(node.getName())) {
            throw new RuntimeException("root节点应该是<database>");
        }

        //连接DB的必要参数
        String driverClassName = null;
        String url = null;
        String username = null;
        String password = null;

        //遍历node下的子节点,获取其属性值
        for (Object item : node.elements("property")) {
            //i就是对应的 property节点
            Element i = (Element) item;
            //property节点的 name属性的值
            String name = i.attributeva lue("name");
            //property节点的 value属性的值
            String value = i.attributeva lue("value");

            //判断值是否为空
            if (name == null || value == null) {
                throw new RuntimeException("property节点没有设置name或value属性!");
            }
            switch (name) {
                case "url":
                    url = value;
                    break;
                case "username":
                    username = value;
                    break;
                case "driverClassName":
                    driverClassName = value;
                    break;
                case "password":
                    password = value;
                    break;
                default:
                    throw new RuntimeException("属性名没有匹配到..");
            }
        }
        //获取连接
        Connection connection = null;
        try {
            Class.forName(driverClassName);
            connection = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }
}

5.任务阶段2

阶段2任务:通过实现执行器机制,对数据表进行操作

5.1分析

我们把对数据库的操作封装到一套Executor机制中,程序具有更好的拓展性,结构更加清晰。这里我们先实现传统的方式连接数据库,即通过MyExecutor直接操作数据库。

image-20230223202152737

5.2代码实现

(1)生成 entity 类 Monster.java

package com.li.entity;

import lombok.*;

import java.util.Date;

/**
 * @author 李
 * @version 1.0
 * Monster类和 monster有映射关系
 *
 * 注解说明:
 * @Getter 给所有属性生成 getter方法
 * @Setter 给所有属性生成 setter方法
 * @ToString 生成toString方法
 * @NoArgsConstructor 生成一个无参构造器
 * @AllArgsConstructor 生成一个全参构造器
 * @Data 会生成上述除了无参/全参构造器的所有方法,此外还会生成equals,hashCode等方法
 */
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Monster {
    
    private Integer id;
    private Integer age;
    private String name;
    private String email;
    private Date birthday;
    private double salary;
    private Integer gender;
}

(2)Executor 接口

package com.li.limybatis.sqlsession;

/**
 * @author 李
 * @version 1.0
 */
public interface Executor {
    //泛型方法
    public <T> T query(String statement, Object parameter);
}

(3)执行器实现类 MyExecutor.java

package com.li.limybatis.sqlsession;

import com.li.entity.Monster;

impor
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何通过Java应用程序将 PDF转为W.. 下一篇一文详解 Netty 组件

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目