创建Student类
//Student.java
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
创建Test类
public class Test {
public static void main(String[] args) throws Exception{
Student stu = new Student(); //定义一个Student类对象
//设置属性值
stu.setId(3);
stu.setName("lishi");
stu.setAge(22);
//生成自定义的Session对象
Session session = new Session();
//执行Session类中的save方法
session.save(stu);
}
}
创建Session类
//模拟Hibernate中的Session实现的功能
public class Session {
String tableName = "_student"; //表名
Map<String,String> cfs = new HashMap<String, String>(); //字段名与属性一一对应的关系
String[] methodNames; //声明一个字符串数组,用来存储方法名
/**
* Session的构造方法
*/
public Session(){
cfs.put("id", "id");
cfs.put("name", "name");
cfs.put("age", "age");
methodNames = new String[cfs.size()];
}
/**
* 实现数据插入功能
* @param stu
* @throws Exception
*/
public void save(Student stu) throws Exception{
String sql = createSql(); //获取拼接完成的sql语句
Class.forName("com.mysql.jdbc.Driver"); //加载MySQL数据库驱动
//获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/hibernate","root", "wwj");
//创建PreparedStement对象
PreparedStatement ps = conn.prepareStatement(sql);
for(int i = 0; i < methodNames.length; i++) {
//利用Java的反射机制,获取对象的方法
Method m = stu.getClass().getMethod(methodNames[i]);
Class r = m.getReturnType(); //获取方法返回值类型
if(r.getName() == "java.lang.String"){ //如果返回值类型等于”java.lang.String"的话
String v = (String)m.invoke(stu); //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
ps.setString(i + 1, v); //将指定参数设置为给定 Java String 值。
}
if(r.getName() == "int"){
Integer v = (Integer)m.invoke(stu);
ps.setInt(i + 1, v);
}
System.out.println(m.getName() + "|" + r.getName());
}
ps.executeUpdate(); //执行sql语句更新数据库
ps.close(); //释放此PrepareStatement对象的数据库和JDBC资源
conn.close(); //关闭数据连接
}
/**
* 创建SQL语句
* @return
*/
private String createSql() {
//拼接字段
String str1 = "";
int index = 0;
for(String s : cfs.keySet()) {
String v = cfs.get(s);
v = Character.toUpperCase(v.charAt(0)) + v.substring(1);
methodNames[index] = "get" + v;
index++;
str1 += s + ",";
}
str1 = str1.substring(0, str1.length() - 1); //去掉最后面的逗号","
System.out.println(str1);
//拼接(?,?,?,?),问号的个数取决于map的长度
String str2 = "";
for(int i = 0; i < cfs.size(); i++){
str2 += "?,";
}
str2 = str2.substring(0, str2.length() - 1);
System.out.println(str2);
//拼接sql字符串
String sql = "Insert into " + tableName + "(" + str1 + ")" + "values" + "(" + str2 + ")";
System.out.println(sql);
return sql;
}
}
测试结果:
id,age,name
?,?,?
Insert into _student(id,age,name)values(?,?,?)
getId|int
getAge|int
getName|java.lang.String
hibernate模拟实现
最新推荐文章于 2025-07-28 23:27:29 发布