用java代码手写一个简易版的mybatis框架详细的代码和注释要运用到反射技术
下面是一个简易版的MyBatis框架的代码示例,使用了反射技术:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MyBatisFramework {
// 数据库连接信息
private static final String JDBC_URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String JDBC_USERNAME = "root";
private static final String JDBC_PASSWORD = "password";
// 根据类和id查询数据
public static <T> T selectOne(Class<T> clazz, int id) throws SQLException {
String tableName = clazz.getSimpleName();
String sql = "SELECT * FROM " + tableName + " WHERE id = ?";
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD);
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, id);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
T obj = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String columnName = field.getName();
Object value = rs.getObject(columnName);
field.set(obj, value);
}
return obj;
}
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
// 插入数据
public static <T> void insert(T obj) throws SQLException {
Class<?> clazz = obj.getClass();
String tableName = clazz.getSimpleName();
String sql = "INSERT INTO " + tableName + "(";
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
sql += field.getName() + ",";
}
sql = sql.substring(0, sql.length() - 1) + ") VALUES (";
for (int i = 0; i < fields.length; i++) {
sql += "?,";
}
sql = sql.substring(0, sql.length() - 1) + ")";
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD);
PreparedStatement stmt = conn.prepareStatement(sql)) {
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Object value = fields[i].get(obj);
stmt.setObject(i + 1, value);
}
stmt.executeUpdate();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException {
// 测试代码
User user = new User();
user.setId(1);
user.setUsername("John");
user.setAge(25);
insert(user);
User retrievedUser = selectOne(User.class, 1);
System.out.println(retrievedUser.getUsername());
}
}
class User {
private int id;
private String username;
private int age;
// 省略getter和setter方法
// getter和setter方法
}
这个简易版的MyBatis框架实现了两个常用的功能:根据类和id查询数据、插入数据。它使用了反射技术,通过反射获取类的字段和方法,并使用这些信息来构建SQL语句、执行数据库操作。
在上面的示例中,我们使用了selectOne方法来根据类和id查询数据。它首先根据类的简单名称获取表名,然后构建SQL语句,并执行查询操作。在查询结果集中,使用反射将数据设置到对象的对应字段中。
同样地,insert方法使用反射来获取对象的字段和值,并构建插入数据的SQL语句,最后执行插入操作。
在main方法中,我们使用了User对象作为示例,并插入了一条数据,然后通过selectOne方法查询出来,并打印用户名。
请注意,这个示例只是一个简易版的MyBatis框架,实际的MyBatis框架还有更多的功能和复杂性。这个示例主要是为了演示使用反射技术实现简单的数据库操作
原文地址: http://www.cveoy.top/t/topic/ivtk 著作权归作者所有。请勿转载和采集!