前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从Hibernate原理实现知己之肤浅

从Hibernate原理实现知己之肤浅

作者头像
the5fire
发布2019-02-28 10:58:04
5190
发布2019-02-28 10:58:04
举报

看马士兵的hibernate教程,把Hibernate的原理通过java实现了一下,实现完成之后突然就想起去年我们用vb.net做机房收费系统的事了,当时把系统做完之后米老师说做的不满意,没有完全面向对象,因为关于数据库的操作不够面向对象。当时我觉得那个系统已经用了我们所有能用到的知识,再加上当时是学校考试期间,自己也没有深究。只是觉得老师要求很高,怎么能通过面向对象完成数据库操作呢?

不过后来学宇在我们上一期师哥的指点下使用类似Hibernate实现的原理实现了封装数据库的操作类,对外完全是面向对象,通过传递对象,内部得到对象名,对象属性,然后完成sql的拼接(使用sql参数拼接),最后组成一个sql语句。

现在突然想起那会儿的事是我觉得人不能固步自封,把自己封闭到自己已有的知识范围内,因为一个人所接触的东西毕竟有限,你的知识圈在大也是有边的。

对比一下以前的自己,发现当时确实是有点傲气。产生傲气的原因有两个:一个是你真的相当牛,在某一行业某一领域是专家;另一个是你真的比较肤浅,以为知道的不少,其实啥也不知道。这就是所谓的不知道自己不知道吧。

现在自己确实谦虚多了,能够感觉的到,因为发现自己不知道的越来越多了。以前觉得时间很充分,现在恨不得天天不睡觉。要时刻提醒自己,人只有不被自己的所学所羁绊才能不断成长。

好了,下面给出Hibernate原理简单实例,不过听老马讲,hibernate的原理并非如此,要真的是这样的话那效率就比较低了,本来操作数据库就不是件高效的事儿。

首先建立数据库,建立student表,id(int),name(varchar(20)), age(int)

然后建立对应的实体类。

建立一个Session类:

代码语言:javascript
复制
package com.hibernate.Mapping;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;

import com.hibernate.model.Student;

public class Session {
	String tableName = "Student";
	Map cfs = new HashMap();
	String[] methodNames ;

	public Session() {
		cfs.put("id", "id");
		cfs.put("name", "name");
		cfs.put("age", "age");
		methodNames = new String[cfs.size()];
	}

	public void save(Student s) throws Exception {
		String sql = createSQL();
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.100/hibernate" ,"root", "root");
		PreparedStatement ps = conn.prepareStatement(sql);

		for (int i = 0; i			Method m = s.getClass().getMethod(methodNames[i]);
			Class r = m.getReturnType();
			if (r.getName().equals("java.lang.String")) {
				String returnValue = (String)m.invoke(s);
				ps.setString(i+1, returnValue);
			}
			if (r.getName().equals("int")) {
				Integer returnValue = (Integer)m.invoke(s);
				ps.setInt(i+1, returnValue);
			}
		}
		ps.executeUpdate();
		ps.close();
		conn.close();
	}

	private String createSQL() {
		String str1 = "";
		String str2 = "";
		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;
			str1 += s + ",";
			index++;
		}
		str1 = str1.substring(0,str1.length() -1 );

		for (int i = 0; i < cfs.size(); i++) {
			str2 += "?,";
		}
		str2 = str2.substring(0, str2.length() - 1);

		String sql = "insert into " + tableName + "(" + str1 + ")" + " value (" + str2 + ")";
		System.out.println(sql);
		return sql;
	}
}

最后在StudentTest类中调用:

代码语言:javascript
复制
package com.hibernate.client;


import com.hibernate.Mapping.Session;
import com.hibernate.model.Student;

public class StudentTest {
	public static void main(String[] args) {
		Student s = new Student();
		s.setId(2);
		s.setName("s2");
		s.setAge(22);

		Session session = new Session();

		try {
			session.save(s);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


	}
}

里面主要用到了反射从类中得到数据库中的相关内容,然后拼接成sql语句。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-01-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档