零基础入门JAVAweb——JDBC的封装篇

🧑作者简介

📮首页:​​​​​​小罗のdiary的博客_优快云博客-单片机原理,java基本常识领域博主

🕴职业:👨‍🎓在校大学生

😍爱好:📝写博客,🎧听歌,🔌学习单片机,💻java,🏃跑步

🏆擅长:单片机的基本原理,java基本原理

🎉🎉欢迎来首页阅读我的博客🎉🎉


📖主要内容

💦💦💦💦💦💦💦💦💦💦💦

💦💦相较于未封装的JDBC,封装之后💦💦

💦💦的JDBC有什么优点,学会封装JD💦💦

💦💦BC的步骤和使用封装之后的SqlM💦💦

💦💦💦💦💦💦anager类💦💦💦💦💦💦

💦💦💦💦💦💦💦💦💦💦💦


📖目录

❤️一、封装之后的JDBC优点

✨(1)减少代码量,使其操作数据库变得精简

✨(2)统一驱动程序和连接字

❤️二、封装Jdbc的步骤

✨(1)导入Sql包  

✨(2)创建SqlManager封装类

✨(3)编写.properties后缀的文件

✨(4) 将properties文件导入到和SqlManager类同目录下

 ✨(5)编写SqlManager代码

🍟1.定义变量

🍟2.构造私有函数用于提取properties中数据库的信息,并赋值给SqlManager类中对应的成员属性

🍟3. 初始化

🍟4.创建数据库连接并执行SQL语句

 🍟5.执行无返回数据的数据查询,返回值是被改变的数据库项数或查询数据库的操作接口

🍟 6.断开数据库

🍟7.完整代码如下

 🍟8.执行SqlManager类检验是否编写成功

❤️三、使用JDBC

✨(1)数据库有关信息以写入.properties文件中

✨(2)test数据库中student表的信息如下

 ✨(3).jsp文件中使用SqlManager类

✨(4) 结果

🍟1.执行SQL语句:sqlQuery

🍟2.执行SQL语句:sqlUpdate


❤️一、封装之后的JDBC优点

(1)减少代码量,使其操作数据库变得精简

        在不同的文件当中(.java或.jsp等文件当中),我们操作数据库都需要有下面这些步骤:加载JDBC驱动程序->创建数据库连接->执行SQL语句->获取结果->关闭连接这些步骤。

而这些步骤的代码如下:

//利用Driver类数据库驱动加载代码如下
	//MySQL数据库8.0版本以上驱动类为com.mysql.cj.jdbc.Driver
	//MySQL数据库8.0版本以下驱动类为com.mysql.jdbc.Driver
	Class.forName("com.mysql.cj.jdbc.Driver");
	//利用DriverManager类连接数据库对象
	Connection con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/sys","root","123456");
	//Statement类对象执行SQL语句
	Statement sta=con.createStatement();
	//利用ResultSet类返回结果集
	ResultSet res=sta.executeQuery("select * from login");
	//遍历结果到网页
	while(res.next()){
		String Muser=res.getString("Muser");
		String Mpassword=res.getString("Mpassword");
		.out.print("用户名:"+Muser+"<br>"+"密"+"&nbsp;&nbsp;&nbsp;"+"码:"+Mpassword);
	}
    //关闭连接
    con.close();
    sta.close();
    res.close();

每次我们都需要将数据库的信息输入进去,非常不方便,以上是.jsp文件部分代码。

(2)统一驱动程序和连接字

我们不单单只连接MySql这一个数据库,还要连接其他的数据库,而连接不同的数据库所对应的驱动程序和连接字都不相同,所以说,要查询对应的数据,才能正确连接数据库。

❤️二、封装Jdbc的步骤

(1)导入Sql包  

步骤如下图所示

(2)创建SqlManager封装类

 其中类名为SqlManager包名为samples.util

(3)编写.properties后缀的文件

该文件是记录了要导入数据库的全部信息,该文件是一种属性文件,java封装了可以读取该文件里面内容的类 。

