Java学习笔记-------数据库疑问

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/H002399/article/details/47078917
关于Statement 类


对于下面这个语句我不太理解:???


Statement stmt=null;


stmt=con.createStatement();




我的疑惑:???
1.Statement和Connection都是接口,接口中的方法不都是没有实现吗???怎么能够实例化一个接口对象,并且调用其中的方法嗯???


2.Statement对象为什么不是由它自己的构造方法创建,而要由Connection接口中的方法创建???


3.和statement一样,Connection的对象是用DriverManager的getConnection()方法来创建


那我们来看一下,DriverManager类中的成员方法:

static  connection  getConnection(String url, String user ,String password);

如何理解这个方法的返回值???



:::::::::::

以下的代码段(其中 con 是 Connection 对象)创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象:

()。PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");

::::::::::::::::::::::::pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。
()。rs=ps.executeQuery(); //  ResultSet executeQuery() 
//  在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。










在查阅了JAVA JDK之后,发现:Connection接口:


如下:


摘要:


 Statement createStatement() 
          创建一个 Statement 对象来将 SQL 语句发送到数据库 


:::
可以看出,在Connection接口中,定义了,创建Statement对象的方法。即:createStatement();方法可以创建一个Statement对象。






java.sql 
接口 Connection
所有超级接口: 
Wrapper 


--------------------------------------------------------------------------------


public interface Connectionextends Wrapper
与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。 


Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。此信息是使用 getMetaData 方法获得的。 


注:在配置 Connection 时,JDBC 应用程序应该使用适当的 Connection 方法,比如 setAutoCommit 或 setTransactionIsolation。在有可用的 JDBC 方法时,应用程序不能直接调用 SQL 命令更改连接的配置。默认情况下,Connection 对象处于自动提交模式下,这意味着它在执行每个语句后都会自动提交更改。如果禁用了自动提交模式,那么要提交更改就必须显式调用 commit 方法;否则无法保存数据库更改。 


使用 JDBC 2.1 核心 API 创建的新 Connection 对象有一个与之关联的最初为空的类型映射。用户可以为此类型映射中的 UDT 输入一个自定义映射关系。在使用 ResultSet.getObject 方法从数据源中获取 UDT 时,getObject 方法将检查该连接的类型映射是否有对应该 UDT 的条目。如果有,那么 getObject 方法将该 UDT 映射到所指示的类。如果没有条目,则使用标准映射关系映射该 UDT。 


用户可以创建一个新的类型映射,该映射是一个 java.util.Map 对象,可在其中创建一个条目,并将该条目传递给可以执行自定义映射关系的 java.sql 方法。在这种情况下,该方法将使用给定的类型映射,而不是与连接关联的映射。 


例如,以下代码片段指定 SQL 类型 ATHLETES 将被映射到 Java 编程语言中的 Athletes 类。该代码片段为 Connection 对象 con 获取类型映射,并在其中插入条目,然后使用新的条目将该类型映射设置为连接的类型映射。 


      java.util.Map map = con.getTypeMap();
      map.put("mySchemaName.ATHLETES", Class.forName("Athletes"));
      con.setTypeMap(map);
 


另请参见:
DriverManager.getConnection(java.lang.String, java.util.Properties), Statement, ResultSet, DatabaseMetaData


--------------------------------------------------------------------------------


字段摘要 
static int TRANSACTION_NONE 
          指示事务不受支持的常量。 
static int TRANSACTION_READ_COMMITTED 
          指示不可以发生脏读的常量;不可重复读和虚读可以发生。 
static int TRANSACTION_READ_UNCOMMITTED 
          指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。 
static int TRANSACTION_REPEATABLE_READ 
          指示不可以发生脏读和不可重复读的常量;虚读可以发生。 
