JDBC——原理、步骤、使用方法、BaseDao封装工具类
一、JDBC工作原理
从图中可以看到JDBC的几个重要组成要素。最顶层是我们自己编写的Java应用程序,Java应用程序可以使用集成在JDK中的java.sql和javax.sql包中的JDBC API来连接和操作数据库。下面我就采用从上到下的顺序依次讲解JDBC的组成要素。
1、JDBC API
JDBC API 由Sun公司提供,其中提供了Java应用程序与各种不同数据库交互的标准接口,如Connection(连接)接口,Statement接口,ResultSet(结果集)接口,RreparedStatement接口等。开发者使用这些JDBC接口进行各类数据库操作。
2、JDBC Driver Manager
JDBC Driver Manager(驱动程序管理器)由Sun公司提供,它是JDBC体系结构的支柱,负责管理不同的JDBC驱动,把Java应用程序连接到相应的JDBC驱动程序上,位于JDK的java.sql包中。
3、JDBC 驱动
JDBC驱动由各个数据库厂商或第三方中间件厂商提供,负责连接各种不同的数据库。例如,上图中访问MySQL和Oracle时需要不同的JDBC驱动,这些JDBC驱动都实现了JDBC API中定义的各种接口。在开发Java应用程序时,只需正确加载驱动,正确调用JDBC API,就可以进行数据库访问了。
二、JDBC API介绍
JDBC API主要为我们做三件事:与数据库建立连接、发送SQL语句、处理结果。
如下图展示了JDBC的工作过程和主要接口及作用。
1、********DriverManager类:装载驱动程序,并为创建新的数据库连接提供支持。
2、*********Connection接口:负责连接数据库并担任传送数据的任务。
3、**********Statement接口:由Connection产生,负责执行SQL语句。
4、***********ResultSet接口:负责保存和处理Statement执行后所产生的查询结果。
5、PreparedStatement接口:Statement的子接口,也由Connection产生,同样负责执行SQL语句。与Statement接口相比, PreparedStatement接口具有高安全性、高性能、高可读性和高可维护性的优点。
三、JDBC访问数据库的步骤
1、加载驱动
Class.forName("JDBC驱动类的名称");
2、与数据库建立连接
Connection conn=DriverManager.getConnection(数据库连接字符串,数据库用户名,密码);
3、发送SQL语句,并得到返回结果
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("sql语句");
4、处理返回结果
//处理返回结果主要是针对查询操作的结果集,通过循环取出结果集中的每条记录并做相应的处理//while(rs.next()){
//int id=rs.getInt("id");
//String name=rs.getString("name");
//}
四、使用方法
说了这么多原理性的东西,接下来就上手操作一番,把咱们的增删改查走一波吧!
一、新增
//1、加载JDBC驱动
Class.forName("com.mysql.jdbc.Driver");
//2、与数据库建立连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/rainquality","root","123456");
//3、发送sql语句并得到返回结果
PreparedStatement ps=conn.preparedStatement("insert into RainQulity (id,districtName,monitorTime,) values (?,?,?)");
ps.setInt(1,id);
ps.setString(2,districtName);
ps.setString(3,monitorTime);
//4、处理返回结果
int result=ps.excuteUpdate();
二、删除
//1、加载JDBC驱动
Class.forName("com.mysql.jdbc.Driver");
//2、与数据库建立连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/rainquality","root","123456");
//3、发送sql语句并得到返回结果
PreparedStatement ps=conn.preparedStatement("delete from RainQuality where id=?");
ps.setInt(1,id);
//4、处理返回结果
int result=ps.excuteUpdate();
三、修改
//1、加载JDBC驱动
Class.forName("com.mysql.jdbc.Driver");
//2、与数据库建立连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/rainquality","root","123456");
//3、发送sql语句并得到返回结果
PreparedStatement ps=conn.preparedStatement("update RainQuality set districtName=?,monitorTime=? where id=?");
ps.setString(1,districtName);
ps.setString(2,monitorTime);
ps.setInt(3,id);
//4、处理返回结果
int result=ps.excuteUpdate();
四、查询
//1、加载JDBC驱动
Class.forName("com.mysql.jdbc.Driver");
//2、与数据库建立连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/rainquality","root","123456");
//3、发送sql语句并得到返回结果
PreparedStatement ps=conn.preparedStatement("update RainQuality set districtName=?,monitorTime=? where id=?");
ps.setString(1,districtName);
ps.setString(2,monitorTime);
ps.setInt(3,id);
//4、处理返回结果
List<RainQuality> list=new ArrayList<RainQuality>();
ResultSet rs=ps.excuteQuery();
while(rs.next()){
RainQuality rq=new RainQuality();
rq.setId(rs.getInt("id"));
rq.setDistrictName(rs.getString("districtName"));
rq.setMonitorTime(rs.getString("monitorTime"));
list.add(rq);
}
五、工具类BaseDao
看了这么多重复的代码是不是有点人困马乏的?没错,这不符合咱们面向对象的编程思想,有这么多重复的代码大家是不是想要把他封装起来调用?诶,下面就给大家一个封装类BaseDao
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 数据库连接与关闭工具类
*/
public class BaseDao {
private String driver = "com.mysql.jdbc.Driver";// 数据库驱动字符串
private String url = "jdbc:mysql://localhost:3306/rainquality";// 连接URL字符串
private String user = "root"; // 数据库用户名
private String password = "123456"; // 用户密码
Connection conn = null; // 数据连接对象
/**
* 获取数据库连接对象
*/
public Connection getConnection() {
if(conn==null) {
// 获取连接并捕获异常
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace(); // 异常处理
}
}
return conn; // 返回连接对象
}
/**
* 关闭数据库连接
* @param conn 数据库连接
* @param stmt Statement对象
* @param rs 结果集
*/
public void closeAll(Connection conn, Statement stmt,
ResultSet rs) {
// 若结果集对象不为空,则关闭
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若Statement对象不为空,则关闭
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若数据库连接对象不为空,则关闭
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 增、删、改的操作
* @param sql 预编译的 SQL 语句
* @param param 参数的字符串数组
* @return 影响的行数
*/
public int exceuteUpdate (String preparedSql, Object[] param) {
PreparedStatement pstmt = null;
int num = 0;
conn = getConnection();
try {
pstmt = conn.prepareStatement(preparedSql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
//为预编译sql设置参数
pstmt.setObject(i + 1, param[i]);
}
}
num = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally{
closeAll(conn,pstmt,null);
}
return num;
}
}
* 数据库连接与关闭工具类
*/
public class BaseDao {
private String driver = "com.mysql.jdbc.Driver";// 数据库驱动字符串
private String url = "jdbc:mysql://localhost:3306/rainquality";// 连接URL字符串
private String user = "root"; // 数据库用户名
private String password = "123456"; // 用户密码
Connection conn = null; // 数据连接对象
/**
* 获取数据库连接对象
*/
public Connection getConnection() {
if(conn==null) {
// 获取连接并捕获异常
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace(); // 异常处理
}
}
return conn; // 返回连接对象
}
/**
* 关闭数据库连接
* @param conn 数据库连接
* @param stmt Statement对象
* @param rs 结果集
*/
public void closeAll(Connection conn, Statement stmt,
ResultSet rs) {
// 若结果集对象不为空,则关闭
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若Statement对象不为空,则关闭
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若数据库连接对象不为空,则关闭
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 增、删、改的操作
* @param sql 预编译的 SQL 语句
* @param param 参数的字符串数组
* @return 影响的行数
*/
public int exceuteUpdate (String preparedSql, Object[] param) {
PreparedStatement pstmt = null;
int num = 0;
conn = getConnection();
try {
pstmt = conn.prepareStatement(preparedSql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
//为预编译sql设置参数
pstmt.setObject(i + 1, param[i]);
}
}
num = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally{
closeAll(conn,pstmt,null);
}
return num;
}
}
这个工具类给大家简化了增删改的操作,今后写增删改的代码调用BaseDao后只需要三句代码就可以了
1、新增
public int insert(RainQuality rq) {
//编写SQL语句
String sql="insert into RainQuality (id,districtName,monitorTime,) values (?,?,?)";
String sql="insert into RainQuality (id,districtName,monitorTime,) values (?,?,?)";
//数组传值
Object[] array={rq.getId(),rq.getDistrictName(),rq.getMonitorTime()};
Object[] array={rq.getId(),rq.getDistrictName(),rq.getMonitorTime()};
//调用BaseDao的exceuteUpdate (String preparedSql, Object[] param)方法并返回处理结果
return this.exceuteUpdate(sql, array);
}
return this.exceuteUpdate(sql, array);
}
2、删除
public int delete(int id) {
//编写SQL语句
String sql="delete from RainQuality where id=?";
//数组传值
Object[] array={id};
//调用BaseDao的exceuteUpdate (String preparedSql, Object[] param)方法并返回处理结果
return this.exceuteUpdate(sql, array);
}
3、修改
public int update(RainQuality rq) {
//编写SQL语句
//编写SQL语句
String sql="update RainQuality set districtName=?,monitorTime=? where id=?";
//数组传值
//数组传值
Object[] array={rq.getDistrictName(),rq.getMonitorTime(),rq.getId()};
//调用BaseDao的exceuteUpdate (String preparedSql, Object[] param)方法并返回处理结果
//调用BaseDao的exceuteUpdate (String preparedSql, Object[] param)方法并返回处理结果
return this.exceuteUpdate(sql, array);
}
}
好了,今天就给大家简单介绍了一下JDBC的工作原理还有使用方法以及一个超级好用的工具类BaseDao
如果大家有什么建议或者意见,欢迎给楼主在下面评论,谢谢!!