Java_17_Mybatis框架:自定义 mybatis 框架

前言

本案例自定义Mybatis框架,只实现数据查询功能。
增删改功能可以自己补充实现

反射和动态代理回顾

自定义Mybatis框架,在会话类会使用到反射和动态代理技术。

动态代理案例

需求:
1、创建一个接口:在接口定义一个方法:List<Student> findAll()
2、在不自定义接口实现类的情况下,调用接口中的方法

package com.itheima.反射和代理回顾;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
 * 需求:
 * 	1. 创建一个接口:在接口定义一个方法:List<Student> findAll()
 * 	2. 在不自定义接口实现类的情况下调用接口中的方法
 */
public class Demo01{
   
    public static void main(String[] args) {
   
        // 2. 在不自定义接口实现类的情况下调用接口中的方法
        Dao dao = getDao(); // getDao方法返回Dao接口实现类对象
        // 调用接口的方法
        List<Student> list = dao.findAll();
        for (Student stu : list) {
   
            System.out.println(stu);
        }
    }

    public static Dao getDao(){
   
        // 创建代理对象
        // 参数1:类加载器对象 AppClassLoader
        // 参数2:代理对象要实现的接口
        // 参数3:回调处理对象
        Dao proxy = (Dao) Proxy.newProxyInstance(
                Demo01.class.getClassLoader(),
                new Class[]{
   Dao.class},
                new InvocationHandler() {
   
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
                        List<Student> list = new ArrayList<>();
                        list.add(new Student());
                        return list;
                    }
                });
        return proxy;
    }
}

一、mybatis框架架构分析

在这里插入图片描述

二、框架技术分析

在这里插入图片描述

三、准备基础环境

1、创建项目

搭建项目目录如下
在这里插入图片描述

2、加入相关 jar 包

mybatis 框架包
mysql 数据库驱动包
log4j 日志包
C3PO 连接池包
dom4j 包
jaxen 包(dom4j使用XPath的必须包)

去掉mybatis框架包:mybatis-3.5.0.jar,自己手写mybatis
在这里插入图片描述
jaxen包:使用XPath以简化dom4j查找节点时必须导入jaxen包,否则会出现异常:NoClassDefFoundError: org/jaxen/JaxenException

四、编写 Mapper 类

Mapper 类用于封装 UserMapper.xml 文件内容。

1、分析映射文件 UserMapper.xml

在这里插入图片描述

2、Mapper类代码

package com.itheima.entity;
/**
 * 作用:用来封装接口映射文件的数据
 * 一个Mapper对象就封装一个select标签的数据
 */
public class Mapper {
   
    // id:方法名
    private String id;
    // 返回值类型
    private String resultType;
    // 标签体内容:要执行的SQL语句
    private String sql;
    // 名称空间
    private String namespace;

    public Mapper() {
   
    }

    public Mapper(String id, String resultType, String sql, String namespace) {
   
        this.id = id;
        this.resultType = resultType;
        this.sql = sql;
        this.namespace = namespace;
    }

    public String getId() {
   
        return id;
    }

    public void setId(String id) {
   
        this.id = id;
    }

    public String getResultType() {
   
        return resultType;
    }

    public void setResultType(String resultType) {
   
        this.resultType = resultType;
    }

    public String getSql() {
   
        return sql;
    }

    public void setSql(String sql) {
   
        this.sql = sql;
    }

    public String getNamespace() {
   
        return namespace;
    }

    public void setNamespace(String namespace) {
   
        this.namespace = namespace;
    }

    @Override
    public String toString() {
   
        return "Mapper{" +
                "id='" + id + '\'' +
                ", resultType='" + resultType + '\'' +
                ", sql='" + sql + '\''
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值