关键字:
KingbaseES、JDBC
一、开启事务执行语句,如何回滚到某个语句执行前?
答:事务执行时,想要回滚到某个语句执行前,可以通过提前设置savepoint(保存点)来实现。当需要回滚时,执行rollback(Savepoint savepoint),就可以回滚到savepoint的位置,此时,从事务开始到该savepoint之间执行的内容将会保存。
使用savepoint()方法步骤总结如下:
1)查看连接数据库是否支持savepoint
获取数据库元信息,调用supportsSavepoints()方法,如果返回true表示支持保存点。
2)修改事务提交方式为非自动提交
在Connection对象中,调用setAutoCommit(boolean autoCommit)方法,参数autoCommit设置为false。
3)在事务中,按需要设置Savepoint,可以为多个
JDBC Connection API中提供了public Savepoint setSavepoint()和public Savepoint setSavepoint(String name)方法来支持设置保存点。
4)事务回滚时,使用savepoint指定回滚位置
在Connection对象中,调用rollback(savepoint)方法,回滚到对应的savepoint位置。参数savepoint可以是自定义的Savepoint对象,也可以是通过getSavepointId()方法获取的未命令savepoint所对应的ID。
补充:KES提供了自动设置savepoint功能,通过在连接时指定autosave=always,可以实现每一个查询前都自动设置savepoint,失败后也会回滚到savepoint。
二、如何在插入时返回自增主键的值?
答:在插入时想要获取自增主键的值,可以通过设置autoGeneratedKeys参数,使得INSERT语句执行时,自动增加的键值可以被获取。(autoGeneratedKeys)
主要方法步骤如下:
1)查看连接数据库是否支持执行语句后获取自动生成的键值获取数据库元信息,调用supportsGetGeneratedKeys()方法,返回true表示支持。
2)使用autoGeneratedKeys
使用Statement语句,在Statement对象中,调用executeUpdate(String sql, int autoGeneratedKeys)或者execute(String sql, int autoGeneratedKeys)方法,参数autoGeneratedKeys设置为RETURE_GENERATED_KEYS,表示需要返回主键。 使用PreparedStatement语句,使用Connection创建PreparedStatement实例时,添加autoGeneratedKeys参数:public PreparedStatement prepareStatement(String sql , int autoGeneratedKeys),autoGeneratedKeys同样设置为RETURE_GENERATED_KEYS。
3)使用getGeneratedKeys()方法获取自增建值
在结果返回之后,调用语句对象的Public ResultSet getGeneratedKeys()方法,获取返回结果。 补充:statement对象中,使用executeUpdate(String sql, int[] keyColumnIndexes)、executeUpdate(String sql, String[] keyColumnNames)、execute(String sql, int[] keyColumnIndexes), execute(String sql, String[] keyColumnNames) 时,调用 getGeneratedKeys(),返回由指定列构成的结果集。
三、如何获取数据库中所有表的信息?如何获取表中所有列的信息?
答:获取数据库中所有表信息和表中所有列的信息,可以通过查询DatabaseMetaData(数据库元信息)获取。
具体方法流程如下:
1)获取DatabaseMetaData
建立数据库连接,使用Connection对象中的getMetaData()方法获取连接数据库的元信息。
2)获取数据库中所有表信息
在DatabaseMetaData对象中,调用getTables()方法获取所有的或者条件指定的表信息。该方法有四个参数:String catalog(类别名称), String schemaPattern(模式名称的模式), String tableNamePattern(表名称模式), String[] types(要包括的表类型所组成的列表),通过设置以上参数可以获取需要的表信息。如获取所有表信息:getTables(null,null,null,null)。
3)获取表中所有列的信息
在DatabaseMetaData对象中,调用getColumns()方法获取指定表的列信息。该方法有四个参数:String catalog(类别名称),String schemaPattern(模式名称的模式),String tableNamePattern(表名称模式),String columnNamePattern(列名称模式),通过设置以上参数可以获取需要的列信息。如获取表所有列信息:getColumns(null,null,target_tableName,null)。
四、总结
1)学习KingbaeES客户端编程接口指南-JDBC,了解JDBC的连接、语句、结果集和元信息等基础结构。
2)针对以上问题,需要总结概括,要明确每个问题所涉及到的范围。