哇,我发现忙起来真的是没有时间来写,最近在学框架,感觉特别有兴趣,对于框架的感激就是又恨又爱的感觉,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的底层浅谈的更多相关文章

  1. 【Hibernate 7】浅谈Hibernate的缓存机制

    一.Hibernate缓存机制简介 对于Hibernate本身来说,它的缓存主要包括三部分:session缓存(一级缓存).二级缓存.查询缓存. 1.1,session缓存 随着session的关闭而 ...

  2. Hibernate更新部分字段浅谈

    update语句是在Hibernate的Configuration的时候生成的,不能动态改变.为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题 ...

  3. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  4. 浅谈 Java 主流开源类库解析 XML

    在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...

  5. [转帖]浅谈IOC--说清楚IOC是什么

    浅谈IOC--说清楚IOC是什么 Need Study https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1. ...

  6. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  7. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  8. 浅谈Hybrid技术的设计与实现

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...

  9. Spring缓存框架原理浅谈

    运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...

随机推荐

  1. win10 uwp 打开文件管理器选择文件

    本文:让文件管理器选择文件,不是从文件管理器获得文件. 假如已经获得一些文件,那么如何从文件管理器选择这些文件? 使用方法很简单. 从网上拿图来说 打开文件夹自动选择所有文件 首先需要获得文件夹,因为 ...

  2. asp.net C# 实现微信接口权限开发类

    当前微信接口类已实现以下接口,代码上如果不够简洁的,请自行处理. 1.获取access_token 2.获取用户基本信息 3.生成带参数二维码 4.新增永久素材 5.新增临时素材 6.发送微信模版 7 ...

  3. 我的第一个python web开发框架(10)——工具函数包说明(一)

    PS:原先是想直接进入功能开发,要用到什么函数时再创建,这样也容易熟悉每个函数的由来和使用方法,但考虑到这样操作,到时会经常在不同文件间切换,不好描述,容易造成混乱,所以还是使用函数库这种方式来说明. ...

  4. 自学ConcuurentHashMap源码

    自学ConcuurentHashMap源码 参考:https://my.oschina.net/hosee/blog/675884 http://www.cnblogs.com/ITtangtang/ ...

  5. 深入理解Java虚拟机--上

    深入理解Java虚拟机--上 第2章 Java内存区域和内存溢出异常 2.2 运行时数据区域 图 2-1 Java虚拟机运行时数据区 2.2.1 程序计数器 程序计数器可以看作是当前线程所执行的字节码 ...

  6. PhiloGL学习(3)——程序员的法宝—键盘、鼠标

    前言 上一篇文章中介绍了如何让对象动起来,本文介绍如何让场景响应我们的鼠标和键盘以控制场景的缩放及对象的转动和移动等. 一. 原理分析 有了上一篇文章的基础,我们已经知道了如何让场景和对象动起来.本文 ...

  7. datagrid参数queryParams--easyUI

    datagrid参数queryParams--easyUI Html          <div  region="center" border="false&qu ...

  8. input框内的单引号,双引号转译

    主要是在后台传前端之前先把变量值替换单引号双引号成转译付. $bianlian是要替换的变量 两种方法 1.php后台输出值先转译 //双引号替换成转译符 $bianlian=preg_replace ...

  9. Appium python自动化测试系列之日志的收集(十二)

    ​13.1 日志的定义 13.1.1 日志的定义 听到日志这个东西可能有的人莫名其妙,第一次接触就会觉得我们为什么要收集日志,即使要收集日志那么我们需要收集哪些日志,日志的作用是什么等等. 其实日志无 ...

  10. lynx---CentOS终端访问IP

    1.官网 http://lynx.isc.org 2.稳定版本 http://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.8rel.2.ta ...