H2数据库创建表源码分析

H2数据库表创建粗滤分析01

创建入口

@Test
	public void test_h2_mem() throws SQLException
	{
		JdbcConnectionPool ds = JdbcConnectionPool.create("jdbc:h2:mem:test3", "sa", "1");
//		JdbcConnectionPool ds = JdbcConnectionPool.create("jdbc:h2:E:/test2", "sa", "");
	    ds.setMaxConnections(1000);
	    
	    Connection conn = ds.getConnection() ;
	    Statement stat = conn.createStatement();
        // insert data (ddl)
	    String createTableSql = "";
	    createTableSql += "create table userInfo(								";
	    createTableSql += "    id int(4) not null primary key auto_increment, 	";
	    createTableSql += "    name char(20) not null,                        	";
	    createTableSql += "    sex int(4) not null default '0',               	";
	    createTableSql += "    degree double	                            	";
	    createTableSql += ");                                                 	";
	    //进入
	    stat.execute( createTableSql );

JdbcStatement中的execute方法

@Override
    public boolean execute(String sql) throws SQLException {
        try {
            debugCodeCall("execute", sql);
            //调用下面的私有方法
            return executeInternal(sql);
        } catch (Exception e) {
            throw logAndConvert(e);
        }
    }

    private boolean executeInternal(String sql) throws SQLException {
        int id = getNextId(TraceObject.RESULT_SET);
        checkClosedForWrite();
        try {
            closeOldResultSet();
            sql = JdbcConnection.translateSQL(sql, escapeProcessing);
            //获取command接口
            CommandInterface command = conn.prepareCommand(sql, fetchSize);
            boolean lazy = false;
            boolean returnsResultSet;
            synchronized (session) {
                setExecutingStatement(command);
                try {
                    if (command.isQuery()) {
                        returnsResultSet = true;
                        boolean scrollable = resultSetType != ResultSet.TYPE_FORWARD_ONLY;
                        boolean updatable = resultSetConcurrency == ResultSet.CONCUR_UPDATABLE;
                        ResultInterface result = command.executeQuery(maxRows, scrollable);
                        lazy = result.isLazy();
                        resultSet = new JdbcResultSet(conn, this, command, result, id,
                                closedByResultSet, scrollable, updatable);
                    } else {
                        returnsResultSet = false;
                        //调用command
                        updateCount = command.executeUpdate();
                    }
                } finally {
                    if (!lazy) {
                        setExecutingStatement(null);
                    }
                }
            }
            if (!lazy) {
                command.close();
            }
            return returnsResultSet;
        } finally {
            afterWriting();
        }
    }

创建表的语句 updateCount = command.executeUpdate(); debug进去找到return update()

//类名CommandContainer
//command类中的代码有点多就不贴了直接进CommandContainer
@Override
    public int update() {
        recompileIfRequired();
        setProgress(DatabaseEventListener.STATE_STATEMENT_START);
        start();
        session.setLastScopeIdentity(ValueNull.INSTANCE);
        prepared.checkParameters();
        //返回更新的行数
        int updateCount = prepared.update();
        prepared.trace(startTimeNanos, updateCount);
        setProgress(DatabaseEventListener.STATE_STATEMENT_END);
        return updateCount;
    }

代码有点长就把主要的代码入口贴上了
int updateCount = prepared.update();从这段代码进入到CreateTable 中的update方法


Table table = getSchema().createTable(data);

进入到了Schema中的createTable 方法

public Table createTable(CreateTableData data) {
        //线程锁
        synchronized (database) {
            if (!data.temporary || data.globalTemporary) {
                database.lockMeta(data.session);
            }
            data.schema = this;
            if (data.tableEngine == null) {
                DbSettings s = database.getSettings();
                if (s.defaultTableEngine != null) {
                    data.tableEngine = s.defaultTableEngine;
                } else if (s.mvStore) {
                    //
                    data.tableEngine = MVTableEngine.class.getName();
                }
            }
            if (data.tableEngine != null) {
                if (data.tableEngineParams == null) {
                    data.tableEngineParams = this.tableEngineParams;
                }
                //从这进去使用表引擎创建表 继续往下看
                return database.getTableEngine(data.tableEngine).createTable(data);
            }
            return new RegularTable(data);
        }
    }

终于找到了位置

@Override
    public TableBase createTable(CreateTableData data) {
        Database db = data.session.getDatabase();
        
        Store store = init(db);
        MVTable table = new MVTable(data, store);
        table.init(data.session);
        //将数据放到了tableMap中
        store.tableMap.put(table.getMapName(), table);
        return table;
    }
//一个Map
final ConcurrentHashMap<String, MVTable> tableMap =
                new ConcurrentHashMap<String, MVTable>();

以上为大体步骤省了许多细节比如: 如何分解创建表的语句

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值