简单模拟Hibernate的主要功能实现

时间:2024-12-15 13:05:09

在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作。
这里就简单模拟其底层的实现。

/*******代码部分,及其主要注解**********************/
1、实体类User:

 public class User {
private int id;
private String username;
private String password; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

2、主体测试代码:

 public class TestHibernate {
public static void main(String[] args) throws Exception{
User user = new User();
user.setId(123);
user.setUsername("admin");
user.setPassword("admin"); //Configuration configuration = new Configuration();
//SessionFactory sessionFactory = configuration.configure().buildSessionFactory(); //Session session = sessionFactory.openSession();
//session.beginTransaction();
//其他的过程均省略,利用自定义的Seesion进行存储
Session session = new Session();
session.save(user);
//session.getTransaction().commit();
//session.close();
//sessionFactory.close(); } }

3、自定义的Seesion类:

 public class Session {

     //假设通过配置文件读出实体类对应的表
String tableName = "_user";
//模拟表属性与类属性的一一对应关系
Map<String,String> map = new HashMap<String, String>(); //每个属性对应一个get方法,methodNames存放所有方法名
String[] methodNames ;
//初始化
public Session(){
map.put("_id","id");
map.put("_username","username");
map.put("_password","password"); methodNames = new String[map.size()];
} public void save(User user)throws Exception{
String sql = createSQL(); Class.forName("com.mysql.jdbc.Driver");
Connection cnn = DriverManager.getConnection("jdbc:mysql://localhost/digtalheaven","root","7890");
PreparedStatement preparedStatement = cnn.prepareStatement(sql);
for(int i = 0; i < methodNames.length;i++){ //利用java的反射机制获取实体类属性的get方法
Method method = user.getClass().getMethod(methodNames[i]);
//获取返回类型
Class c = method.getReturnType(); //由于调用get方法返回值可能是"java.lang.String" "int "等不同的属性,所以要进行判断,再调用不同的jdbc语句执行方法
if(c.getName().equals("java.lang.String")){
String returnValue = (String)method.invoke(user);//执行方法,获得返回值
preparedStatement.setString(i+1,returnValue);
}
else if(c.getName().equals("int")){
Integer returnValue = (Integer)method.invoke(user);
preparedStatement.setInt(i+1,returnValue);
} } preparedStatement.executeUpdate();
preparedStatement.close();
cnn.close(); } //创建save方法对应的sql 语句: insert into _user(_id,_username,_password) values (?,?,?);
public String createSQL(){ String str2 = "";
for(int i = 0; i < map.size(); i++){
str2 += "?,";
}
str2 = str2.substring(0,str2.length()-1); //截掉最后一个逗号 String str1 = "";
int index = 0;
for(String i : map.keySet()){
//获取表属性对应的类的属性,然后拼出该属性的get对应的方法名字
//例如 getUsername();
String str = map.get(i); //例如获得表属性名 _username 对应的实体类属性名 username ;
str = "get" + Character.toUpperCase(str.charAt(0)) + str.substring(1,str.length());
methodNames[index++] = str;
str1 += i+",";
}
str1 = str1.substring(0,str1.length()-1); String sql = "insert into "+ tableName + "(" + str1 + ") values (" + str2 + ")"; return sql; }
}

4、在navicat查询数据库结果:

简单模拟Hibernate的主要功能实现