static int TRANSACTION_SERIALIZABLE 
          指示不可以发生脏读、不可重复读和虚读的常量。 
  方法摘要 
 void clearWarnings() 
          清除为此 Connection 对象报告的所有警告。 
 void close() 
          立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。 
 void commit() 
          使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。 
 Array createArrayOf(String typeName, Object[] elements) 
          创建 Array 对象的工厂方法。 
 Blob createBlob() 
          构造实现 Blob 接口的对象。 
 Clob createClob() 
          构造实现 Clob 接口的对象。 
 NClob createNClob() 
          构造实现 NClob 接口的对象。 
 SQLXML createSQLXML() 
          构造实现 SQLXML 接口的对象。 
 Statement createStatement() 
          创建一个 Statement 对象来将 SQL 语句发送到数据库。 
 Statement createStatement(int resultSetType, int resultSetConcurrency) 
          创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 
 Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) 
          创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。 
 Struct createStruct(String typeName, Object[] attributes) 
          创建 Struct 对象的工厂方法。 
 boolean getAutoCommit() 
          获取此 Connection 对象的当前自动提交模式。 
 String getCatalog() 
          获取此 Connection 对象的当前目录名称。 
 Properties getClientInfo() 
          返回一个列表,它包含驱动程序支持的每个客户端信息属性的名称和当前值。 
 String getClientInfo(String name) 
          返回通过名称指定的客户端信息属性的值。 
 int getHoldability() 
          获取使用此 Connection 对象创建的 ResultSet 对象的当前可保存性。 
 DatabaseMetaData getMetaData() 
          获取一个 DatabaseMetaData 对象,该对象包含关于此 Connection 对象所连接的数据库的元数据。 
 int getTransactionIsolation() 
          获取此 Connection 对象的当前事务隔离级别。 
 Map<String,Class<?>> getTypeMap() 
          获取与此 Connection 对象关联的 Map 对象。 
 SQLWarning getWarnings() 
          获取此 Connection 对象上的调用报告的第一个警告。 
 boolean isClosed() 
          查询此 Connection 对象是否已经被关闭。 
 boolean isReadOnly() 
          查询此 Connection 对象是否处于只读模式。 
 boolean isValid(int timeout) 
          如果连接尚未关闭并且仍然有效,则返回 true。 
 String nativeSQL(String sql) 
          将给定的 SQL 语句转换成系统本机 SQL 语法。 
 CallableStatement prepareCall(String sql) 
          创建一个 CallableStatement 对象来调用数据库存储过程。 
 CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) 
          创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 
 CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) 
          创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 
 PreparedStatement prepareStatement(String sql) 
          创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 
 PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) 
          创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。 
 PreparedStatement prepareStatement(String sql, int[] columnIndexes) 
          创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。 
 PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) 
          创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 
 PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) 
          创建一个 PreparedStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。 
 PreparedStatement prepareStatement(String sql, String[] columnNames) 
          创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。 
 void releaseSavepoint(Savepoint savepoint) 
          从当前事务中移除指定的 Savepoint 和后续 Savepoint 对象。 
 void rollback() 
          取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。 
 void rollback(Savepoint savepoint) 
          取消所有设置给定 Savepoint 对象之后进行的更改。 
 void setAutoCommit(boolean autoCommit) 
          将此连接的自动提交模式设置为给定状态。 
 void setCatalog(String catalog) 
          设置给定目录名称,以便选择要在其中进行工作的此 Connection 对象数据库的子空间。 
 void setClientInfo(Properties properties) 
          设置连接的客户端信息属性的值。 
 void setClientInfo(String name, String value) 
          将 name 指定的客户端信息属性的值设置为 value 指定的值。 
 void setHoldability(int holdability) 
          将使用此 Connection 对象创建的 ResultSet 对象的默认可保存性 (holdability) 更改为给定可保存性。 
 void setReadOnly(boolean readOnly) 
          将此连接设置为只读模式,作为驱动程序启用数据库优化的提示。 
 Savepoint setSavepoint() 
          在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。 
 Savepoint setSavepoint(String name) 
          在当前事务中创建一个具有给定名称的保存点,并返回表示它的新 Savepoint 对象。 
 void setTransactionIsolation(int level) 
          试图将此 Connection 对象的事务隔离级别更改为给定的级别。 
 void setTypeMap(Map<String,Class<?>> map) 
          将给定的 TypeMap 对象安装为此 Connection 对象的类型映射。 
  从接口 java.sql.Wrapper 继承的方法 
