全部博文(147)
分类: Java
2008-09-17 17:40:00
jabc简介:
Java程序对特定数据库的访问操作,要被与其对应的JDBC驱动程序翻译成该数据库的本地操作才能实现,所以JDBC驱动程序担当了一个翻译器的角色。不同的数据库拥有不同的JDBC驱动程序,JDBC提供一个java.sql.Driver接口,各个数据库厂商根据自己数据库产品的特点来实现这个接口(即不同数据库产品的JDBC驱动由其本身提供),Java程序仅通过标准接口来访问各种数据库,从而实现代码的数据库平台无关性。在Java程序访问数据之前,需要通过Class.forName("")的方式来装载JDBC驱动程序(例如Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"),之所以用Class.forName而没有用ClassLoader.load(),就是因为需要JVM完成Driver的初始化工作,而不仅仅是装载),然后通过一个统一的工厂类Java.sql.DriverManager来取得数据库连接,并执行各种操作
jabc是一种可以执行sql语句的java提供的api
数据库的jdbc连接过程:
1.加载驱动:
Class.forName(driverName);
例如:Class.forName("Oracle.jdbc.driver.OracleDriver");
2.建立连接:
String url="jdbc:mysql://localhost/数据库名?user=root&password=ranran";
Connection con=DriverManager.getConnection(url);
3.创建sql语句
Statement:由方法createStatement()创建,用于发送简单的sql语句。有几个常用的方法:
boolean execute(String sql)throws SQLException
ResultSet executeQuery(String sql)throws SQLException 执行查找语句 返回结果集
int executeUpdate(String sql)throws SQLException 执行插入删除更新语句
PreparedStatement:由方法preparedStatement()语句创建,Statement对象在每次执行sql语句时,都将sql语句传递给数据库,那么多次执行同一条语句时就会效率很低,创建PrementStatement对象时将sql语句传递给数据库做预编译。
例子:PreparedStatement updateSales=conn.prepareStatement("update goods set sales=?where goods_name like ?");
updateSales.setInt(1,75);
updateSales.setString(2,"wuxiaoxiao");
updateSales.executeUpdate();
CallableStatement:由方法prepareCall()创建,该对象用于执行数据库中已经创建好的存储过程。
例子:
1.创建一个CallableStatement对象:
//将创建存储过程的代码给producename
String producename=.....
//调用存储过程的实际命令
String call_procedure_string="{call"+procedurename+"(?,?,?,?,?,?,?)}";
//创建CallableStatement对象
CallableStatement callableStatement=conn.prepareCall(call_procedure_string);
2.初始化CallableStatement参数
callableStatement。setString(1,“keyword”);
......
3.执行
callableStatement.executeUpdate();
ResultSet接口提供了对于数据表的访问,该对象一般是由一条sql语句产生的!
在这里需要注意的是结果集的属性:
一个resultSet对象表示的结果集默认是不可滚动的,只读的,指针初始化指向第一之前。
不可滚动意味着指针只有一个移动方向,只能从前向后移动!此时只能调用next(),移到结束时候,也不能调用beforeFirst()方法
只读意味着结果集不可更改,不能通过结果集更新数据库的记录
如果想改变这些默认的设置,需要在创建Statement对象时指定结果集的属性,Connection接口有一个带参数的createStatement()方法如下:
Statement createStatement(int resultSetType,int resultSetConcurrency)throws SQLException
其中resultSetType指定结果集是否可以滚动:
TYPE_FORWARD_ONLY //指针只能从前向后滚动,默认值
TYPE_SCROLL_INSENSITIVE //结果集可以滚动,对数据更新不敏感
TYPE_SCROLL_SENSITIVE //结果集可以滚动,对数据更新敏感
对数据更新是否敏感指当执行插入,删除,更新等其他sql语句改变了表的数据时,当前结果集中的数据是否随之更新
其中resultSetConcurrency属性表示结果集是否可以更新
CONCUR_READ_ONLY //只读,默认
CONCUR_UPDATABLE //可更新
例如:下面语句创建Statement对象时,指定结果集的属性为可滚动,只读:
Statement statement=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)
当结果集为可更新时,先调用ResultSet接口的一组update()方法更新当前行指定列数据,在调用updateRow()方法将改变后的当前行数据提交给数据库中的表,调用insertRow()方法在表中插入一行,调用deleteRow()方法删除当前行并提交!
例子:
pubic class JDBCConnection{
public static void main(String args[]){
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
//加载驱动
Class.forName("Oracle.jdbc.driver.OracleDriver");
//建立连接
String url="jdbc:mysql://localhost/数据库名?user=root&password=ranran";
con=DriverManager.getConnection(url);
//创建语句对象
stmt=con.createStatement();
//构造sql语句
String sql="....";
//执行sql语句
rs=stmt.executeQuery(sql);
....
}
}