在学习期间接触到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查询数据库结果: