1.JDBC介绍
1.1.What is JDBC?
1. JDBC(Java Database Connectivity)是基于JAVA语言访问数据库的一种技术。
2. JDBC 的设计思想:由 SUN 公司(JCP)提供访问数据库的接口,由数据库厂商提
供对这些接口的实现,程序员编程时都是针对接口进行编程的。
3. JDBC 包括一套 JDBC 的 API 和一套程序员和数据库厂商都必须去遵照的规范。
1) java.sql包:提供访问数据库基本的功能
2) javax.sql包:提供扩展的功能
4. 数据库中间件
5. JDBC能够作些什么?
1) 链接到数据库
2) 在Java app中执行SQL命令
java
3) 处理结果 。mysql
1.2.Five important interfaces of JDBC
程序员
1. Connection:特定数据库的链接(会话)。在链接上下文中执行 SQL 语句
并返回结果
2. Statement:用于执行静态 SQL 语句并返回它所生成结果的对象
3. PreparedStatement:表示预编译的 SQL 语句的对象
4. CallableStatement:用于执行 SQL 存储过程的接口
5. ResultSet:表示数据库结果集的数据表,一般经过执行查询数据库的语
sql
句生成数据库
2.The step of developping a JDBC App
2.1. 注册 JDBC 驱动程序
1. Class.forName("oracle.jdbc.driver.OracleDriver");
2. Class.forName("oracle.jdbc.driver.OracleDriver");
3. java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver com.FirstJDBC编程
2.2. 建立数据库链接( 获取 Connection 的方法)
经过DriverManager 获取
Connection conn = DriverManager.getConnection(url, “username", “password");
1) JDBC的URL=协议名+子协议名+数据源名。
a 协议名老是“jdbc”。
b 子协议名由JDBC驱动程序的编写者决定。
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
2) 几种常见的数据库链接
-------------------------------jdbc-odbc---------------
驱动:sun.jdbc.odbc.JdbcOdbcDriver
URL:jdbc:odbc:datasource_name
-------------------------------oracle------------------
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@<machine_name><:port>:dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1521
-------------------------------mysql-------------------
驱动:org.gjt.mm.mysql.Driver
or: com.mysql.jdbc.Driver
URL:jdbc:mysql://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认3306
---------------------------SQL Server------------------
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1433
--------------------------DB2--------------------------
驱动:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是5000
-------------------------------------------------------
2.3. 建立 SQL( 存储过程)
2.3.1. 建立 Statement 对象
1. Statement stm = con.createStatement();
2. 主要方法
1) 执行查询 SQL 语句(返回结果集)
ResultSet executeQuery(String sql)throws SQLException;
2) 执行更新 SQL 语句(返回受影响的行数)
int rows = executeUpdate(String sql)throws SQLException
3) 万能执行 SQL 语句(若是第一个结果为 ResultSet 对象,则返回 true;若是其为更
新计数或者不存在任何结果,则返回 false)
boolean flag=stmt.execute(sql);
ResultSet rs=null;
int rows=0;
if(flag){
rs=stmt.getResultSet();
}
else{
rows=stmt.getUpdateCount();
}
2.3.2. PreparedStatement
1. 用来处理 SQL 结构、关键部分相同的 SQL 语句
2. pstmt=conn.prepareStatement(sql);
3. 例子
String sql = "SELECT * FROM student WHERE stu_sex=?";
//?表明一个占位符合,它的值是待定的。
pstmt=conn.prepareStatement(sql);
//下面的语句设置?的值
//第一参数是?的索引位置
//第二参数:把?的值设置成这个参数
pstmt.setString(1, “f");
rs=pstmt.executeQuery();
String sql = "INSERT INTO student(stu_name,stu_sex,stu_age,stu_desc,stu_grade)
VALUES(?,?,?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, "LILY");
pstmt.setString(2, "F");
pstmt.setInt(3, 23);
pstmt.setString(4, "***");
pstmt.setString(5, "sd0702");
pstmt.executeUpdate();
2.3.3. CallableStatement
1. 用来执行存储过程
2. CallableStatement cstmt=con.prepareCall(sql);
3. 例子
String sql = "CALL getTotalStudent(?,?)";
CallableStatement cstmt=con.prepareCall(sql);
// 设置OUT和IN参数
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "xxx");
建立一个存储过程
in:参数从Java程序传到数据库的存储过程
out:反过来
SQl语句中建立存储过程:
1) delimiter //
2)
CREATE PROCEDURE getTotalStudent(OUT totalStudent integer(11),IN sex char(2))
BEGIN
SELECT count(*) INTO totalStudent FROM
student
WHERE stu_sex LIKE sex;
END//
3) delimiter ;
2.3.4. Statement 接口的比较
Statement接口的比较
|
Statement |
PreparedStatement |
CallableStatement |
代码建立 |
数据库服务器的客户端 |
数据库服务器的客户端 |
数据库服务器端 |
代码存储 |
客户端 |
服务器端 |
服务器端 |
编程语言 |
Java、SQL |
Java、SQL |
服务器端特定数据库 语言 |
可配置性 |
灵活 |
差 |
差 |
可移植性 |
高 |
高 |
(支持)差 |
效率 |
低 |
第一次低,之后高 |
高 |
选择:没有最好,只有最合适!
建议:能够移植性好首先考虑的条件!而后再考虑性能问题!
2.4.How to handle resultset
1. 经过 index 获取字段的值 。
String getString(int columnIndex) //int类型的参数
SELECT * FROM student;//默认顺序按表里的定义顺序
rs.getString(3);//stu_sex
SELECT stu_name,stu_sex,stu_desc FROM student;
rs.getString(3);//stud_desc
columnIndex:select子句中该字段的索引位置
2. 经过字段名获取字段的值。
String getString(String columnName) //String类型的参数
以 Java 编程语言中 String 的形式检索此 ResultSet 对象的当前行中指定列的值。
rs.getString("stu_name");//stu_name
rs.getInt("stu_id");//stu_id
3. Java 类型到 SQL 类型的映射。
2.5. 关闭 JDBC
1. 首先关闭记录集; 2. 其次关闭Statement; 3. 最后关闭链接对象。 if(rs !=null){ try{rs.close();}catch(SQLException e){e.printStackTrace();}} if(stm!=null){try{stm.close();}catch(SQLException e){e.printStackTrace();}} if(con!=null){try{con.close();}catch(SQLException e){e.printStackTrace();}}