学习JDBC的心得

本文介绍了通过JDBC在MySQL中操作的相关知识。阐述了java.sql包中重要的类和接口,如DriverManager类、Connection接口等的功能及使用方法,还提及了注意事项,最后说明了通过JDBC数据源执行SQL指令的通用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、主要类与接口

首先,要想在mySQL中显示中文,就要在my.ini[mysqld]字段中加入

default-character-set=gb2312

Jdbc注册mySQL驱动的时候,在JBuilder中,新建一个项目,项目属性中有一个Required Library,把驱动程序mysql_comp.jar导入进来就可以了。

java.sql包中有几个比较重要的类和接口,下面一一介绍:

DriverManager

它是驱动程序管理器,作用于用户和驱动程序之间,并在数据库和相应的驱动程序之间建立连接。对于简单的应用程序,一般在此类中需要使用的唯一方法就是DriverManager.getConnection(String url);该方法将建立与数据库的连接。

在使用上面的方法之前,需要先在DriverManager类中注册JDBC数据库驱动程序,一般使用的方法为Class.forname(“Driver name”)。在注册之前,需要先把数据库驱动程序的路径添加到classpath中,对于Jbuilder来说,就是在projectproperty中,添加required library,并指定驱动程序所在的位置,包含进来。

Connection接口

Connection对象代表与数据库的连接,连接一旦建立,就可以用来向它所涉及的数据库传送SQL语句。

功能一

Connection可以创建向数据库发送SQL语句的三个接口:

Statement——createStatement(),执行静态的SQL语句;

PreparedStatement——createPreparedStatement(String sql),发送预编译的带有一个或者多个输入参数的SQL语句;

CallableStatement——createCallableStatement(String sql),该接口对象用于执行数据库的SQL存储过程。

上面三个方法还各带有一个重载方法,都是参数列表中多了两项,仅以第一个方法为例:

createStatement(int resultSetType,int resultSetConcurrency)。其中的resultSetType表示返回记录集的类型——是只能向前滚动,还是可以前后滚动,后面一个resultSetConcurrency表示发送的SQL语句的权限——是属于不能修改的SELECT语句,还是允许修改资料的UPDATEINSERT等语句(具体参见ResultSet的成员变量)。

功能二

执行事务处理。

事务由一个或者多个语句组成,这些语句被一起执行、完成并被提交或者还原。当调用Connection接口的commit方法或者是rollback方法的时候,当前事务即告结束,另一个事务开始。

在默认情况下,新的数据库连接处于自动提交模式,也即是说,当执行完一个语句之后,会自动对那个语句调用commit方法,这种情况下,每个语句都是单独提交,所以一个事物只由一条语句构成。

但是,如果使用Connection接口的public void setAutoCommit(boolean autoCommit)方法,将autoCommit的值设为false,那么就会禁用自动提交模式,事务将会等到commit方法或者是rollback方法调用之后才会结束,它会包括上一次调用这两个方法以来执行的所有语句。

Connection的这个功能可以用来保证数据的完整性,比如在一个更新操作生效之前不让另外一个更新生效,就可以把这两个语句放到一个事务中,如果两个操作都成功,那么就调用commit方法,如果其中一个或者两个都失败了,就调用rollback方法,将值恢复。

<o:p> </o:p>

一定要注意的是,在程序结束的时候,要调用close方法将连接关闭,有助于避免潜在的内存问题。<o:p></o:p>

Statement接口

它用于将普通的SQL语句发送到数据库中,并提供了执行SQL语句和获取结果的基本方法。

功能一

执行SQL语句。

public int[] executeBatch();

public ResultSet executeQuery(String sql);

public int executeUpdate(String sql);

executeUpdate用于执行INSERTDELETE或者UPDATE以及操作TABLE的语句,返回值是int,表示受到影响的行数,对于操作TABLE的语句而言,返回值为0

executeBatch方法用于执行几个SQL语句。Statement接口使用addBatch(String url)方法将几个SQL语句添加到一个语句块中,然后一同提交到数据库服务器。这对于需要执行很多INSERT语句的程序来说,可以节省很多系统资源。

注意,在执行上面三个方法以及下面要讲到的execute方法的时候,都会关闭所调用的Statement对象的当前打开的ResultSet(文档首页对此进行了介绍)。

