1.什么是JDBC
JDBC(Java Data Base Connectivity,java数据库连接):是一种用于执行sql语句的java
API(接口),可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成,JDBC提供了一种基准,据此可以构建更高级的工具和标准,使数据开发人员能够编写数据库应用程序
2.数据库驱动
数据库厂商的JDBC接口实现 Connection 等接口的实现类的jar文件
3.常用接口
Driver接口
由数据库厂商提供
装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");
装载Oracle驱动:class.forName("oracle.jdbc.driver.oracleDriver");
Connection接口
connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果
DriverManager.getConnection(url,user,password)方法建立在JDBC URL中定义数据 库Connection连接上
连接MySQL数据:Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:port/database","user","password");
连接SQLServer数据库:connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port;DatabaseName=database","user","password");
4.常用方法
createStatement();创建向数据库发送sql的statement对象
prepareStatement(sql); 创建向数据库发送预编译sql的PrepareSatement对象
prepareCall(sql); 创建执行储存过程的callableStatement对象
不常用:
setAutoCommit(boolean autoCommit); 设置事物自动提交
commit(); 在链接上提交事物
rollback(); 在此链接上回滚事物
5.Statement接口
用于执行静态sql语句并返回它生生成的结果对象
三种Statement类
Statement:由createStatement创建,用于发送简单的sql语句(不带参数)、
PreparedStatement:继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的sql语句,preparedStatement对象比Statement对象的效率更高,并且可以防止sql注入,所以我们一般都使用PreparedStatement
callableStatement:继承自preparedStatement接口,由方法prepareCall创建,用于存储过程
常用的Statement方法
executeQuery(String sql); 运行select语句,并返回ResultSet结果集
executeUpdate(String sql);运行insert/update/delete操作,返回更新的行数
不常用:
addBatch(); 把多条sql语句放到一个批处理中
executeBatch(); 向数据库发送一批sql语句执行
execute(String sql); 运行语句,返回是否有结果集
6.ResultSet接口
ResultSet提供检索不同类型字段的方法,
getString(int index),getString(String columnName);获得在数据库里是varchar,char等类型的数据对象。
getFloat(int index),getFloat(String columnName); 获得在数据库里是float类型的数据对象
getDate(int index),getDate(String columnName)获得在数据库里是Date类型的数据
getBoolean(int index),getBoolean(String columnName);获得在数据库里是Boolean类型的数据
getobject(int index) getobject(String columnName)获得在数据库里任意类型的数据
ResultSet提供了对结果集进行滚动的方法
next()移动到下一行
Previous():移动到前一行
absolute(int row)移动到指定行
beforFirst():移动到resultSet的最前面
afterLast() 移动到resulteSet最后面
依次关闭对象或连接:ResultSet Statement Connection
7.JDBC的使用步骤
1. 加载JDBC驱动
Class.forName(com.MySql.jdbc.Driver); //不会对具体的驱动产生一依赖
2. 建立数据库连接Connection
Connection conn = DriverManager.getConnection(url,user.password);
URL 用于标识数据库的位置,通过URL地址告诉JDBC程序连接那个数据库
URL的合法写法:
jdbc:mysql:[]//localhost:3306/test?参数名:参数值
jdbc 协议
mysql:[] 子协议
//localhost:3306/ 主机:端口
test? 数据库
其他参数:useUnicode=true&characterEncoding=utf8
3. 创建执行Sql的语句Statement
String id = "5";
String sql ="delete from table where id=" + id;
Statement stm = conn.createStatement();
stm.executequery(sql);
//存在sql注入的危险
//如果用户传入的id为"5 or 1" 那么将删除表中的所有记录
/*PreparedStatement 有效的防止sql注入(sql语句在程序运行之前进行了预编译,当运行时动态的把参数传递给PreprareStatement时,即使参数里有敏感字符如 or '1=1' 数据库也会作为一个参数字段的属性值来处理而不会作为一个sql指令)*/
String sql = "insert into user(name,pwd) values(?,?);
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,"col_value"); //占位符顺序从1开始
ps.setString(1,"123456"); //也可以使用setObject
ps.executeQuery();
4. 处理执行结果集ResultSet
ResultSet rs = ps.executeQuery();
while(rs.next()){
rs.getString(col_name);
rs.getInt(1);
}
5. 释放资源
//数据库连接(connection)非常耗资源,尽量晚创建,尽量早释放
//都要加try catch 以防止前面关闭出错,后面不执行
conn.close();
ps.close();
rs.close();