.txt文本文件输入你的数据库有关的信息,再将后缀名改成.properties即创建成功

#Sepecify the system  type: window or unix
system-type=windows

#specify the database's type
database-type=mysql

#specify some parameters
DBhost=127.0.0.1
DBport=3306
DBname=test
DBuser=root
DBpasswd=123456

根据你的数据库来修改里面的内容

(4) 将properties文件导入到和SqlManager类同目录下

同在samples.util包下

 (5)编写SqlManager代码

🍟1.定义变量

private static SqlManager p = null; 			//静态成员,支持单态模式
private PropertyResourceBundle bundle = null;	//配置资源文件
private static String jdbcDriver = null;		//JDBC驱动类型
private static String split = null;				//文件分隔符
private String DBType = null;					//数据库类型
private String DBhost = "127.0.0.1";			//数据库主机地址
private String DBname = "";						//数据库名
private String DBport = "";						//数据库端口
private String DBuser = "";						//数据库用户名
private String DBpasswd = "";					//数据库密码
//处理连接的变量
private Connection Sqlconn = null;                
private Statement Sqlstmt = null;               
private String strCon = null;                   //连接字

🍟2.构造私有函数用于提取properties中数据库的信息,并赋值给SqlManager类中对应的成员属性

private SqlManager() {							//私有构造函数
	try {
		//导入properties文件
		//不能写成"/sysConfig.properties"
		bundle = new PropertyResourceBundle(SqlManager.class.
				getResourceAsStream("sysConfig.properties"));
		//给成员属性赋值
		this.DBhost = getString("DBhost");
		this.DBname = getString("DBname");
		this.DBport = getString("DBport");
	
		this.DBuser = getString("DBuser");
		this.DBpasswd = getString("DBpasswd");
		
		//读取操作系统的类型
		String system_type = getString("system-type");
		if(system_type != null) {
			if(system_type.toLowerCase().equals("windows"))
				split = ";";
			else if(system_type.toLowerCase().equals("unix"))
				split = ":";
		}
		
		//读取数据库类型
		String database_type = getString("database-type");//读取数据库类型
		if(database_type != null) {
			if(database_type.toLowerCase().equals("mysql")) {
				jdbcDriver = "com.mysql.cj.jdbc.Driver";
				strCon = "jdbc:mysql://" + DBhost + ":" + DBport + "/"
						+ DBname;
			}
			//后面可添加其他类型的数据库,例如:SqlServer,oracle等数据库,也是读取jdbcDriver和strCon
		}
    } catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

🍟3. 初始化

//下面2个函数为一个整体
//单态模式:Java程序运行时,一个类只有一个实例,
//多个实例化就有多个线程,会冲突
public static SqlManager createInstance() {
	if(p == null) {
		p = new SqlManager();
		p.initDB();
	}
	return p;
}
//加载JDBC驱动程序
public void initDB() {				
	System.out.println(strCon);
	System.out.println(jdbcDriver);
	try {
		Class.forName(jdbcDriver);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		System.err.println("Can't Find Database Driver.");
	}
}

🍟4.创建数据库连接并执行SQL语句

public void connectDB() {
	try {
		System.out.println("SqlManager:Connecting to database ...");
		//获取连接
		Sqlconn = DriverManager.getConnection(strCon, DBuser, DBpasswd);
		//执行SQL语句
		Sqlstmt = Sqlconn.createStatement();		
	} catch (SQLException e) {
		// TODO Auto-generated catch block
	    System.err.println("ConnectDB" + e.getMessage());
	}
	System.out.println("SqlManager:Connect to database successful.");
}

 🍟5.执行无返回数据的数据查询,返回值是被改变的数据库项数或查询数据库的操作接口

//执行无返回数据的数据查询,返回值是被改变的数据库项数
//例如,对数据的添加删除修改等
public int executeUpdate(String sql) {
	int ret = 0;
	try {
		//执行数据库项数步骤
		ret = Sqlstmt.executeUpdate(sql);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		System.err.println("executeUpdate:" + e.getMessage());
	}
	return ret;
}
//查询数据库的操作接口
//例如,获取数据和查找数据等
public ResultSet executeQuery(String sql) {
	ResultSet rs = null;
	try {
		//返回结果集,该结果集只能用next()函数,若要使用其它函数,需要用代码来编写可执行其它函数的代码
		//而且while(next()){}只能被执行一个来回,即从头到尾,不能多次执行while(next()){}语句
		rs = Sqlstmt.executeQuery(sql);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		System.err.println("executeQuery" + e.getMessage());
	}
	return rs;
}

🍟 6.断开数据库

public void closeDB() {
	try {
		System.out.println("SqlManager:Close Connection to database ...");
		Sqlstmt.close();							//关闭查询
		Sqlconn.close();							//关闭连接
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		System.err.println("CloseDB" + e.getMessage());
	}
	System.out.println("SqlManager:Close connection successful.");
}

🍟7.完整代码如下

package samples.util;

import java.sql.*;
import java.util.PropertyResourceBundle;
public class SqlManager {
	//第一步,定义变量
	private static SqlManager p = null; 			//静态成员,支持单态模式
	private PropertyResourceBundle bundle = null;	//配置资源文件
	private static String jdbcDriver = null;		//JDBC驱动类型
	private static String split = null;				//文件分隔符
	private String DBType = null;					//数据库类型
	private String DBhost = "127.0.0.1";			//数据库主机地址
	private String DBname = "";						//数据库名
	private String DBport = "";						//数据库端口
	private String DBuser = "";						//数据库用户名
	private String DBpasswd = "";					//数据库密码
													//处理连接的变量
	private Connection Sqlconn = null;
	private Statement Sqlstmt = null;
	private String strCon = null;
	//第二步,构造私有函数用于提取properties中数据库的信息,并赋值给SqlManager类中对应的成员属性
	private SqlManager() {							//私有构造函数
		try {
			//导入properties文件
			//不能写成"/sysConfig.properties"
			bundle = new PropertyResourceBundle(SqlManager.class.
					getResourceAsStream("sysConfig.properties"));
			//给成员属性赋值
			this.DBhost = getString("DBhost");
			this.DBname = getString("DBname");
			this.DBport = getString("DBport");
			
			this.DBuser = getString("DBuser");
			this.DBpasswd = getString("DBpasswd");
			
			//读取操作系统的类型
			String system_type = getString("system-type");
			if(system_type != null) {
				if(system_type.toLowerCase().equals("windows"))
					split = ";";
				else if(system_type.toLowerCase().equals("unix"))
					split = ":";
			}
			
			//读取数据库类型
			String database_type = getString("database-type");//读取数据库类型
			if(database_type != null) {
				if(database_type.toLowerCase().equals("mysql")) {
					jdbcDriver = "com.mysql.cj.jdbc.Driver";
					strCon = "jdbc:mysql://" + DBhost + ":" + DBport + "/"
							+ DBname;
				}
				//后面可添加其他类型的数据库,例如:SqlServer,oracle等数据库,也是读取jdbcDriver和strCon
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//第三步,初始化,下面2个函数为一个整体
	//单态模式:Java程序运行时,一个类只有一个实例,
	//多个实例化就有多个线程,会冲突
	public static SqlManager createInstance() {
		if(p == null) {
			p = new SqlManager();
			p.initDB();
		}
		return p;
	}
	//加载JDBC驱动程序
	public void initDB() {				
		System.out.println(strCon);
		System.out.println(jdbcDriver);
		try {
			Class.forName(jdbcDriver);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.err.println("Can't Find Database Driver.");
		}
	}
	
	//获取资源文件字符串函数
	public String getString(String s) {	//读取资源文件的字符串
		return this.bundle.getString(s);
	}
	
	//第四步,创建数据库连接并执行SQL语句
	public void connectDB() {
		try {
			System.out.println("SqlManager:Connecting to database ...");
			//获取连接
			Sqlconn = DriverManager.getConnection(strCon, DBuser, DBpasswd);
			//执行SQL语句
			Sqlstmt = Sqlconn.createStatement();		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.err.println("ConnectDB" + e.getMessage());
		}
		System.out.println("SqlManager:Connect to database successful.");
	}
	
	//第5步,执行无返回数据的数据查询,返回值是被改变的数据库项数
	//例如,对数据的添加删除修改等
	public int executeUpdate(String sql) {
		int ret = 0;
		try {
			//执行数据库项数步骤
			ret = Sqlstmt.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.err.println("executeUpdate:" + e.getMessage());
		}
		return ret;
	}
	//第5步,查询数据库的操作接口
	//例如,获取数据和查找数据等
	public ResultSet executeQuery(String sql) {
		ResultSet rs = null;
		try {
			//返回结果集,该结果集只能用next()函数,若要使用其它函数,需要用代码来编写可执行其它函数的代码
			//而且while(next()){}只能被执行一个来回,即从头到尾,不能多次执行while(next()){}语句
			rs = Sqlstmt.executeQuery(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.err.println("executeQuery" + e.getMessage());
		}
		return rs;
	}
	
	//第6步,断开数据库
		public void closeDB() {
			try {
				System.out.println("SqlManager:Close Connection to database ...");
				Sqlstmt.close();							//关闭查询
				Sqlconn.close();							//关闭连接
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				System.err.println("CloseDB" + e.getMessage());
			}
			System.out.println("SqlManager:Close connection successful.");
		}
		
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//测试代码是否编写正确
		SqlManager.createInstance().connectDB();
		SqlManager.createInstance().closeDB();
	}

}

 🍟8.执行SqlManager类检验是否编写成功

执行成功的截图如下

❤️三、使用JDBC

(1)数据库有关信息以写入.properties文件中

(2)test数据库中student表的信息如下

 (3).jsp文件中使用SqlManager类

在编写代码之前我们还要将mysql包导入到以下目录,要让.jsp文件和mysql包都在WEB-INF文件夹下,如果是.java使用SqlManager类则省略这个步骤

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 第一步,导入包 -->
<%@ page import="java.sql.*" %>		
<%@ page import="samples.util.*" %>	
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>封装jdbc</title>
</head>
<body>
<table border="1">
		<caption>学生信息</caption>
		<tr>
			<th>id</th>
			<th>name</th>
			<th>sex</th>
			<th>score</th>
		</tr>
<% 
	//第二步创建sql语句
	String sqlQuery = null;
	String sqlUpdate = null;
	//第三步创建ResultSet结果集类或数据库项数
	ResultSet rs = null;
	int ret = 0;
	//第四步初始化(创建SqlManager对象并加载驱动管理器)
	SqlManager DBm = SqlManager.createInstance();
	//第五步连接数据(获取连接并执行SQL语句)
	DBm.connectDB();
	//第六步获取student表中所有的数据或删除添加删除
	sqlQuery = "select * from student";
	sqlUpdate = "insert into student (id, name, sex, score)value('"
				+"5"+"', '"+"赵六"+"', '"+"女"+"','"+"60"+"')";
	//第七步将数据导入结果集类中
	//下面这条语句注释掉是没改数据库之前的,没注释是该之后的
	ret = DBm.executeUpdate(sqlUpdate);
	rs = DBm.executeQuery(sqlQuery);
	//输出
	while(rs.next()){
	%>
	<tr>
		<td><%= rs.getInt("id") %></td>
		<td><%= rs.getString("name") %></td>
		<td><%= rs.getString("sex") %></td>
		<td><%= rs.getInt("score") %></td>
	</tr>
	<%
	}
	//第八步关闭连接(关闭Connection Sqlstmt和Statement Sqlconn对象)
	DBm.closeDB();
%>
</table>
</body>
</html>

(4) 结果

🍟1.执行SQL语句:sqlQuery

🍟2.执行SQL语句:sqlUpdate

代码参考文献:[1]彭超,马丁.新一代JSP网络编程入门实践[J].清华大学出版社2007(1):128-133

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小罗のdiary

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值