功能二

获取多个记录集或者数据库记录更新计数——execute方法。

该方法应该仅在语句能够返回多个ResultSet对象、多个更新计数或者ResultSet对象与更新计数的组合的时候使用。

若一个某过程返回两个记录集,则调用方法顺序如下:

execute();

getResultSet();

getXXX();

getMoreResults();

getResultSet();

……

若某过程返回两个更新计数,则调用方法顺序如下:

execute();

getUpdateCount();

getMoreResults();

getUpdateCount();

<o:p> </o:p>

execute方法返回类型为boolean,若过程结果为ResultSet,则返回值为true,若为更新计数(int),则为false

在程序结束的时候,一定要调用close方法将Statement关闭,避免潜在的内存问题。<o:p></o:p>

PreparedStatement接口

该接口对象包含已编译的SQL语句,而且被包含的语句可具有一个或者多个IN参数,IN参数的值在创建SQL语句的时候没有指定,而且都保留一个问号(?)作为占位符,每一个问号的值,都必须在执行之前通过setXXX()方法来提供。

该接口继承了Statement接口的所有功能,而且添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值,同时executeUpdateexecuteQueryexecute三种方法被进行了重载,不再需要参数。这些方法的接受Statement语句参数的形式不能被用于PreparedStatement,否则会抛出SQLWarning

创建过程如下:

1.          创建一个实例,PreparedStatement pstmt = conn.getPreparedStatement(“UPDATE table SET m = ? WHERE x=?”);

2.        传递IN参数,使用setXXX方法来完成,其中的XXX是参数的对应类型。该方法的第一个参数表示要设置的参数的位置(行数),第二个参数表示要设置给参数的值。如下例:

pstmt.setString(1,”HI”);

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

       pstmt.setInt(2,i);

       int rowCount = pstmt.executeUpdate();

}

<o:p> </o:p>

PreparedStatement对象中,还可以将输入流作为IN参数的值传递,当语句执行的时候,JDBC驱动程序将会重复调用输入流,读取其内容并将它们作为实际参数数据传输。方法定义如下:

public void setAsciiStream(int parameterIndex, InputStream x, int length)

public void setBinaryStream(int parameterIndex, InputStream x, int length)

示例如下:

File file = new File(“XXX”);

int fileLength = file.length();

InputStream in = FileStream(file);

PreparedStatement pstmt = conn.getPreparedStatement(“UPDATE table SET m = ? WHERE x=?”);

pstmt.setBinaryStream(1,fin,fileLength);

pstmt.executeUpdate();

CallableStatement接口(空)

DatabaseMetaData接口

用于获取数据库的结构。

通过ConnectiongetMetaData方法,可以获取DatabaseMetaData接口的实例对象。

getTables方法,可以获取数据库中现存的各个表、视图的列表。

getColumns方法可以获取特定表的信息,包括有哪些字段、字段名字、数据类型、字段长度等等。

它们都返回了一个ResultSet接口对象。

参看API

ResultSet接口

本接口用于获取执行SQL语句/数据库存储过程返回的结果,它的实例包括符合SQL语句中条件的所有行,并且可以通过getXXX方法(访问当前行中的不同列)提供了对数据的访问,next方法用于移动数据库游标到记录集中的下一行。

二、注意事项

1.          一个Statement对象只能在同一时刻打开一个ResultSet对象,也就是说,如果一个ResultSet对象和另外一个是交叉存取的,那么每一个都必须要被不同的Statement打开。

2.        ResultSet对象永远不会返回null,如果想判断ResultSet是否返回了结果的话,可以使用rs.first()来判断。

3.        SQL语句要针对用户输入来进行操作的话,必须要考虑到用户的输入中可能会包含有特殊字符的情况,所以要对用户的输入进行遍历,然后对特殊字符都使用\来进行转义。

三、通过JDBC数据源执行SQL指令的通用过程

    1、建立一个SQL字符串

    2、得到一个连接

    3、得到一个预处理语句(prepared statement

    4、将值组合到预处理语句中

    5、执行语句

6、遍历结果集并且形成结果对象

同时,还要考虑那些不断出现的SQLExceptions,并使用try/catch块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值