Hibernate O/R Mapping模拟
作为SSH中的重要一环,有必要理解一下Hibernate对 O/R Mapping的实现。
主要利用java的反射机制来得到完整的SQL语句。
准备工作:
1. Object
Student实体类:
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;
}
}
2. Relationship
_student表:
-- database: hibernate
create table _student(_id int primary key auto_increment,_age int,_name varchar(20));
3. 模拟O/R Mapping:
针对Student实体类的SessionStu (完成Student对象的持久化):
public class SessionStu {
private String tableName;
private Map<String, String> field2Column = new HashMap<String,String>();
private String[] fields;
public SessionStu() {
// 以下内容应当通过解析xml的方式build出来
// 该示例仅仅演示Hibernate的核心部分:O/R Mapping (利用反射得到完整sql)
tableName = "_student";
field2Column.put("id","_id");
field2Column.put("name","_name");
field2Column.put("age","_age");
fields = new String[field2Column.size()];
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void save(Student student) throws Exception {
// TODO Auto-generated method stub
String sql = createSQL();
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hibernate","root","");
PreparedStatement ps = conn.prepareStatement(sql);
ps = setParameters(ps,student);
ps.executeUpdate();
ps.close();
conn.close();
}
//important
private PreparedStatement setParameters(PreparedStatement ps, Student student) throws Exception{
for (int i = 0; i < fields.length; i++) {
String get_method = "get"+(char)(fields[i].charAt(0)-32)+fields[i].substring(1);
Method m = student.getClass().getMethod(get_method);
String type = m.getReturnType().getName();
String te = type.substring(type.lastIndexOf(".")+1);
switch (te) {
case "int":
ps.setInt(i+1, (int) m.invoke(student));
break;
case "String":
ps.setString(i+1, (String) m.invoke(student));
default:
break;
}
}
return ps;
}
private String createSQL(){
String columnsStr = "";
int index = 0;
for (String key : field2Column.keySet()) {
fields[index] = key;
columnsStr += (field2Column.get(key) + ",");
index++;
}
columnsStr = columnsStr.substring(0, columnsStr.length()-1);
String unknow = "";
for (int i = 0; i < field2Column.size(); i++) {
unknow += "?,";
}
unknow = unknow.substring(0,unknow.length()-1);
String sql = "insert into " + this.tableName + " (" + columnsStr +") values (" + unknow +")";
System.out.println(sql);
return sql;
}
}
4. Test:
public class TestSessionSave {
public static void main(String[] args) throws Exception {
Student student = new Student();
student.setAge(20);
student.setId(5);
student.setName("hibernate");
SessionStu ss = new SessionStu();
ss.save(student);
}
}
5. Done
Hibernate O/R Mapping模拟的更多相关文章
- hibernate 模拟实现和What is and Why O/R Mapping
What is and Why O/R Mapping What is : 用面向对象的方式调用api,类库帮我们翻译成面向关系的方式. Why: 1.JDBC操作数据库很繁琐2.Sql 语句编写并不 ...
- 理解O/R Mapping
本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping. 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型 ...
- Hibernate---O/R Mapping
1. JDBC数据库繁琐 2. sql语句不是面向对象 3. 可以在对象和关系表之间建立关联简化编程 4. O/R Mapping可以简化编程, 跨越数据库平台 比较流行的O/R Mapping Fr ...
- 什么是O/RMapping?为什么要用O/R Mapping?
什么是O/R Mapping ? O/R Mapping 就是有一大堆的类库,我们调用它的时候用面向对象的方式来调,它帮我们翻译成为面向关系的方式. 为什么要用O/R Mapping? 我们编程会更加 ...
- 什么是O/R Mapping(ORM)
ORM,即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一 ...
- [NHibernate]O/R Mapping基础
系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) 引言 对象和关系数据库 ...
- org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found :
可能原因: hibernate映射文件hibernate.cfg.xml中mapping中resource写错了文件名或者路径
- NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)
映射声明 对象/关系映射在XML文件中配置.mapping文件这样设计是为了使它可读性强并且可修改.mapping语言是以对象为中心,意味着mapping是围绕着持久化类声明来建立的,而不是围绕数据表 ...
- Hibernate O/R 映射
O/R 映射 目前为止我们已经通过应用 Hibernate 见识过十分基础的 O/R 映射了,但是还有三个更加重要的有关映射的话题需要我们更详细的探讨.这三个话题是集合的映射,实体类之间的关联映射以及 ...
随机推荐
- Vue.js学习 Item7 -- 条件渲染与列表渲染
v-if 在字符串模板中,如 Handlebars,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {{#if ok}} <h1>Yes</h1 ...
- SDUST作业10 Problem J: 提取缩略词
Description 在英文文献中,尤其是专业文献中,经常有很多的缩略词,如CPU代表Central Processing Unit等.为了方便学习,Qili决定从一批英文论文中提取出所有的缩略词以 ...
- MHA学习笔记
MHA是一款开源的MySQL高可用程序,为MySQL主从复制架构提供了节点故障转移功能,当 master发生故障时MHA会自动提升拥有最新数据的slave节点成为新的主节点,还提供了master节 点 ...
- ThinkPHP之中的图片上传操作
直接上个例子,其中包括有单图片文件上传.多图片文件上传.以及删除文件的一些操作.放置删除数据库的时候,仅仅删除掉了数据库之中的文件路径.而不是一并删除服务器之中的文件.放置服务器爆炸... TP里面c ...
- Laravel 安装predis 扩展
在安装predis扩展之前先安装composer,安装教程在https://getcomposer.org/download/: php -r "copy('https://getcompo ...
- C++读入两个参数
题目内容:编写程序计算两个整数的差. 输入描述:输入数据含有不超过50个整数对,每个整数队及每对整数的运算结果都不会超过231或-231. 输出描述:对于每次读入的一对整数,输出前者减去后者的差.每个 ...
- 计算两条直线的交点(C#)
PS:从其他地方看到的源码是有问题的.下面是修正后的 /// <summary> /// 计算两条直线的交点 /// </summary> /// <param name ...
- 6.python字符串-内置方法列举
所谓内置方法,就是凡是字符串都能用的方法,这个方法在创建字符串的类中,下面是总结: 首先,我们要学习一个获取帮助的内置函数 help(对象) ,对象可以是一个我们创建出来的,也可以是创建对象的那个类, ...
- Microsoft SqlServer2008技术内幕:T-Sql语言基础-读书笔记1
一.理论背景:关系模型,其数学理论是集合论和谓词逻辑. 1.集合论:集合定义是把我们直观或思维中确定的,相互间有明确区别的那些对象视为一个整体,这个整体就是集合. 2.谓词逻辑:谓词是判断对象是否有某 ...
- JAVA基础-子类继承父类实例化对象过程
之前在项目中碰到这样一个问题: 类B继承了类A,B在实例化的时候,A的构造方法中调用了B的某个方法,并且B的方法中对B的成员属性进行了初始化,然后最后得到的B对象的成员属性为空. 代码场景如下: 这里 ...