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命令
3) 处理结果 。
1.2.Five important interfaces of JDBC
1. Connection:特定数据库的连接(会话)。在连接上下文中执行 SQL 语句
并返回结果
2. Statement:用于执行静态 SQL 语句并返回它所生成结果的对象
3. PreparedStatement:表示预编译的 SQL 语句的对象
4. CallableStatement:用于执行 SQL 存储过程的接口
5. ResultSet:表示数据库结果集的数据表,通常通过执行查询数据库的语
句生成
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 的方法)
a 协议名总是“jdbc”。
b 子协议名由JDBC驱动程序的编写者决定。
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
2) 几种常见的数据库连接
-------------------------------jdbc-odbc---------------
URL:jdbc:odbc:datasource_name
驱动: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. 主要方法
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
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(5, "sd0702");
pstmt.executeUpdate();
2.3.3. CallableStatement
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 ;
Statement | PreparedStatement | CallableStatement | |
代码创建 | 数据库服务器的客户端 | 数据库服务器的客户端 | 数据库服务器端 |
代码存储 | 客户端 | 服务器端 | 服务器端 |
编程语言 | Java、SQL | Java、SQL | 服务器端特定数据库 语言 |
可配置性 | 灵活 | 差 | 差 |
可移植性 | 高 | 高 | (支持)差 |
效率 | 低 | 第一次低,以后高 | 高 |
建议:可以移植性好首先考虑的条件!然后再考虑性能问题!
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. 其次关闭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();}}