# simulatehibernate **Repository Path**: zbone/simulatehibernate ## Basic Information - **Project Name**: simulatehibernate - **Description**: 我们在开发的过程中,经常使用hibernate作为持久层的框架,因而,突发奇想地模拟hibernate这个框架,自己写个框架出来。这里去除了hibernate框架晦涩的地方,当做自己学习材料还是不错的。里面涉及到反射等等。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-03-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # simulatehibernate #### 介绍 我们在开发的过程中,经常使用hibernate作为持久层的框架,因而,突发奇想地模拟hibernate这个框架,自己写个框架出来。 这里去除了hibernate框架晦涩的地方,当做自己学习材料还是不错的。里面涉及到反射等等。 这个项目中,你可以知道数据库连接池是怎么建的,又是怎么回收的。 使用警惕代码块加载配置文件 ### 详细介绍 请参看我的博客:https://segmentfault.com/a/1190000018535188 #### 软件架构 1. 本项目以idea为开发环境和以maven搭建的,分为java包和test包。java包的配置文件放在resources下,代码放在com.zby.simulationHibernate包下 2. 当项目启动时,就加载配置文件,根据配置文件的连接池的大小,来创建多个连接对象,放入缓存中,这就是连接池 ``` //静态代码块,初始化常量池 static { connections = new ArrayList<>(); Connection connection; for (int i = 0; i < Connect.minPoolSize; i++) { connection = connect.createConnect(); connections.add(connection); } } ``` 3. 然后创建session会话,其实就是创建连接对象 **这里用到Iterator类,它是所有容器的父接口,其内部有一个方法,那就是remove方法,在容器中删除当前对象** ```$xslt /** * 获取session * * @param autoCommit * @return */ private Session getSession(boolean autoCommit) { //【1】判断连接池有可用的连接对象 boolean hasNoValidConn = hasValidConnction(); //【2】没有可用的连接池,使用最大的连接池 if (!hasNoValidConn) { for (int i = 0; i < (Connect.maxPoolSize - Connect.minPoolSize); i++) { connections.add(connect.createConnect()); } } //【3】有可用的连接 for (Iterator iterator = connections.iterator(); iterator.hasNext(); ) { Connection connection = null; try { connection = (Connection) iterator.next(); connection.setAutoCommit(autoCommit); Session session = new Session(connection); iterator.remove(); return session; } catch (Exception e) { e.printStackTrace(); } } return null; } ``` 4. 在session中创建一系列的方法,比如createSQLQuery、merge、save、update、delete、search等方法, 这里重点说明merge方法,这个方法很神奇的,为什么这么说呢?这个要和主键id相关联 * 主键id存在 * 如果数据库存储当前id的对象,那么,则执行更新语句 * 如果数据库中没有当前id的对象,则执行插入语句 * 主键id不存在 * 直接执行插入语句 #### 示例 1. 使用查询语句,可以设置查询参数和返回数据过滤 * 查询参数:public SqlQuery setParamter(int start, Object param); * 过滤数据:public SqlQuery setTransformer(ResultTransformer transformer); ```$xslt @Ignore public void testList() { Session session = new SqlSessionFactory().openSession(); String sql = "SELECT " + " customer_name AS customerName, " + " `name` AS projectName " + "FROM " + " project where id >= ? and id <= ?"; SqlQuery query = session.createSqlQuery(sql); query.setParamter(0, 1); query.setParamter(1, 2); query.addScalar("customerName", StandardBasicTypes.STRING) .addScalar("projectName", StandardBasicTypes.STRING); query.setTransformer(Transforms.aliasToBean(ProjectData.class)); List projects = query.list(); for (ProjectData project : projects) { System.out.println(project.getCustomerName() + " " + project.getProjectName()); } } ``` 2. 。。。。。。 #### 安装教程 1. 在下载好该代码后,确保电脑已经安装了mysql数据库、Navicat等数据库可视化工具、jdk等等。