本期博客主要实现JSP整合Servlet实现用户信息的分页功能,采用JDBC连接数据库,简单应用了BootStrap作为前端页面模板,具体细节如下所示。
Util层
DBUtil类
该层主要用于对JDBC连接Mysql数据库进行方法的封装,方便其他类进行调用,代码如下:
package cn.chen.web2.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
//声明连接的时候,需要用的内容:驱动地址 连接地址 用户名 密码
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String NAME = "root";
private static final String PWD = "123456";
private static final String URL = "jdbc:mysql://127.0.0.1:3306/db_ordermeal?characterEncoding=utf-8";
//声明连接对象 预编译对象(进行SQL操作时使用) 结果集对象(查询时使用)
private static Connection con = null;
private static PreparedStatement ps = null;
private static ResultSet rs = null;
//1.使用静态代码块加载驱动,驱动只需要加载一次
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获取数据库连接的方法,使用 protected进行修饰,其他包中,只有子类可以使用这些方法,保护了当前类的方法
protected static void getConnection(){
try {
con = DriverManager.getConnection(URL, NAME, PWD);
} catch (SQLException e) {
e.printStackTrace();
}
}
//3.关闭连接的方法,回收资源
protected static void closeAll(){
if(null!=rs){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null!=ps){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=con){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//4.开启事务的方法
protected static void beginTransacation(){
//获取连接
getConnection();
//对于mysql数据库而言,只是将自动提交功能关闭
try {
con.setAutoCommit(false);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//5.提交事务
protected static void commit(){
try {
con.commit();//提交
con.setAutoCommit(true);//打开自动提交功能
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//6.回滚事务
protected static void rollback(){
try {
con.rollback();
con.setAutoCommit(true);//打开自动提交功能
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//7.公共的增,删,改的方法
protected static int executeUpdate(String sql,Object[] obj){
int count = 0;//用于统计 有多少条记录被操作了,最为返回值
beginTransacation();//开启事务 包含了获取数据库连接及开启事务的功能
try {
ps = con.prepareStatement(sql);//将sql语句传递给预编译对象,让sql语句可以在预编译对象中进行重新组装
/*
* 例如 :insert into student values (1,'刘',20,0,'2000-1-1','911') 数值会变化
* 我们会传入sql语句改为insert into student values (?,?,?,?,?,?)
* ?的值是从Object[]数组中取出来的进行组装
*/
//obj有内容进行sql语句拼装
if(null!=obj){
for(int i=0;i<obj.length;i++){
ps.setObject(i+1, obj[i]);//将Object[]数组中 每个位置的内容 替换? 内容
}
}
//如果Object[]中没有内容,则认为sql文是完整的,可以直接使用
count = ps.executeUpdate();
commit();//提交事务
} catch (SQLException e) {
// 如果操作失败,肯定会发生异常,这个时候进行回滚事务
e.printStackTrace();
System.out.println(e);
rollback();//回滚事务
}finally{
//操作完成后,无论是否发生异常,都需要关闭资源进行回收
closeAll();//调用关闭连接的方法
}
return count;
}
//8.公共的查询方法
protected static ResultSet executeQuery(String sql,Object[] obj){
beginTransacation();
try {
ps = con.prepareStatement(sql);
//obj有内容,进行sql语句拼装
if(null!=obj){
for(int i=0;i<obj.length;i++){
ps.setObject(i+1, obj[i]);//将Obje