JAVA JDBC事务提交的疑问。

JAVA JDBC事务提交的疑问。,第1张

>>启动事务 connsetAutoCommit();

这个不是启动事务,而是设置事务是否自动提交,默认是自动提交,如果要手动控的话,写成connsetAutoCommit(false);

if(rsnext){

>>> 执行更新

conncommit();

}

这个也不对,RS不可能执更新 *** 作。只能是查询。

如果你进行了锁表 *** 作,那么如果没有commit()或rollbak()方法,是不会进行解锁 *** 作的。

下面给你些代码段以做参考。

public class SQLCondition{

public ResultSet execuQuery(Connection conn) throws SQLException{

检索 *** 作

}

public int execuUpdate(Connection conn) throws SQLException{

更新 *** 作

}

}

public class DBAccess(){

public void execute(){

SQLCondition condition = ;

Connection conn = ;

try{

connsetAutoCommit(false); //设成非自动提交

conditionexecuQuery(conn);

conditionexecuUpdate(conn);

//如果 *** 作成功会走到这一步,进行提交,可以解锁

conncommit();

}catch(SQLException){

//出现任何的SQL异常都可以捕捉到,进行事务回滚,也可以解锁。

connrollbak();

}

}

}

>>自动默认是回滚事务?

默认的话,是执行一条就进行提交,如果错了会回滚。

给你找了一段代码,我稍微加了点内容(服务名的内容)

另外,现在连接oracle用ojdbc6jar,不要用太老的什么class12jar什么的

/

  一个非常标准的连接Oracle数据库的示例代码

 /

public void testOracle()

{

    Connection con = null;// 创建一个数据库连接

    PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement

    ResultSet result = null;// 创建一个结果集对象

    try

    {

        ClassforName("oraclejdbcdriverOracleDriver");// 加载Oracle驱动程序

        Systemoutprintln("开始尝试连接数据库!");

        String url = "jdbc:oracle:thin:@127001:1521:XE";// 127001是本机地址,XE是精简版Oracle的默认数据库的SID

        // 如果是服务名,则用String url = "jdbc:oracle:thin:@127001:1521/ORCL

        String user = "system";// 用户名,系统默认的账户名

        String password = "147";// 你安装时选设置的密码

        con = DriverManagergetConnection(url, user, password);// 获取连接

        Systemoutprintln("连接成功!");

        String sql = "select  from student where name=";// 预编译语句,逗看地代表参数

        pre = conprepareStatement(sql);// 实例化预编译语句

        presetString(1, "刘显安");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引

        result = preexecuteQuery();// 执行查询,注意括号中不需要再加参数

        while (resultnext())

            // 当结果集不为空时

            Systemoutprintln("学号:" + resultgetInt("id") + "姓名:"

                    + resultgetString("name"));

    }

    catch (Exception e)

    {

        eprintStackTrace();

    }

    finally

    {

        try

        {

            // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源

            // 注意关闭的顺序,最后使用的最先关闭

            if (result != null)

                resultclose();

            if (pre != null)

                preclose();

            if (con != null)

                conclose();

            Systemoutprintln("数据库连接已关闭!");

        }

        catch (Exception e)

        {

            eprintStackTrace();

        }

    }

}

1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称INFORMATION_SCHEMATABLES Where TABLE_TYPE='BASE TABLE' 执行之后,就可以看到数据库中所有属于自己建的表的名称 2、查询SQL中所有表及列: Select dbosysobjectsname as Table_name, dbosyscolumnsname AS Column_name FROM dbosyscolumns INNER JOIN dbosysobjects ON dbosyscolumnsid = dbosysobjectsid Where (dbosysobjectsxtype = 'u') AND (NOT (dbosysobjectsname LIKE 'dtproperties')) 3、在Sql查询分析器,还有一个简单的查询方法: EXEC sp_MSforeachtable @command1="sp_spaceused ''" 执行完之后,就可以看到数据库中所有用户表的信息 4、查询总存储过程数:select count() 总存储过程数 from sysobjects where xtype='p' 附:xtype类型D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束L = 日志FN = 标量函数

IF = 内嵌表函数

P = 存储过程

PK = PRIMARY KEY 约束(类型是 K)

RF = 复制筛选存储过程S = 系统表TF = 表函数

TR = 触发器U = 用户表UQ = UNIQUE 约束(类型是 K)V = 视图X = 扩展存储过程 另:在sqlserver中取得某个数据库中所有表名的sql语句 select sysobjectsname from sysobjectsxtype ='U';SELECT name

WHERE (xtype = 'U') 在数据库的sysobjects表里有这个数据库全部表的信息, xtype值为'U'的就是表名 注意:一般通过上述方法获得全部用户表示都会有一个dtproperties表,SQLSERVER 默认它也是用户表,想要从用户表中排出,需要加上限定条件 status>0,即:select from sysobjects where xtype='U' and status>0

一、 通过SqlRowSetMetaData类

使用到的类或接口有如下几个:

orgspringframeworkjdbcsupportrowsetSqlRowSet接口:该对象和javaxsqlRowSet类相对应,它和RowSet的区别是SqlRowSet中的方法从来不会抛出SQLException异常,通过jdbcTemplate可以获得该对象的实例;

