回顾JDBC
java.sql.*包下的接口和类:
1).Driver: 驱动的标准接口。
2).DriverManager: 驱动管理器,管理多个加载的驱动程序;
能够根据数据库的url标识,自动查找合适的数据库驱动类。
3).Connection: 和数据库连接的对象形式,代表了一个和数据库的连接;
4).Statement: 用以执行SQL语句
a. Statement;
b. PreparedStatement(继承自Statement);
5).ResultSet: 结果集,用来获取select语句返回的数据结果
JDBC的执行流程:
1.由DriverManager根据数据库的URL标识,自动识别查找注册给DriverManager的多各Driver对象,
2.通过调用Driver对象的Connect方法和数据库之间建立起来连接(此时返回Connection对象)
3.建立起来了解之后,由Statement对象负责搬运sql语句到数据库服务端执行,然后将执行结果搬回程序端
4.处理程序端返回的ResultSet。
数据库的URL标识:
数据库url标识的存在主要是为了能够让DriverManager通过这个标示可以正确的识别使用的数据库,以及查找到正确的Driver对象,并且通过这个Driver可以和数据库之间建立起来连接。
这个url由数据库厂商提供。
基本格式:
jdbc:subprotocol:subname
oracle :jdbc:oracle:thin:@localhost:1521:xe
mysql : jdbc:mysql://localhost:3306/javademo?characterEncoding=UTF8
db2:jdbc:db2://{host}[:{port}]/{database}
note:其中还可以包含用户名密码编码等信息,
JDBC编程步骤:
1.注册驱动/加载驱动
2.获取连接
3.创建Statement对象
4.执行sql
5.处理结果集
6.关闭资源。
1.注册驱动(加载驱动):
注册的方式:
1.使用类加载器(使用反射的方式)
Class.forName(driverName);//driverName=”数据库驱动类全类名”;
2.实例化Driver
Driver driver =
new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(driver);
3.System.setProperty("jdbc.drivers", "oracle.jdbc.driver.OracleDriver");
或者运行程序时填加虚拟机参数jdbc.drivers
-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
全类名:
Db2:com.ibm.db2.jcc.DB2Driver
Oracle:oracle.jdbc.driver.OracleDriver
Mysql:com.mysql.jdbc.Driver
2.建立连接
连接方式:
1.DriverManager的getConnection方法
getConnection(url);//url中需要有用户名密码,比如mysql连接就可以
getConnection(url,properties);//将用户名密码存放在java.util.Properties对象中
getConnection(url,user,passwd);
DriverManager中的getConnection其实也是调用的Driver.connect方法,因此可以直接使用。
2.直接调用Driver.connect方法执行
Driver d = new DriverClass();
d.connect(url,properties);
3.创建Statement:
Statement:connection.createStatement();
1.创建时不需要传递sql语句,但是执行时需要传递sql语句
2.如果涉及到动态参数的传递,必须使用字符串拼接
PreparedStatement:connection.prepareStatement(String sql);
1.创建时就需要传递sql语句,执行的时候不需要传递sql语句
2.如果涉及到动态参数的传递,可以使用字符串拼接,也可以使用?占位的形式
给?号传值使用的是
pstmt.setType(index,value);
index从1开始
3.提供预编译的功能,某种程度上可以避免sql注入的问题
4.提前做语法检查,在给?赋值的过程中要求数据类型一定要匹配,这样在某种程度上可以避免因为数据类型不匹配而发生的异常
4.执行sql语句:
execute:返回boolean类型的值,代表是否有结果集返回
executeUpdate:返回int类型的值,代表的是,操作执行完成后,受影响的数据库的行计数(针对于insert,update,delete)
executeQuery:返回的是ResultSet
ResultSet:类似于指针或者游标的东西,里边保存的不是所有的结果,而是指向结果集的正上方。所以如果一旦连接关闭那么ResultSet将取不到值。一个statement对象对应一个resultSet对象
5.处理结果:有结果集,处理结果集
ResultSet
next(),每执行一次,向下移动一次,如果有值,返回true,如果没值返回false
while(rs.next()){
rs.getType(index/columnName);
如果传的是index,那么索引是从1开始的。
例如:
执行select id,last_name from s_emp;
那么1代表的就是id,依次类推
}
6.关闭资源
先开的后关
笔试面试总结:
1.注册Driver的三种方式
Class.ForName()
new Driver();//new oracle.jdbc.driver.OracleDriver();
System.setProperty("jdbc.drivers","oracle.jdbc.driver.OracleDriver");
2三种执行方法的返回值分别是什么含义execute(sql)
execute(); boolean 是否有结果集返回
executeUpdate(); int 操作影响了多少行
executeQuery(); 返回结果集
3.Statement和PreparedStatement之间的关系和区别.
Statement:connection.createStatement();
1.创建时不需要传递sql语句,但是执行时需要传递sql语句
2.如果涉及到动态参数的传递,必须使用字符串拼接
PreparedStatement:connection.prepareStatement(String sql);
1.创建时就需要传递sql语句,执行的时候不需要传递sql语句
2.如果涉及到动态参数的传递,可以使用字符串拼接,也可以使用?占位的形式
给?号传值使用的是
pstmt.setType(index,value);
index从1开始
3.提供预编译的功能,某种程度上可以避免sql注入的问题
4.提前做语法检查,在给?赋值的过程中要求数据类型一定要匹配,这样在某种程度上可以避免因为数据类型不匹配而发生的异常