isWrapperFor, unwrap 
  


字段详细信息 




TRANSACTION_NONE
static final int TRANSACTION_NONE指示事务不受支持的常量。 


另请参见:
常量字段值


--------------------------------------------------------------------------------


TRANSACTION_READ_UNCOMMITTED
static final int TRANSACTION_READ_UNCOMMITTED指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。此级别允许被某一事务更改的行在已提交该行所有更改之前被另一个事务读取(“脏读”)。如果所有更改都被回滚,则第二个事务将获取无效的行。 


另请参见:
常量字段值


--------------------------------------------------------------------------------


TRANSACTION_READ_COMMITTED
static final int TRANSACTION_READ_COMMITTED指示不可以发生脏读的常量;不可重复读和虚读可以发生。此级别只禁止事务读取其中带有未提交更改的行。 


另请参见:
常量字段值


--------------------------------------------------------------------------------


TRANSACTION_REPEATABLE_READ
static final int TRANSACTION_REPEATABLE_READ指示不可以发生脏读和不可重复读的常量;虚读可以发生。此级别禁止事务读取带有未提交更改的行,它还禁止这种情况:一个事务读取某一行,而另一个事务更改该行,第一个事务重新读取该行,并在第二次读取时获得不同的值(“不可重复读”)。 


另请参见:
常量字段值


--------------------------------------------------------------------------------


TRANSACTION_SERIALIZABLE
static final int TRANSACTION_SERIALIZABLE指示不可以发生脏读、不可重复读和虚读的常量。此级别包括 TRANSACTION_REPEATABLE_READ 中禁止的事项,同时还禁止出现这种情况:某一事务读取所有满足 WHERE 条件的行,另一个事务插入一个满足 WHERE 条件的行,第一个事务重新读取满足相同条件的行,并在第二次读取时获得额外的“虚”行。 


另请参见:
常量字段值
方法详细信息 


createStatement
Statement createStatement()
                          throws SQLException创建一个 Statement 对象来将 SQL 语句发送到数据库。不带参数的 SQL 语句通常使用 Statement 对象执行。如果多次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。 
使用返回的 Statement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。已创建结果集的可保存性可调用 getHoldability() 确定。 




返回:
一个新的默认 Statement 对象 
抛出: 
SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法


--------------------------------------------------------------------------------


prepareStatement
PreparedStatement prepareStatement(String sql)
                                   throws SQLException创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 
带有 IN 参数或不带有 IN 参数的 SQL 语句都可以被预编译并存储在 PreparedStatement 对象中。然后可以有效地使用此对象来多次执行该语句。 


注:为了处理受益于预编译的带参数 SQL 语句,此方法进行了优化。如果驱动程序支持预编译,则 prepareStatement 方法将该语句发送给数据库进行预编译。一些驱动程序可能不支持预编译。在这种情况下,执行 PreparedStatement 对象之前无法将语句发送给数据库。这对用户没有直接影响;但它的确会影响哪些方法将抛出某些 SQLException 对象。 


使用返回的 PreparedStatement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。已创建结果集的可保存性可调用 getHoldability() 确定。 




参数:
sql - 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句 
返回:
包含预编译 SQL 语句的新的默认 PreparedStatement 对象 
抛出: 
SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法
展开阅读全文

操作数据库的一些疑问

02-28

