对于Hibernate的底层浅谈
哇,我发现忙起来真的是没有时间来写,最近在学框架,感觉特别有兴趣,对于框架的感激就是又恨又爱的感觉,hibernate,没有研究太深,模拟的写了一点底层的实现,其实就是发射吧,我没有追踪源码去看,就是简单的模拟,哈哈哈,反射出原始类型的没有写现在再追struts的底层,上次我还信誓旦旦的说,年前能写25篇,现在想说我错了,哈哈哈哈
好了,代码就写了一点,都是我猜的,如果有不对的,大神们求带
public class Session {
private static Map<String,String> map = new HashMap<String,String>();
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/demo";
private static final String username = "root";
private static final String password = "0610";
//模拟底层save
public void save(Object obj) throws Exception{
String sql = generateSQL(obj);//调用生成sql语句的方法
System.out.println(sql);//打印sql语句
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
Set<String> keys = map.keySet();
int i = 1;//表示占位符的索引
for (String key : keys) {
//获取属性对应的get方法
Method m = obj.getClass().getMethod(map.get(key));
//通过反射调用get方法获取属性的值,作为占位符的值
ps.setObject(i, m.invoke(obj));
i++;//占位符+1
}
ps.executeUpdate();//指定插入语句
}
/**
* 生成sql语句的方法
* insert into 表名(列名,列名,...) values(?,?,...)
* @param obj
* @return
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static String generateSQL(Object obj) throws Exception{
//获取实体类中所有的属性
Field[] fields = obj.getClass().getDeclaredFields();
//向map中存放键值对:键是属性名,也就是列名;值是属性get方法的名字
for(int i = 0;i < fields.length;i++){
map.put(fields[i].getName(), "get" +fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1));
}
String columns = "";//存储列名
String values = "";//存储?
Set<String> keys = map.keySet();
for (String key : keys) {
columns = columns + key + ",";//拼接列名
values = values + "?,";
}
//截取最后的逗号
if(columns.endsWith(",")){
columns = columns.substring(0, columns.length()-1);
values = values.substring(0,values.length()-1);
}
//获取实体类的表名
String tName = obj.getClass().getSimpleName();
//拼接sql语句
String sql = "insert into " + tName + "(" + columns + ") values(" + values + ")";
return sql;
}
//根据id生成sql语句
public String selectById(Class objClass) throws Exception{
//生成一个对象,
Constructor<?> construction =objClass.getConstructor();
Object object=construction.newInstance();
//获得所有的属性,
Field[] fields = objClass.getDeclaredFields();
for(int i = 0;i < fields.length;i++){
map.put(fields[i].getName(), "set" +fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1));
}
String columns = "";//存储列名
Set<String> keys = map.keySet();
for (String key : keys) {
columns = columns + key + ",";//拼接列名
}
//所有的属性的名字,
if(columns.endsWith(",")){
columns = columns.substring(0, columns.length()-1);
}
//获取实体类的表名
String tName = objClass.getSimpleName();
//拼接sql语句
String sql = " select " + columns + " from "+ tName +" where mid =? ";
return sql;
}
//根据class对象和id进行查询
public Object get(Class<?> objClass,Long id) {
Constructor<?> cons=null;
Object obj=null;
try {
cons = objClass.getConstructor();
obj=cons.newInstance();
String sql = selectById(objClass);//调用生成sql语句的方法
System.out.println(sql);//打印sql语句
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
//执行方法进行获得结果集
ps.setObject(1, id);
//进行查询
ResultSet rs = ps.executeQuery();
while(rs.next()){
//对对象进行封装
Set<String> keys = map.keySet();
for (String key : keys) {
Object o= rs.getObject(key);
Method m = objClass.getMethod(map.get(key),new Class<?>[]{o.getClass()});
//执行对象的set方法
m.invoke(obj,o);
}
}
System.out.println(obj);
} catch (Exception e) {
}
return obj;
}
//根据id进行删除
public void delete(Object obj){
//根据id进行删除
Class objClass=obj.getClass();
String sql="";
//获取对象的id
Field[] fields = objClass.getDeclaredFields();
for(int i=0;i<fields.length;i++){
if("mid".equalsIgnoreCase(fields[i].getName())){
//进行执行删除操作
String name = objClass.getSimpleName();
//获得该属性的值,
String setterName="get" +fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1);
//获得getter的方法
Method method;
try {
method = objClass.getMethod(setterName);
Object id = method.invoke(obj);
sql=" delete from "+name+" where mid= ? ";
System.out.println(sql);
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
//执行方法进行获得结果集
ps.setObject(1, id);
ps.executeUpdate();
System.out.println("删除成功");
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
//删除main方法测试
public static void main(String[] args) {
Session session=new Session();
Object object = session.get(Customer.class, 1L);
session.delete(object);
}
/*//查询main方法进行测试
public static void main(String[] args) {
Session session =new Session();
try {
Object object = session.get(Customer.class, 1L);
} catch (Exception e) {
e.printStackTrace();
}
}*/
//添加的测试
/*public static void main(String[] args) throws Exception {
Session session = new Session();
Customer customer = new Customer();
customer.setMid(1111L);
customer.setName("阿里巴巴");
customer.setAddress("杭州");
session.save(customer);
}
*/
}
对于Hibernate的底层浅谈的更多相关文章
- 【Hibernate 7】浅谈Hibernate的缓存机制
一.Hibernate缓存机制简介 对于Hibernate本身来说,它的缓存主要包括三部分:session缓存(一级缓存).二级缓存.查询缓存. 1.1,session缓存 随着session的关闭而 ...
- Hibernate更新部分字段浅谈
update语句是在Hibernate的Configuration的时候生成的,不能动态改变.为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题 ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
- 浅谈 Java 主流开源类库解析 XML
在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...
- [转帖]浅谈IOC--说清楚IOC是什么
浅谈IOC--说清楚IOC是什么 Need Study https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1. ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
- 浅谈Hybrid技术的设计与实现第二弹
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...
- 浅谈Hybrid技术的设计与实现
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...
- Spring缓存框架原理浅谈
运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...
随机推荐
- WPF 设置输入只能英文
有时输入只能让用户输入英文,那么如何设置输入只能英文? 首先在xaml 写一个 TextBox ,给他一个名字. <TextBox x:Name="txt"></ ...
- Java方法使用的有点总结
方法使用的优点: 1-将解决问题的方法与主函数代码分开,逻辑更清晰,代码可读性更强. 2-若方法出错,则程序可以缩小为只在该方法中查找错误,使代码更容易调试. 3-方法是解决一类问题的抽象,一旦写成功 ...
- 读书笔记之《深入理解Java虚拟机》不完全学习总结
写在前面: 之所以称作不完全总结,因为我其实没有完完全全地看完此书,但是涵盖了大部分重要章节:同时以下总结是我自己认为很重要知识,细枝末节处难免遗漏,还请详细参考原著. 转载请注明原文出处:http: ...
- C# AOP 面向切面编程之 调用拦截
有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...
- 【20171026早】alert(1) to win - 第六、七、八题
早上7点起床,又写了一篇小说发在了起点网上,有兴趣的可以看看.点击这里 忙完后,继续练习,刚开始发现自己答题的速度有些慢,可能是因为对于html,javascript知识不是很精通,但是话又说回来,谁 ...
- SQL&SQLite
注册博客园有一年多了,每次都是来找点资料,从来没有写过点什么,促使我开始写博客的原因主要有两点 一是在查找资料的过程中,经常需要重复的查找某个知识点,一个知识点时间长了之后总是忘记,这样重复的过程却是 ...
- appium测试代码nullpoint
今天写了个简单向上滑动,执行到向上滑动操作,报nullpoint异常,经过各种乱碰终于解决了,现记录一下过程,以备以后参考! 环境背景:java+testng+appium 在@Test下调用 dir ...
- Kotlin——最详解的类(class)的使用
在任何一门面向对象编程的语言里,类(class)是非常基础.但也是非常重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是我们生成的类.Kotlin也是如此,下面详细为大家介绍Kotlin中的类的 ...
- web前端工程师全套教程免费分享
这是我自己早前听课时整理的前端全套知识点,适用于初学者,也可以适用于中级的程序员,你们可以下载下来.我自认为还是比较系统全面的,可以抵得上市场上90%的学习资料.讨厌那些随便乱写的资料还有拿出来卖钱的 ...
- Bower+grunt-wiredep自动注入包到html
以安装jquery为例 1.假设已经通过npm安装好了bower和grunt-wiredep,以及grunt-contrib-watch(用来观察文件变动) 在gruntfile.js文件中增加任务 ...