作为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模拟的更多相关文章

  1. hibernate 模拟实现和What is and Why O/R Mapping

    What is and Why O/R Mapping What is : 用面向对象的方式调用api,类库帮我们翻译成面向关系的方式. Why: 1.JDBC操作数据库很繁琐2.Sql 语句编写并不 ...

  2. 理解O/R Mapping

    本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping. 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型 ...

  3. Hibernate---O/R Mapping

    1. JDBC数据库繁琐 2. sql语句不是面向对象 3. 可以在对象和关系表之间建立关联简化编程 4. O/R Mapping可以简化编程, 跨越数据库平台 比较流行的O/R Mapping Fr ...

  4. 什么是O/RMapping?为什么要用O/R Mapping?

    什么是O/R Mapping ? O/R Mapping 就是有一大堆的类库,我们调用它的时候用面向对象的方式来调,它帮我们翻译成为面向关系的方式. 为什么要用O/R Mapping? 我们编程会更加 ...

  5. 什么是O/R Mapping(ORM)

    ORM,即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一 ...

  6. [NHibernate]O/R Mapping基础

    系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) 引言 对象和关系数据库 ...

  7. org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found :

    可能原因: hibernate映射文件hibernate.cfg.xml中mapping中resource写错了文件名或者路径

  8. NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)

    映射声明 对象/关系映射在XML文件中配置.mapping文件这样设计是为了使它可读性强并且可修改.mapping语言是以对象为中心,意味着mapping是围绕着持久化类声明来建立的,而不是围绕数据表 ...

  9. Hibernate O/R 映射

    O/R 映射 目前为止我们已经通过应用 Hibernate 见识过十分基础的 O/R 映射了,但是还有三个更加重要的有关映射的话题需要我们更详细的探讨.这三个话题是集合的映射,实体类之间的关联映射以及 ...

随机推荐

  1. Cron和Spring定时任务

    1.Java Spring spring定时任务cronExpression的值(配置定时时间)格式说明: 一个cronExpression表达式有至少6个(也可能是7个)由空格分隔的时间元素.从左至 ...

  2. Ajax的get请求向服务器请求数据五步骤?

    如下: ①创建ajax对象 ②建立http请求 ③发送http请求 ④设置ajax对象状态改变的回调函数 ⑤判断ajax状态是否等于4,做相应的业务逻辑

  3. PHP伪造referer突破防盗链

    php伪造referer实例代码,主要用于一些突破防盗链. 可以从这个例子中发展出很多的应用.比如隐藏真实的URL地址……嘿嘿,具体的就自己分析去吧 这里新建一个文件file.php.后面的参数就是需 ...

  4. Py Split and Count For "PFW Impact Crusher For Sale South Africa"

    data = 'As we all know, the impact Crusher is fully used in the transportation, energy, construction ...

  5. MySQL快速生产表的描述

    # mysql快速生成表的描述 SELECT column_name AS `列名`, CONCAT_WS(' (', data_type, character_maximum_length) AS ...

  6. OpenGL完整实例

    结合上一节的内容,分享完整代码. 先画一个cube,然后通过OnGestureListener去触发onFling使它旋转起来. OnGestureListener相关的方法我已经都加了注释,可以参考 ...

  7. HTML5简略介绍

    今天要说下 HTML5特有的一个元素 canvas ,旨在让web页面上作矢量图不需要在依靠flash或是其他插件,在网页上使用canvas元素时,它会创建一块矩形区域,默认300*150,当然也是可 ...

  8. [转]WinExec、ShellExecute和CreateProcess及返回值判断方式

    [转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/23924 ...

  9. 2. VS使用---HelloWorld

    摘要: ------------------------------------------------------------------------------------- 1. VS2010里 ...

  10. 53.转:深入浅出FPGA-14-ChipScope软件使用

    引言 索性再破例一下,成个系列也行. 内容组织 1.建立工程 2.插入及配置核 2.1运行Synthesize 2.2新建cdc文件 2.3 ILA核的配置 3. Implement and gene ...