您的位置:首页 > 其它

JDBC六部曲

2015-09-19 00:42 155 查看
JDBC
l 什么是JDBC?

n Java DataBase Connectivity

l 接口有什么作用?

n 使程序“可插拔”,易于扩展。

n 接口是一套规范,程序员应该面向接口去调用,不需要关心接口底层的具体实现。

l JDBC的本质是一套规范一套接口,是SUN定义的J2EE规范之一。所有的java程序员面向JDBC接口调用,所有的数据库厂商程序员面向JDBC规范实现。实现类被称作“驱动”。所有的驱动都是以.jar结尾的文件。所以在编写JDBC程序之前需要将驱动配置到环境变量CLASSPATH中,如:

u CLASSPATH= .;F:\bjpowernode\MySQL\mysql-connector-java-5.0.8-bin.jar

u 注意配置后一定要重启启动cmd

l JDBC编程六步曲

n 注册驱动

//创建驱动对象

java.sql.Driver driver = new com.mysql.jdbc.Driver();

//java.sql.Driver driver = new oracle.jdbc.driver.OracleDriver();

java.sql.DriverManager.registerDriver(driver);

n 获取数据库连接

//URL格式: 协议---IP---Port---DBNAME

//Mysql jdbc:mysql://127.0.0.1:3306/bjpowernode

//Oracle jdbc:oracle:thin:@ 127.0.0.1:1521:bjpowernode

String url = “jdbc:mysql://127.0.0.1:3306/bjpowernode”;

String username = “root”;

String password = “root”;

java.sql.Connection conn = DriverManager.getConnection(url,username,password);

n 获取数据库操作对象

Statement stmt = conn.createStatement();

n 执行SQL语句

String sql = “DELETE FROM EMP_BAK WHERE EMPNO=7369”;

stmt.executeUpdate(sql); //执行insert,update,delete (DML)

String sql = “SELECT ENAME,SAL FROM EMP”;

ResultSet rs = stmt.executeQuery(sql); //执行查询语句(DQL)

n 如果执行的是查询语句,处理结果集

while(rs.next()){ //SELECT ENAME AS A,SAL AS
B FROM EMP;

//通过查询结果的字段位置获取数据,获取为字符串类型

String ename = rs.getString(1);

//通过查询结果的字段位置获取数据,获取为指定类型

double sal = rs.getDouble(2);

//通过查询结果的字段名称获取数据(推荐),获取为字符串类型

String ename = rs.getString(“A”);

//通过查询结果的字段名称获取数据(推荐),获取为指定类型

double sal = rs.getDouble(“B”);

}

n 释放资源(在finally语句块中释放)

//释放原则:从小到大依次释放,分别try…catch…

finally{

if(rs!=null){

try{rs.close();}catch(SQLException e){}

}

if(stmt!=null){

try{stmt.close();}catch(SQLException e){}

}

if(conn!=null){

try{conn.close();}catch(SQLException e){}

}

}

l 注册驱动的第二种方式

Class.forName(“com.jdbc.mysql.Driver”);

原理:

package com.mysql.jdbc;

public class Driver{

try

{

DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

l 不修改java程序,做到动态平滑移植数据库

编写一个属性文件dbinfo.properties,文件内容如下:

driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/bjpowernode

username=root

password=root

如果要连接其他数据库则修改该属性文件即可。

l 编写JDBC代码完成简单的用户登录业务。理解使用Statement数据库操作对象会存在SQL注入现象。思考:如何防止SQL注入。

l 使用预编译数据库操作对象PreparedStatement防止SQL注入。

PreparedStatement优点:

1. PreparedStatement可以将SQL语句框架预先编译。用户传递信息过来之后,即使信息中含有SQL语句关键字,那么该信息也会被看做普通的字符串处理,不会当做SQL语句的一部分被编译进去,从而解决了SQL注入问题。

2. 批量执行同构的SQL语句PreparedStatement效率高,因为编译一次执行多次。

3. PreparedStatement是类型安全的。

l JDBC事务处理

JDBC默认情况下采用的是自动提交机制,每执行一条DML(insert,update,delete)语句就提交一次。在现实的业务逻辑中应该一个完整的业务(完整事务,批量的DML语句)执行结束之后再提交。若业务处理过程中某个DML语句执行失败,则应该全部回滚。代码应该如下控制:

1. conn.setAutoCommit(false); //自动提交关闭

2. conn.commit(); //完整业务结束之后手动提交

3. conn.rollback(); //出现异常之后回滚

l JDBC批处理操作

批量执行同构的SQL语句应该采用JDBC提供的批处理。代码如下:

第一, 参数添加到batch中 ps.addBatch();

第二, batch中的参数达到一定数目之后,批量发送batch中的参数 ps.executeBatch();

第三, 清空batch ps.clearBatch();

l 连接池初步

为了提高(Java)Server连接数据库的效率,可以在JavaServer服务器中创建一个集合存储多个连接对象,该集合被称作“连接池”,用户如果访问服务器,那么服务器只需要从“连接池”中拿连接对象即可。连接池有如下属性:

1. 最大连接数(连接池中连接对象的上限)

2. 最小连接数(连接池中最少的连接对象数目)

3. 最大等待时间(客户如果获取不到空闲连接对象则进入等待状态,最大等待时间设置,如果超时则抛出异常。)

4. URL

5. username

6. password

7. driverclass

l 关于模糊查询

String sql = “select table_name from user_tables where table_name like
?”;

ps = conn.prepareStatement(sql);

ps.setString(1,”%T%”);

rs = ps.executeQuery();

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: