import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List; // 定义一个接口,该接口对应数据库表的操作 interface UserMapper { List<User> findAll(); } // 定义一个实体类,对应数据库表的字段 class User { private int id; private String name; // 构造方法、getter和setter省略 @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } } // 自定义一个InvocationHandler实现类,用于处理代理对象的方法调用 class MyInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 获取方法上的注解 Select select = method.getAnnotation(Select.class); if (select != null) { // 解析注解中的SQL语句 String sql = select.value(); // 执行SQL查询 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password"); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); // 将结果集转换为对象列表 List<User> userList = new ArrayList<>(); while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); userList.add(user); } // 返回查询结果 return userList; } return null; } } // 自定义一个注解,用于标记SQL语句 @interface Select { String value(); } public class MyBatisFrameworkDemo { public static void main(String[] args) { // 使用动态代理生成UserMapper的代理对象 UserMapper userMapper = (UserMapper) Proxy.newProxyInstance(UserMapper.class.getClassLoader(), new Class<?>[]{UserMapper.class}, new MyInvocationHandler()); // 调用代理对象的方法,实际上会执行InvocationHandler的invoke方法 List<User> userList = userMapper.findAll(); // 输出查询结果 for (User user : userList) { System.out.println(user); } } }


原文地址: https://www.cveoy.top/t/topic/qcZG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录