JDBC 简要架构
Java Application
JDBC(API)
|–>面向程序员(标准:java.sql.*)
|–>面向数据库厂商(标准的实现:驱动)
DBMS (MySQL,Oracle,…)
4.JDBC 应用构建(Java项目)
1)加载驱动(Driver):将驱动读到内存
a)驱动由谁提供(厂商)
b)已经写好的一些class(jar文件)====================================
java.sql.Driver 接口 * 用来连接数据库的方法:connect()
java.sql.DriverManager 类 * 连接数据库的辅助类
数据库连接:
加载、注册驱动:贾
Class.forName(“驱动类名”);”com.mysql.jdbc.Driver”
建立连接:
con = DriverManager.getConnection(url,username,password);
“jdbc:mysql://localhost:3306/hr”,”root”,””
在db.xml文件中写上面的配置参数,用tarena.util.DBUtil提取信息
java.sql.Conection 接口
表示客户端与(服务器)数据库之间的一个抽象连接
方法
createStatement()在当前连接上,创建执行 Statement 对象
prepareStatement(sql)准备一条带?占位符的 sql 语句
close()
java.sql.Statement 接口
专门执行 SQL 语句的工具
方法
executeQuery(sql)执行查询,返回查询结果 ResultSet《查》
executeUpdate(sql)执行 insert,update,delete《增、删、改》,返回影响的行数
setFetchSize(行数)
执行的查询结果集,
每次 rs.next()
下载 100 条数据,
* 减少网络通信次数
addBatch(sql) 将 sql 语句加为一批
executeBatch() 执行本地缓存的一批sql
clearBatch() 清除
* 减少网络通信次数
close()
java.sql.PreparedStatement 接口
1) is a Statement (继承关系) 是 Statement 的子接口
2)增强Statement的应用(扩展)只能表示数据
3)允许使用占位符“?”
方法
set类型(问号序号, 值) 问号从1开始
1)如何构建对象?
调用Connection对象的prepareStatement(sql)
2)相关方法应用?
a)executeUpdate()
b)executeQuery()
addBatch()
3)资源释放?
a)close()
不接收参数,执行的是实现准备好的语句
借助PreparedStatement对象可以简化SQL中值的拼接
操作(使用占位符),提高程序的执行效率,
保证系统的安全(防止SQL注入)
PreparedStatement对象是一个特殊的Statement,它继承
了Statement,本身支持在SQL语句中使用占位符”?”
借助此PreparedStatement可以发送如下类似SQL语句:
String sql=”insert msg values (null,?,?,now())”;
String sql=”select * from msg where id=?”;
String sql=”update msg set title=? where id=?”;
“?”符号永远从左向右数,第一个问号下标为1,
后面的以此类推。
创建PreparedStatement时可以采用如下方式:
PreparedStatement pstmt=
conn.preparedStatement(sql);//编译SQL
给"?"赋值(例如对于第一个insert语句)
pstmt.setString(1,'TA');//给第一个"?"符号赋值
pstmt.setString(2,'CA');//给第二个"?"赋值
发送SQL
pstmt.executeUpdate();
说明:
1)使用PreparedStatement可以简化SQL语句中
值的拼接,同时可以防止SQL注入。
2)使用PreparedStatement对于动态SQL(SQL语句中的值是变化的),
可提高程序的执行效率。
java.sql.ResultSet 接口
- 包装查询结果数据的对象
- 内部指针, 初始状态指向“第一行之前”,
向下移动时,可能移到“最后一行之后”
方法
next()下移指针,并返回当前地址是否有数据(trueh/false)
在指针当前行取数据
get类型(字段名)
get类型(字段序号) 序号从1 开始
日期、时间类型
java.util.Date
|- java.sql.Date 年月日
|- java.sql.Time 时分秒
|- java.sql.Timestamp 年月日时分秒毫秒
创建实例:
Date d = new Date(毫秒);
Time d = new Time(毫秒);
Timestamp d = new Timestamp(毫秒);
JDBC—>”贾琏欲执事”
贾-->加载驱动
Class.forName("com.mysql.jdbc.Driver");
琏-->连接数据库
Connection conn = DriverManager.getConnection(url,username,password);
欲-->预处理(防止sql注入)
String sql = "select * from tabname where name=?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, "zhangs");
执-->执行sql语句
ResultSet rs = stmt.executeQuery();
事-->结果处理
if(rs.next()){rs.getString("name"); }
JDBC连接数据库
•创建一个以JDBC连接数据库的程序,包含7个步骤:
加载JDBC驱动程序:
例如:现以连接mysql为例
a)将jar文件拷贝到java项目的某个文件夹(lib)中;
b)将jar文件添加到build path中
c)在程序中执行(例如main方法)
Class.forName(“com.mysql.jdbc.Driver”);
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),
这通过java.lang.Class类的静态方法forName(String className)实现。
例如:
try{
//加载MySql的驱动类
Class.forName(“com.mysql.jdbc.Driver”) ;
}catch(ClassNotFoundException e){
System.out.println(“找不到驱动程序类 ,加载驱动失败!”);
e.printStackTrace() ;
}
成功加载后,会将Driver类的实例注册到DriverManager类中。
2、提供JDBC连接的URL
•连接URL定义了连接数据库时的协议、子协议、数据源标识。
•书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:
(MySql的连接URL)
jdbc:mysql: //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;
useUnicode=true:
表示使用Unicode字符集。如果characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
连接数据库
2)建立连接
Connection conn=DriverManager.getConnection(url,user,pwd);
DriverManager主要用于管理驱动程序,
并通过驱动程序建立与数据库的连接
(Connection).
当我们借助DriverManager与其它数据库
建立连接时,我们要做哪些事情?
a)更换驱动程序
b)更换url(协议,端口)
c)用户名,密码
•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
•使用DriverManager的getConnectin(String url , String username ,String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。
例如: //连接MySql数据库,用户名和密码都是root
String url = “jdbc:mysql://localhost:3306/test” ;
String username = “root” ;
String password = “root” ;
try{
connection con =
DriverManager.getConnection(url,username,password ) ;
}catch(SQLException se){
System.out.println(“数据库连接失败!”);
se.printStackTrace() ;
}
4、创建一个Statement 预处理
•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt =
con.prepareCall(“{CALL demoSp(? , ?)}”) ;
5、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:
executeQuery 、executeUpdate和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。具体实现的代码:
ResultSet rs = stmt.executeQuery(“select * from …”) ;
int rows = stmt.executeUpdate(“insert into …”) ;
boolean flag = stmt.execute(String sql) ;
stmt.execute(sql);
其中”sql”可以为任意类型(DDL,DML,DCL)
6、处理结果 两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。
•使用结果集(ResultSet)对象的访问方法获取数据:
while(rs.next()){
String name = rs.getString(“name”) ;
String pass = rs.getString(1) ; // 此方法比较高效
}
(列是从左到右编号的,并且从列1开始)
7、关闭JDBC对象 释放资源(关闭对象)
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
if(rs != null){ // 关闭记录集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 关闭声明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 关闭连接对象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
class Driver implements java.sql.Driver {
static int i=10;
static {
//第一次加载 Driver 类时执行
Driver d = new Driver();
DriverManager.registDriver(d);
}
}
JDBC 实现CRUD操作?
操作:
1)insert
2)update
3)delete
4)select (结果集ResultSet的处理)
相关API:
1)DriverManager (getConnection(..))
2)Connection (createStatement())
3)Statment (execute(sql),executeUpdate(sql),executeQuery(sql))
4)ResultSet (next(),getXXX(..))
5)SQLException
6.JDBC 工具类(JDBCUtil)的抽取?
1)重复代码进行提取
2)简化代码编写,提高可维护性
JDBC元数据(MetaData)
1.何为元数据?
描述数据的数据。
例如:
wangdong
100000
id name salary 元数据
—- —— ——–
1 wangdong `100000 数据
2.使用元数据的目的?
1)描述数据
2)实现通用编程的一种手段。(高级编程)
3.常用的元数据对象?
1)DatabaseMetaData(自己了解)
通过Connection对象获得,此对象中
封装了一些连接数据库的信息,版本信息等。
2)ResultSetMetaData(重点掌握)
通过ResultSet对象获得,此对象中
封装了一些表的信息:例如表名,字段名,字段数
ResultSetMetaData rsmd=
rs.getMetaData();
JDBC 中的元数据?
所谓元数据一般指的是描述数据的数据。
例如: 如下的person,name都称之为元数据。
马宁
例如:下面有一张表
id name salary 元数据
– —– —–
1 A 100 数据
2 C 300
在JDBC中借助元数据可以实现通用编程。
在JDBC中元数据的代表类型为
1)DatabaseMetaData (了解):此对象需要借助Connection获得
2)ResultSetMetaData (掌握):此对象借助ResultSet对