
>>启动事务 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'”等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)