大家好rn 我现在有个程序要实现这个功能rn 窗体上有一个DATAGRID,他用来显示一个数据库中的表, 然后有三个按钮 分别用来添加记录,修改记录,和删除记录rn 我现在用的方法是rn 比如添加记录 在添加按钮的CLICK事件中的代码是(因为我是添加的图片)rn Dim FileName As String = OpenFileDialog1.FileNamern Dim fs As FileStream = New FileStream(FileName, FileMode.Open)rn ......rn 然后用一个 sqlcommand对象执行 Cmd.ExecuteNonQuery() 进行添加记录rn 删除记录 代码是rn Dim iRow As Integer = Me.DataGrid1.CurrentRowIndexrn Dim FileName As String = Me.DataGrid1.Item(iRow, 1).ToString()rn StrSQL = "delete from ClientObject where FileName='" + FileName + "'"rn ....rn 也是一个sqlcommand对象执行那个方法rn rn 这两个功能都可以实现了,但是修改记录呢rn 我不知道该怎么做rn 我想到的一个方法是,在窗体上加几个文本框,然后点击DATAGRID时,文本框则显示当前选择行的记录rn 如果想修改的话,在文本框中修改值,然后执行一个SQL语句rnrn 但是我感觉这个方法不太好rn 我就是想问问大家还有其他的方法 进行更新吗?rnrnrn 刚才网上看了一下 ,有直接更新的方法.update 但是不知道该怎么用 而且,感觉再我的程序里边行不通,应为他们更新的是ds,我的修改事件中ds都没有值(我认为是这样)rnrn 还有就是大家看看还有其他 增加记录,删除记录的好方法吗?rn 谢谢了。rn 论坛

使用数据库触发器的疑问!!!???????

09-26

我创建表:rn create table student(rn id varchar2(50),rn name varchar2(50),rn sex varchar2(50),rn age varchar2(50),rn phone varchar2(50),rn primary key(id)rn );rn-------------rn再创建触发器:rncreate or replace trigger record_checkerrn before insert or update ofrn id,name,sex,age,phone rn on studentrn for each rowrndeclarern -- new_id VARCHAR2(50) default 'null';rn old_id VARCHAR2(50);rn is_id_duplicate char(1) default 'F'; --id must be unique.rn is_sex_format char(1) default 'F'; --sex must be 'male' or 'female'.rnrn id_is_null_exception exception;rn sex_format_exception exception;rnrnBeginrn DBMS_OUTPUT.PUT_LINE('TRIGGER: record_checker NOW IS LOADING...');rn rn/* check whether id is null. */rn if :new.id IS NULL thenrn raise id_is_null_exception;rn end if;rnrn-- check whether the new id is duplicated in the database. rn-- while is_id_duplicate ='F' looprn-- new_id := :new.id;rn-- select id into old_id from student where id =new_id; rn-- if old_id != 'null' thenrn-- is_id_duplicate :='T';rn-- raise id_is_duplicate_exception;rn-- end if; rn-- end loop;rnrnrn/* check whether the sex is 'male' or 'female' */rn if :new.sex !='male' or :new.sex !='female' thenrn raise sex_format_exception;rn end if;rnrnEXCEPTIONrn when id_is_null_exception thenrn DBMS_OUTPUT.PUT_LINE('record_checker''s message:Error!!student''id is null.');rnrn when sex_format_exception thenrn DBMS_OUTPUT.PUT_LINE('record_checker''s message:Error!!student''sex must be ''male'' or ''female''.');rnrn when others thenrn --if sqlcode=-1 thenrn DBMS_OUTPUT.PUT_LINE('record_checker''s message:Error!!student''id is duplicated.');rn --end if;rnrnEnd;rn/rnrn--------------------rn然后使用start record_checker ,说“触发器已创建”,可是我:rninsert into student values('132','bo','male','22','2363087');--是一条重复的记录rn触发器不会捕捉异常,只是提示:rn*rnERROR 位于第 1 行:rnORA-00001: 违反唯一约束条件 (TESTUSER.SYS_C003006)rn请问我哪里错了啊???????????求救啊!!! 论坛

没有更多推荐了,返回首页