orgspringframeworkjdbcsupportrowsetSqlRowSetMetaData接口:是对应于SqlRowSet的元数据接口,和javasqlResultSetMetaData相一致,也只是从来不会抛出SQLException异常,通过SqlRowSet可以获得该类的实例;

具体使用实例如下:

SqlRowSet rowSet = jdbcTemplatequeryForRowSet("select  from user limit 0");  

SqlRowSetMetaData metaData = rowSetgetMetaData();  

int columnCount = metaDatagetColumnCount();  

for (int i = 1; i <= columnCount; i++) {    

    Map<String,String> fieldMap = new HashMap<String,String>();  

    fieldMapput("ColumnName", metaDatagetColumnName(i));  

    fieldMapput("ColumnType", StringvalueOf(metaDatagetColumnType(i)));  

    fieldMapput("ColumnTypeName", metaDatagetColumnTypeName(i));  

    fieldMapput("CatalogName", metaDatagetCatalogName(i));  

    fieldMapput("ColumnClassName", metaDatagetColumnClassName(i));  

    fieldMapput("ColumnLabel", metaDatagetColumnLabel(i));  

    fieldMapput("Precision", StringvalueOf(metaDatagetPrecision(i)));  

    fieldMapput("Scale", StringvalueOf(metaDatagetScale(i)));  

    fieldMapput("SchemaName", metaDatagetSchemaName(i));  

    fieldMapput("TableName", metaDatagetTableName(i));  

    fieldMapput("SchemaName", metaDatagetSchemaName(i));  

    Systemoutprintln(fieldMap);  

}

上述所用的信息都应列出来了,发现只有一些简单的信息,并没有涉及索引和其他约束等的信息。

二、通过RowCountCallbackHandler类

使用到的类或接口有如下几个:

orgspringframeworkjdbccoreRowCallbackHandler接口:用于处理结果集中的每一行数据;

orgspringframeworkjdbccoreRowCountCallbackHandler类:实现了RowCallbackHandler接口,其中简单的实现了对结果集元数据的获取,包括行数、列数、列名、列的类型等信息,顺便说一下这个类的实例只可以用一次;

在源代码中给出了简单的使用方式,如下:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);  // reusable object  

  

RowCountCallbackHandler countCallback = new RowCountCallbackHandler();  // not reusable  

jdbcTemplatequery("select  from user", countCallback);  

int rowCount = countCallbackgetRowCount();

所有能获得的信息如下:

String sql = "select  from user";  

RowCountCallbackHandler rcch = new RowCountCallbackHandler();  

jdbcTemplatequery(sql, rcch);  

          

Systemoutprintln("column count :" + rcchgetColumnCount());  

Systemoutprintln("column count :" + rcchgetRowCount());  

          

for(int i=0; i<rcchgetColumnCount(); i++){  

    Systemoutprintln("column name :" + rcchgetColumnNames()[i]);  

    Systemoutprintln("column type :" + rcchgetColumnTypes()[i]);  

}

输出如下:

从输出可以看出有一个问题,列的类型只能用数字来标识,这与javasqlTypes相对应,我们可以通过一下的程序来获得字符串的形式:

String getTypeName(int type) throws SQLException {  

        switch (type) {  

            case TypesARRAY:  

                break;  

            case TypesBIGINT:  

                return "BIGINT";  

            case TypesBINARY:  

                return "BINARY";  

            case TypesBIT:  

                return "BIT";  

            case TypesBLOB:  

                return "BLOB";  

            case TypesBOOLEAN:  

                return "BOOLEAN";  

            //  

        }

由以上可知,该类的方法有限,也只能获得列名和列的类型的信息,关于索引和约束等也没有涉及

没看出来错误,把我写的代码附上,希望能对你有点帮助吧

import javasqlConnection;

import javasqlDriverManager;

import javasqlSQLException;

public class DatabaseConnection {

/

功能:编写一个静态方法用于与数据库建立连接

输入参数:无

返回值:数据库连接对象

/

public static Connection getConnection(){

//定义一个连接对象

Connection conn=null;

//定义连接数据库的URL资源

String url="jdbc:oracle:thin:@19216839:1521:oracle";

//定义连接数据库的用户名称与密码

String username="faqsys";

String password="faqsysuser";

//加载数据库连接驱动

String className="oraclejdbcdriverOracleDriver";

try {

ClassforName(className);

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

//获取数据库的连接对象

try {

conn=DriverManagergetConnection(url,username,password);

Systemoutprintln("数据库连接建立成功");

} catch (SQLException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

//返回连接对象

return conn;

}

}

DriverManagergetConnection("jdbc:odbc:Driver={Microsoft Access Driver (mdb)};DBQ=E:/bookmdb");

或者

DriverManagergetConnection("jdbc:sqlserver://localhost:1433;databaseName=数据库的名字");

以上两种写法才是正确的url写法估计你第二种没法用,你没导入jar包你只能用第一种,按照我这样写才对而且还要配置好ODBC数据源才行,你配置了么

以上就是关于JAVA JDBC事务提交的疑问。全部的内容,包括:JAVA JDBC事务提交的疑问。、如何获取oracle.jdbc.driver.oraclepreparedstatement中的属性值、android 在 jdbc4.jar 连接 SqlServer 2008 提示 “Could not find class 'javax.sql.XAConnection'”等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9789674.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存