博客概要
具体以“打印全部信息”为例子,撰写JDBC的几种连接使用方法~
文章目录
方法一(最复杂,无任何封装、调用)
不做任何封装,就干写,纯写…
具体代码:
/**
* 最复杂,无封装
* 打印全部
*/
@Override
public void printAllU() {
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库
Connection conn = DriverManager.getConnection
("jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8", "root", "123456");
//3.准备sql语句
String sql="select * from tb_user";
//4.选中语句并预编译处理
PreparedStatement pstm = conn.prepareStatement(sql);
//5.产生结果
ResultSet rs = pstm.executeQuery();
//6.处理结果
while (rs.next()){
System.out.println("*用户编号:" + rs.getInt(1) + ",\t*用户名称:" + rs.getString(2) + ",\t*用户密码:" + rs.getString(3) + ",\t*用户类型:" + rs.getInt(4));
}
//7.释放连接
rs.close();
pstm.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
特征:每写一个功能就要写类似代码,重复代码巨多,代码冗余大,累人,而且不美观= =
方法二(稍微简化,轻微封装)
就在同一类之下,对驱动地址、数据库连接地址、数据库用户名以及数据库密码,做了封装,提高了一点效率,减少了一点点重复代码,但半斤八两…
具体代码:
//封装驱动地址、数据库信息
private String driver="com.mysql.jdbc.Driver";
private String url="jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8";
private String jdbcuser="root";
private String pwd="123456";
/**
* 稍微简化,有封装
* 打印全部
*/
@Override
public void printAllU() {
try {
//1.加载数据库驱动
Class.forName(driver);
//2.连接数据库
Connection conn = DriverManager.getConnection(url, jdbcuser, pwd);
//3.准备sql语句
String sql="select * from tb_user";
//4.选中语句并预编译处理
PreparedStatement pstm = conn.prepareStatement(sql);
//5.产生结果
ResultSet rs = pstm.executeQuery();
//6.处理结果
while (rs.next()){
System.out.println("*用户编号:" + rs.getInt(1) + ",\t*用户名称:" + rs.getString(2) + ",\t*用户密码:" + rs.getString(3) + ",\t*用户类型:" + rs.getInt(4));
}
//7.释放连接
rs.close();
pstm.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
特征:减少了一定量的代码重复,但是其实对减少冗余来说也还是杯水车薪的,每写一个功能也还是要写很多类似代码,同样累人,不美观= =
方法三(简单,使用封装,调用util工具类)
充分使用封装,在util工具类中创建DBUtil,在其中将数据库信息、加载数据库驱动、获取数据库连接、获取sql语句并进行预编译以及释放资源的等方法全都封装起来,在使用的时候只要通过DBUtil调用具体方法就好了,就,贼舒服~
实现类
具体代码:
DBUtil db=new DBUtil();
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
/**
* 简化,封装
* 打印全部
*/
@Override
public void printAllU() {
try {
//1.加载数据库驱动
//2.连接数据库
conn = db.getConn();
//3.准备sql语句
String sql="select * from tb_user";
//4.选中语句并预编译处理
Object[] params={};
//5.产生结果
rs = db.executeQuery(sql,params);
//6.处理结果
while (rs.next()){
System.out.println("*用户编号:" + rs.getInt(1) + ",\t*用户名称:" + rs.getString(2) + ",\t*用户密码:" + rs.getString(3) + ",\t*用户类型:" + rs.getInt(4));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//7.释放连接
db.closeResource(rs, pstm, conn);
}
}
工具类
具体代码:
//封装驱动地址、数据库信息
private String driver = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8";
private String jdbcuser = "root";
private String pwd = "123456";
public Connection conn = null;
public PreparedStatement pstm = null;
public ResultSet rs = null;
//加载驱动+连接数据库
public Connection getConn() {
try {
//加载数据库驱动
Class.forName(driver);
//获取数据库连接
conn = DriverManager.getConnection(url, jdbcuser, pwd);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//释放资源
public void closeResource(ResultSet rs, PreparedStatement pstm, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (pstm != null) {
try {
pstm.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//实现增删改BaseDao封装 -- Object[]占位“?”不知道是什么数据类型,所以用了泛型处理
public int executeUpdate(String sql, Object[] params) {
int num = 0;
try {
//预编译
conn.prepareStatement(sql);
//处理占位符“?”
//判空
if (params != null) {
//循环获取
for (int i = 0; i < params.length; i++) {
//因为不必知道类型,所以用泛型Object
pstm.setObject((i + 1), params[i]);
}
}
num = pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
return num;
}
//实现查询BaseDao封装 -- Object[]占位“?”不知道是什么数据类型,所以用了泛型处理
public ResultSet executeQuery(String sql, Object[] params) {
ResultSet rs = null;
try {
//预编译
pstm = conn.prepareStatement(sql);
//处理占位符“?”
//判空
if (params != null) {
//循环获取
for (int i = 0; i < params.length; i++) {
//因为不必知道类型,所以用泛型Object
pstm.setObject((i + 1), params[i]);
}
}
rs = pstm.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
特征:大大减少了重复代码,大大减少了代码冗余,整洁又美观,方便又舒适,哦耶~
方法四(更简单,使用封装,调用工具类,设置properties资源配置文件)
方法四是在方法三的基础之上,将驱动地址以及数据库的信息(包括数据库地址、数据库用户名和数据库密码)进一步封装到资源配置文件db.properties之中,这样做,能够方便用户通过直接修改资源配置文件而完成信息的更新修改!更加人性化了有木有~
工具类(部分代码区别)
具体代码:
private static String driver;
private static String url;
private static String jdbcuser;
private static String pwd;
public Connection conn = null;
public PreparedStatement pstm = null;
public ResultSet rs = null;
public static Properties properties = new Properties();
//静态加载资源配置文件
static {
try {
properties.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
driver = properties.getProperty("driver");
url = properties.getProperty("url");
jdbcuser = properties.getProperty("jdbcuser");
pwd = properties.getProperty("pwd");
} catch (IOException e) {
e.printStackTrace();
}
}
db_properties资源配置文件
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8
jdbcuser = root
pwd = 123456
特征:大大减少了重复代码,大大减少了代码冗余,整洁又美观,方便又舒适,加之人性化升级~
总结
JDBC创建使用七步曲,以上都是围绕这“七步”做具体的简化和扩充~
1.加载数据库驱动
2.获取数据库连接
3.准备sql语句
4.选中语句并执行——预编译处理
5.产生结果
6.处理结果
7.释放连接