前言
本案例自定义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 + '\''