1 Star 0 Fork 0

念兮 / simulatehibernate

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
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);
        }
    }
  1. 然后创建session会话,其实就是创建连接对象

这里用到Iterator类,它是所有容器的父接口,其内部有一个方法,那就是remove方法,在容器中删除当前对象

     /**
         * 获取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;
        }
  1. 在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);
        @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<ProjectData> projects = query.list();
                for (ProjectData project : projects) {
                    System.out.println(project.getCustomerName() + " " + project.getProjectName());
                }
            }
  2. 。。。。。。

安装教程

  1. 在下载好该代码后,确保电脑已经安装了mysql数据库、Navicat等数据库可视化工具、jdk等等。

空文件

简介

我们在开发的过程中,经常使用hibernate作为持久层的框架,因而,突发奇想地模拟hibernate这个框架,自己写个框架出来。这里去除了hibernate框架晦涩的地方,当做自己学习材料还是不错的。里面涉及到反射等等。 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/zbone/simulatehibernate.git
git@gitee.com:zbone/simulatehibernate.git
zbone
simulatehibernate
simulatehibernate
master

搜索帮助