JDBC是java数据库连接(Java DataBase Connectivity)技术的简称,由一组使用Java语言编写的类和接口组成,可以为多种关系数据库提供统一访问。
Sun公司提供了JDBC的接口规范——JDBC API,而数据库厂商或第三方中间件厂商根据该接口规范提供针对不同数据库的具体实现——JDBC驱动。
JDBC API
DriverManager类:依据数据库的不同,管理相应的JDBC驱动。
Connection接口:负责连接数据库并担任传送数据的任务。
Statement接口:由Connection产生,负责执行SQL语句。
ResultSet接口:负责保存和处理Statement执行后所产生的查询结果。
PreparedStatement接口:Statement的子接口,也由Connection产生,同样负责执行SQL语句。与Statement接口相比,具有高安全性、高性能、高可读和高可维护性的优点。
Connection接口
两种常用的驱动方式:JDBC-ODBC桥方式连接数据,使用纯Java方式连接数据库。
1,JDBC-ODBC桥方式连接数据(一般来说主流的数据库都不需要使用这种方式进行连接操作。)
JDK中已经包括了JDBC-ODBC桥连的驱动接口,只需要配置ODBC数据源即可。
JDBC驱动类是:sun.jdbc.odbc.JdbcOdbcDriver
数据库连接字符串是:jdbc:odbc:ConnSqlServer *ConnSqlServer需要在控制面板->管理工具->odbc数据源中进行配置。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:ConnSqlServer";
优点:可以访问所有ODBC可以访问的数据库,不用专门的数据库驱动程序。
缺点:执行效率低,功能不够强大。
2,使用纯Java方式连接数据库
由数据库厂商自己提供,一般一种JDBC驱动只能对应一种数据库或某种数据库的某个版本。
由于数据库厂商进行了专门的优化,所以运行速度较快。
一般采用jar包的方式引入。
优点:纯Java,为具体的数据库进行了优化;跨平台,效率高。
缺点:对不同的数据库要使用不同的驱动程序。
操作JDBC的具体步骤:
1,导入java.sql包中的内容
import java.sql.*;
2,加载,注册数据库驱动程序
驱动文件
SqlServer2000的驱动程序由三个文件组成:msbase.jar、mssqlserver.jar、msutil.jar。
SqlServer2005的驱动程序只有一个文件:sqljdbc.jar
SqlServer2008的驱动程序有两种:sqljdbc.jar、sqljdbc4.jar
*SqlServer2008的驱动只需要一个,jdk5.0及以下使用sqljdbc.jar,jdk6.0以上用sqljdbc4.jar
MySql的驱动程序只有一个文件:mysql-connector-java-5.1.5-bin.jar
要是想连接某个数据库就要使用相应的驱动程序。当然也可以使用JDBC-ODBC桥接技术。
加载
MySql
Class.forName("com.mysql.jdbc.Driver").newInstance();
Oracle
Oracle的Driver的全名oracle.jdbc.driver.OracleDriver
3,创建Connection对象(建立与数据库的连接)
DriverManager.getConnection(String url,String username,String password);
Connection连接是通过DriverManager的静态方法getConnection()来得到的,这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。
private Connection con;
//MySql
con = java.sql.DriverManager.getConnection("jdbc:mysql://localhost/myDB?user=soft&password=soft1234");
//Oracle
con = java.sql.DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.39:1521:tarenadb");
例子:测试连接数据库是否成功
Connection conn=null;
try {
Class.forName(classString);
conn=DriverManager.getConnection(url,user,password);
}catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("Connection Success!!!");
4,创建Statement对象(对数据库发出命令),创建ResultSet对象(接受数据库返回的信息)
4.1,使用Connection对象获得一个Statement。
4.2,Statement中的executeQuery(String sql) 方法可以使用select语句查询,并且返回一个结果集。
4.3,ResultSet通过遍历这个结果集,可以获得select语句的查寻结果。
4.4,ResultSet的next()方法会操作一个游标从第一条记录的前边开始读取,直到最后一条记录。
Statement stmt = con.createStatement();
ResultSet rst = stmt.executeQuery("select * from Products");
*executeUpdate(String sql) 方法用于执行update,delete,insert操作。
Execute执行语句的区别:
1.ResultSet executeQuery(String sql):用于select语句的执行,它返回个ResultSet,便于接下来的处理。
2.int executeUpdate(String sql):用于增删改语句的执行,它返回int值是它所影响的行数
3.boolean execute(String sql) 可以执行任意sql语句,获得一个布尔值,表示是否返回ResultSet。(一般不用这个)
*返回值为true时,表示执行的查询语句,使用getResultSet方法获取结果;返回值为false时,表示执行更新或DDL语句,使用getUpdateCount获取结果。
String sql="insert into student values(5,'李宗仁','大陆')";
try {
smt = conn.createStatement();
boolean result=smt.execute(sql);
if(result==false){
System.out.println(smt.getUpdateCount());
System.out.println("insert success...");
}
} catch (SQLException e) {
e.printStackTrace();
}
5,使用ResultSet对象。ResultSet可以理解为由所查询结果组成的一个二维表,每行代表一条记录,每列代表一个字段。
该对象中有一游标,游标所指行为当前行。游标初始位置为第一行的上一行。
while (rst.next()) {
System.out.println("id:" + rst.getString("id"));
System.out.println("name:" + rst.getString("name"));
System.out.println("sex:" + rst.getInt("sex"));
}
*ResultSet对象生成后其游标指向第一行数据的前一条。执行next()方法会自动让游标向下一行,如果下一行存在,则返回true。
6,关闭所有对象
rst.close();
stmt.close();
con.close();
*这些对象都使用规模较大的数据结构,所以我们不应该等待垃圾回收器来处理它们。
*注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接是才可以使用的,所以在使用结束之后有可能起他的Statement还需要连接,所以不能现关闭Connection。
例子:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class SimpleJdbcTest1 throws <span style="line-height: 1.5;">ClassNotFoundException,</span><span style="line-height: 1.5;">SQLException</span><span style="line-height: 1.5;">{</span>
复制代码 对以上步骤的重点解释:
1,Statement提供在基层连接上运行SQL语句,并且返回访问结果。
Statement的方法:
sm.executeQuery(sql); // 执行数据查询语句(select)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)
有三种Statement对象:
Statement
PreparedStatement(从Statement继承而来,预编译的Statement)
CallableStatement(从PreparedStatement继承而来)
*PreparedStatement可以使用"?"替代sql语句中的某些参数,使用"?"代替,先将带参数的sql语句发送到数据库,进行编译,然后PreparedStatement会将参数发送给数据库。
*在使用PreparedStatement时,在设置相应参数时,要指明参数的位置和类型,以及给出参数值。
*根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数。
*PreparedStatement可以很好的防止注入式攻击。
String sql="select * from USER where name='"+name+"' and password='"+"'";
输入admin,123456之类的正常数据的时候是没有问题的。sql语句:select * from USER where name='admin' and password='123456'
如果输入任意用户名和abc'or'1'='1。sql语句:select * from USER where name='abc' and password='abc' or '1'='1'
*PreparedStatement是带有参数功能的Statement。应该始终以PreparedStatement代替Statement。也就是说,在任何时候都不要使用Statement。原因:代码可读性,性能,安全性。
*与数组索引不同,数据库的列序号从1开始计算。
*PreparedStatement与Statement的区别:
1,加载sql时机:PreparedStatement是在创建对象的时候加载sql,因为要在创建完对象后,为对象添加需要的参数,所以先加载SQL。
Statement是在具体的运行某个方法的时候(executeQuery()、executeUpdate()、execute()),以方法参数的形式加载SQL。
2,参数的绑定:PreparedStatement是通过"?"通配符(占位符)来表示参数,然后通过setXxx()将"?"一一替换的方式绑定参数。
Statement没有任何绑定参数方式,完全拼接字符串的方式来进行绑定。
在以后的学习中,我们要全部用PreparedStatement对象进行JDBC的操作。
2,ResultSet对象包含查询的结果集,ResultSet抽象了SQL语句的结果,提供了逐行访问结果的方法。在没有自动或半自动ORM技术的时候,ResultSet是唯一的较为简便的获得数据库中数据的技术。
ResultSet的方法:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false。
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值。
3、释放连接。cn.close();
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection可滚动、更新的记录集。
|
|