Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29334351
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-04-26 21:16:51

JDBC理论学习专题

 

                                                                                       

 

2.1 获取连接

加载驱动实例

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

将会加载一个数据库驱动到内存中去。这样的话我们的DriverManager就可以拿到一个可用的数据库驱动了。

创建连接

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123");

2.2 执行SQL语句

statement = conn.createStatement();

然后通过使用statement才能获取到ResultSet结果集。请见上图说明的。可以有三种类型的Statement语句的!

 

2.3 处理异常

System.out.println(e.getMessage());

while((e = e.getNextException()) != null) {

        System.out.println(e.getMessage());

}

这样的写法不错哦!可以获取全部的异常信息出来!

 

 

2.4 JAVA数据类型与SQL类型之间的匹配关系如下

Table 9-1. Methods to Retrieve Data from a ResultSet

SQL Data Type

Java Type Returned by getObject()

Recommended Alternative to getObject()

CHAR

String

String getString()

VARCHAR

String

String getString()

LONGVARCHAR

String

InputStream getAsciiStream() InputStream getUnicodeStream()

NUMERIC

java.math.BigDecimal

java.math.BigDecimal getBigDecimal()

DECIMAL

java.math.BigDecimal

java.math.BigDecimal getBigDecimal()

BIT

Boolean

boolean getBoolean()

TINYINT

Integer

byte getByte()

SMALLINT

Integer

short getShort()

INTEGER

Integer

int getInt()

BIGINT

Long

long getLong()

REAL

Float

float getFloat()

FLOAT

Double

double getDouble()

DOUBLE

Double

double getDouble()

BINARY

byte[]

byte[] getBytes()

VARBINARY

byte[]

byte[] getBytes()

LONGVARBINARY

byte[]

getBinaryStream()

DATE

java.sql.Date

java.sql.Date getDate()

TIME

Java.sql.Time

java.sql.Time getTime()

TIMESTAMP

Java.sql.Timestamp

java.sql.Timestamp getTimestamp()

数据库类型  ---  JAVA数据类型  ---         JDBC中的接口方法

 

2.6 处理Null字段

int age = rs.getInt("age");
if (!rs.wasNull())
 out.println("Age: " + age); 

表示是否为NULL字段的哦

 

2.7 更新

count = statement.executeUpdate(sqls);

返回的是影响的记录数

 

 

如果一个SQL语句你不能确定到底是做select还是update操作的话就可以使用execute语句

这个语句如果返回的是true表示是做了一个查询,如果返回false就表示是做了更新!

 

2.8 使用预更新语句

这个语句是做了预编译处理的。其执行速度是比Statement更快的。

PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement("insert into test(a,b) value(?,?)");

pstmt.clearParameters();

pstmt.setString(1, "hko");

pstmt.setString(2, "hs");

pstmt.executeUpdate();

这种语句的执行速度是比较快的因为做了预编译处理!

 

3.0 事务

JDBC默认在创建一个连接的时候将setAutoCommit()置为true了。即设置为自动提交的。

如果你现在要做事务即一次可以提交多个SQL语句的话就可以将这个值设置为false

判断一个连接是否为自动提交的一个方法为getAutoCommit()

如果你要一次提交多个SQL语句的话可以用commit()方法!

一旦遇到问题就可以用rollback()做事务回滚了!

PS:要注意一点如果你想使用事务的话就得用事务类型的引擎。像在MYSQL中如果你用MyISAM的话就不支持事务了。没有效果。可以换用InnoDB来做!

 

if (conn.getAutoCommit()) {

                conn.setAutoCommit(false);

            }

            statement = conn.createStatement();

            count = statement.executeUpdate(sqls);

            statement.executeUpdate("insert into innodb(name) values('e')");

            statement.executeUpdate("insert into innodb(names) values('e')");

            conn.commit();

如果第一个SQL语句没问题可以成功提交。但是第二个SQL语句是有问题的就不可以正常提交了。这样两个SQL语句都没法提交了!

 

阅读(985) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-13 11:54:03

注意驱动包的版本: Class.forName("com.mysql.jdbc.Driver");