JavaWeb项目----JDBC、DBCP、C3P0、Util、配置文件

JavaWeb项目----JDBC、DBCP、C3P0、Util、配置文件

2020/11/28

项目结构图1.1-1
entity层是实体层,存放JavaBean;dao层是中间层,存放功能操作方法类;Servlet层是操作层,存放Servlet操作类;utils层是工具包,与数据库连接相关的类。

在这里插入图片描述

项目结构图1.1-2
在这里插入图片描述

1、JavaBean-entity包-实体层

JavaBean账户信息类型:封装对象,setter and getter 方法,使数据表中的数据更好的映射到Java中,Mysql数据库和Java中的类型

目标–存储数据库中每一条账户信息

package miao.inClass.JDBC_Account.entity;
//JavaBean帐户信息类型
public class Account {
	private int id;//账户编号
	private String username;//户主姓名
	private double balance;//账户余额
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public double getBalance() {
		return balance;
	}
	public void setBalance(double balance) {
		this.balance = balance;
	}
	
}

2、下载驱动包

项目要用到的jar包1.1-3
在这里插入图片描述

添加Jar包的步骤
在这里插入图片描述

3、utils包-工具包-连接数据库

1.方法一:连接数据库和关闭数据库的工具类

package miao.inClass.JDBC_Account.utils;

import java.sql.*;//引入数据库的操作包

//数据库连接和关闭的工具类
public class JDBCUtil {
	//1.连接数据库的方法
	public static Connection getConn() throws Exception {
		//加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		String url = "jdbc:mysql://localhost:3306/spring?characterEncoding=utf8";
		String user = "root";
		String password = "234567";
		Connection conn = DriverManager.getConnection(url,user,password);//获取连接对象
		return conn;//返回连接对象
	}
	public static void release(PreparedStatement ps,Connection conn ){// 关闭数据库的方法1-用于增删改查操作:不含ResultSet方法
		if(ps!=null){//判断不为空时,关闭数据库操作对象
			try {
				ps.close();//先关闭操作对象
			} catch (SQLException e) {
				e.printStackTrace();
			}
			ps = null;//置为空
		}
		if(conn!=null){//判断不为空时,关闭数据库连接对象
			try {
				conn.close();//在关闭连接对象
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;//置为空
		}
	}
	public static void release(ResultSet rs,PreparedStatement ps,Connection conn ){// 关闭数据库的方法2-用于查询(操作含结果集ResultSet)
		if(rs!=null){//判断不为空时,最先关闭数据库结果集
			try {
				rs.close();//关闭结果集
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;//置为空
		}
		release(ps,conn);//调用关闭数据库的方法1
	}
}

此处用到的Jar包:在这里插入图片描述

2.方法二:

数据库连接池

在这里插入图片描述
在这里插入图片描述

1.数据库连接池1-DBCP

在这里插入图片描述在这里插入图片描述

需要用到的Jar包在这里插入图片描述
方法二代码–使用静态代码块DBCP
package miao.inClass.JDBC_Account.utils;
//使用DBCP数据库连接池技术

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPTest {
	//DBCP数据库连接池的数据源
	public static DataSource ds = null;//数据库对象	
	static {//给数据源赋值
		//1.创建DBCP数据库连接池的实现类对象
		BasicDataSource bds = new BasicDataSource();
		//2.排至连接池参数
		bds.setDriverClassName("com.mysql.jdbc.Driver");//数据库驱动名
		bds.setUrl("jdbc:mysql://localhost:3306/spring?"
				+ "characterEncoding=utf8");//数据库URL--连接的地址
		bds.setUsername("root");//数据库用户名
		bds.setPassword("234567");//数据库密码
		//3.设置DBCP连接池高级参数
		bds.setInitialSize(5);//初始连接数量
		bds.setMaxActive(5);//最大活跃连接数量
		//4.赋值给数据源对象
		ds = bds;
	}
	
}

2.数据库连接池2-C3P0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9SnbMIPO-1606654627226)(C:\Users\罗妙华\AppData\Roaming\Typora\typora-user-images\image-20201128155657409.png)]

较低的版本和5.0.8数据库驱动配合使用,Mysql8.0的不行

方法二代码–C3P0
package miao.inClass.JDBC_Account.utils;

import java.beans.PropertyVetoException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import sun.java2d.pipe.SpanClipRenderer;

//C3P0数据库连接池
public class C3P0Test {
	//DBCP数据库连接池的数据源
		public static DataSource ds = null;//数据库对象
		static {//给数据源赋值
			//1.创建DBCP数据库连接池的实现类对象
			ComboPooledDataSource cpds = new ComboPooledDataSource();
			try {
				//2.排至连接池参数
				cpds.setDriverClass("com.mysql.jdbc.Driver");//数据库驱动名
				//数据库URL--连接的地址
				cpds.setJdbcUrl("jdbc:mysql://localhost:3306/spring?characterEncoding=utf8");
				cpds.setUser("root");//数据库用户名
				cpds.setPassword("234567");//数据库密码
				//3.设置DBCP连接池高级参数
				cpds.setInitialPoolSize(5);//初始连接数量
				cpds.setMaxPoolSize(5);//最大活跃连接数量
				//4.赋值给数据源对象
				ds = cpds;
			} catch (PropertyVetoException e) {
				e.printStackTrace();
			}
		}
}

3.数据库连接池2-Utils

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h05KZt9r-1606654627232)(C:\Users\罗妙华\AppData\Roaming\Typora\typora-user-images\image-20201128164420989.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xzaXdEO-1606654627235)(C:\Users\罗妙华\AppData\Roaming\Typora\typora-user-images\image-20201129192704543.png)]

需要用到的Jar包在这里插入图片描述

3.方法三:通过配置文件使用数据库连接池

在这里插入图片描述
数据库连接池的配置文件再项目中的位置是Java下的src

1.properties文件-配合DBCP使用
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/spring?characterEncoding=utf8
username=root
password=234567
initialSize=5
maxActive=5
方法二代码–使用Util和配置文件优化后DBCP
package miao.inClass.JDBC_Account.utils;
//使用DBCP数据库连接池技术

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPTest {
	//DBCP数据库连接池的数据源
	public static DataSource ds = null;//数据库对象
	
 	static {//给数据源赋值
		//1.创建一个配置文件集合对象
		Properties p = new Properties();
		//2.通过类加载其读取配置文件
		InputStream in = new DBCPTest().getClass().getClassLoader()
				.getResourceAsStream("dbcpconfig.properties");
		try {
			//3.吧配置文件已输入流的形式加载到properties集合中
			p.load(in);
			//4.更具Properties集合的参数,创建数据源
			ds  = BasicDataSourceFactory.createDataSource(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

2.xml配置文件-配合C3P0使用
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<named-config name="c3p0">
		<property name="driverClass">
			com.mysql.jdbc.Driver
		</property>
		<property name="jdbcUrl">
			jdbc:mysql://localhost:3306/spring?characterEncoding=utf8
		</property>
		<property name="user">root</property>
		<property name="password">234567</property>
		<property name="initialPoolSize">5</property>
		<property name="maxPoolSize">5</property>
	</named-config>
</c3p0-config>
方法二代码–使用Util和配置文件优化C3P0
package miao.inClass.JDBC_Account.utils;

import java.beans.PropertyVetoException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import sun.java2d.pipe.SpanClipRenderer;

//C3P0数据库连接池
public class C3P0Test {
	//DBCP数据库连接池的数据源
		public static DataSource ds = null;//数据库对象
		static {
			//1.创建DBCP数据库连接池的实现类对象
			ComboPooledDataSource cpds = new ComboPooledDataSource("c3p0");
			//2.给数据赋值
			ds = cpds;
		}
}

4、Dao包–数据访问操作层-增删改查操作

曾经出过的错SQL语句,String类型没有打单引号‘’,导致无法识别,录入数据库失败

所遇见的错误
在这里插入图片描述
解决方法:
在这里插入图片描述

1.方法一:DAO

package miao.inClass.JDBC_Account.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import com.sun.org.apache.regexp.internal.RE;

import miao.inClass.JDBC_Account.entity.Account;
import miao.inClass.JDBC_Account.utils.JDBCUtil;

//账户信息表的数据访问操作--增删改查操作
public class AccountDao {

	// 4.查询某用户信息--已成功
	public ArrayList<Account> thefind(int id) {
		Connection conn = null;// 连接对象--先修路
		PreparedStatement ps = null;// 操作对象--再通车
		ResultSet rs = null;// 结果集--运货
		// 创建数组
		ArrayList<Account> list = new ArrayList<Account>();
		try {
			// 1.先修路--创建连接对象
			conn = JDBCUtil.getConn();
			// 2.再通车--创建操作对象
			String sql = "select * from account where id = " + id + ";";
			ps = conn.prepareStatement(sql);
			// 3.运货--结果集对象
			rs = ps.executeQuery();
			// 4.循环遍历结果集
			while (rs.next()) {
				Account a = new Account();// 创建空很高的JavaBean对象
				// 取出每一行的每个字段,给JavaBean
				a.setId(rs.getInt("id"));
				a.setUsername(rs.getString("username"));
				a.setBalance(rs.getDouble("balance"));
				// 吧JavaBean放入集合中存起来
				list.add(a);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.release(rs, ps, conn);// 关闭连接,释放资源
		}
		return null;// 出现异常,返回空
	}

	// 5.更新账户表的方法
	public boolean update(Account a) {
		Connection conn = null;// 连接对象--先修路
		PreparedStatement ps = null;// 操作对象--再通车
		try {
			// 1.先修路--创建连接对象
			conn = JDBCUtil.getConn();
			// 2.发送sql语句
			String sql = "update account set username='"+a.getUsername()+"',balance="+a.getBalance()+" where id="+a.getId();
			// 2.获得PreparedStatement对象
			ps = conn.prepareStatement(sql);
			// 3.运货--执行Sql操作,获取返回结果
			int result = ps.executeUpdate();
			if (result > 0) {// 如果所影响的行数>0,表示修改成功
				return true;
			}
			return false;// 修改失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.release( ps, conn);// 关闭连接,释放资源
		}
		return false;// 出现异常,返回空
	}

	// 3.删除账户信息的方法
	public Boolean delete(int id) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			// 1.先修路--创建连接对象
			conn = JDBCUtil.getConn();
			// 2.再通车--创建操作对象('abc',1000)
			String sql = "delete from account where id=" + id + ";";
			ps = conn.prepareStatement(sql);
			// 3.运货--执行Sql操作,获取返回结果
			int result = ps.executeUpdate();
			if (result > 0) {// 如果所影响的行数>0,表示删除成功
				return true;
			}
			return false;// 删除失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.release(ps, conn);
		}
		return false;// 出现异常返回false
	}

	// 2.新增账户信息的方法
	public Boolean insert(Account a) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			// 1.先修路--创建连接对象
			conn = JDBCUtil.getConn();
			// 2.再通车--创建操作对象('abc',1000)
			String sql = "insert into account(username,balance)"
					+ " values ('" + a.getUsername() + "',"
					+ a.getBalance() + ");";
			ps = conn.prepareStatement(sql);
			// 3.运货--执行Sql操作,获取返回结果
			int result = ps.executeUpdate();
			if (result > 0) {// 如果所影响的行数>0,表示新增成功
				return true;
			}
			return false;// 新增失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.release(ps, conn);
		}
		return false;// 出现异常返回false
	}

	// 1.查询账户表的方法
	public ArrayList<Account> findAll() {
		Connection conn = null;// 连接对象--先修路
		PreparedStatement ps = null;// 操作对象--再通车
		ResultSet rs = null;// 结果集--运货
		// 创建数组
		ArrayList<Account> list = new ArrayList<Account>();
		try {
			// 1.先修路--创建连接对象
			conn = JDBCUtil.getConn();
			// 2.再通车--创建操作对象
			String sql = "select * from Account";
			ps = conn.prepareStatement(sql);
			// 3.运货--结果集对象
			rs = ps.executeQuery();
			// 4.循环遍历结果集
			while (rs.next()) {
				Account a = new Account();// 创建空很高的JavaBean对象
				// 取出每一行的每个字段,给JavaBean
				a.setId(rs.getInt("id"));
				a.setUsername(rs.getString("username"));
				a.setBalance(rs.getDouble("balance"));
				// 吧JavaBean放入集合中存起来
				list.add(a);
			}
			return list;// 返回集合list
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.release(rs, ps, conn);// 关闭连接,释放资源
		}
		return null;// 出现异常,返回空
	}

}

2.方法二:DBCP或C3P0

所有连接的获取都是取一个活跃的连接,不用连接和关闭,节省时间

package miao.inClass.JDBC_Account.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import com.sun.org.apache.regexp.internal.RE;

import miao.inClass.JDBC_Account.entity.Account;
import miao.inClass.JDBC_Account.utils.DBCPTest;
import miao.inClass.JDBC_Account.utils.JDBCUtil;

//账户信息表的数据访问操作--增删改查操作
public class AccountDao1 {

	// 4.查询某用户信息--已成功
	public ArrayList<Account> thefind(int id) {
		Connection conn = null;// 连接对象--先修路
		PreparedStatement ps = null;// 操作对象--再通车
		ResultSet rs = null;// 结果集--运货
		// 创建数组
		ArrayList<Account> list = new ArrayList<Account>();
		try {
			// 1.先修路--创建连接对象
			conn = DBCPTest.ds.getConnection();
			// 2.再通车--创建操作对象
			String sql = "select * from account where id = " + id + ";";
			ps = conn.prepareStatement(sql);
			// 3.运货--结果集对象
			rs = ps.executeQuery();
			// 4.循环遍历结果集
			while (rs.next()) {
				Account a = new Account();// 创建空很高的JavaBean对象
				// 取出每一行的每个字段,给JavaBean
				a.setId(rs.getInt("id"));
				a.setUsername(rs.getString("username"));
				a.setBalance(rs.getDouble("balance"));
				// 吧JavaBean放入集合中存起来
				list.add(a);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;// 出现异常,返回空
	}

	// 5.更新账户表的方法
	public boolean update(Account a) {
		Connection conn = null;// 连接对象--先修路
		PreparedStatement ps = null;// 操作对象--再通车
		try {
			// 1.先修路--创建连接对象
			conn = DBCPTest.ds.getConnection();
			// 2.发送sql语句
			String sql = "update account set username='"+a.getUsername()+"',balance="+a.getBalance()+" where id="+a.getId();
			// 2.获得PreparedStatement对象
			ps = conn.prepareStatement(sql);
			// 3.运货--执行Sql操作,获取返回结果
			int result = ps.executeUpdate();
			if (result > 0) {// 如果所影响的行数>0,表示修改成功
				return true;
			}
			return false;// 修改失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常,返回空
	}

	// 3.删除账户信息的方法
	public Boolean delete(int id) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			// 1.先修路--创建连接对象
			conn = DBCPTest.ds.getConnection();
			// 2.再通车--创建操作对象('abc',1000)
			String sql = "delete from account where id=" + id + ";";
			ps = conn.prepareStatement(sql);
			// 3.运货--执行Sql操作,获取返回结果
			int result = ps.executeUpdate();
			if (result > 0) {// 如果所影响的行数>0,表示删除成功
				return true;
			}
			return false;// 删除失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常返回false
	}

	// 2.新增账户信息的方法
	public Boolean insert(Account a) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			// 1.先修路--创建连接对象
			conn = DBCPTest.ds.getConnection();
			// 2.再通车--创建操作对象('abc',1000)
			String sql = "insert into account(username,balance)"
					+ " values ('" + a.getUsername() + "',"
					+ a.getBalance() + ");";
			ps = conn.prepareStatement(sql);
			// 3.运货--执行Sql操作,获取返回结果
			int result = ps.executeUpdate();
			if (result > 0) {// 如果所影响的行数>0,表示新增成功
				return true;
			}
			return false;// 新增失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常返回false
	}

	// 1.查询账户表的方法
	public ArrayList<Account> findAll() {
		Connection conn = null;// 连接对象--先修路
		PreparedStatement ps = null;// 操作对象--再通车
		ResultSet rs = null;// 结果集--运货
		// 创建数组
		ArrayList<Account> list = new ArrayList<Account>();
		try {
			// 1.先修路--创建连接对象
			conn = DBCPTest.ds.getConnection();
			// 2.再通车--创建操作对象
			String sql = "select * from Account";
			ps = conn.prepareStatement(sql);
			// 3.运货--结果集对象
			rs = ps.executeQuery();
			// 4.循环遍历结果集
			while (rs.next()) {
				Account a = new Account();// 创建空很高的JavaBean对象
				// 取出每一行的每个字段,给JavaBean
				a.setId(rs.getInt("id"));
				a.setUsername(rs.getString("username"));
				a.setBalance(rs.getDouble("balance"));
				// 吧JavaBean放入集合中存起来
				list.add(a);
			}
			return list;// 返回集合list
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;// 出现异常,返回空
	}

}

3.方法三:使用Util简化后DBCP和C3P0

C3P0-Dao
package miao.inClass.JDBC_Account.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.sun.org.apache.regexp.internal.RE;

import miao.inClass.JDBC_Account.entity.Account;
import miao.inClass.JDBC_Account.utils.C3P0Test;
import miao.inClass.JDBC_Account.utils.DBCPTest;
import miao.inClass.JDBC_Account.utils.JDBCUtil;

//账户信息表的数据访问操作--增删改查操作
public class AccountDao2 {

	// 4.查询某用户信息--已成功
	public Account thefind(int id) {
		QueryRunner qr = new QueryRunner(C3P0Test.ds);
		try {
			String sql = "select * from account where id =?";
			//2.调用查询方法,返回JavaBean
			Account a = (Account) qr.query(sql, new BeanHandler(Account.class),id);
			return a;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;// 出现异常,返回空
	}

	// 5.更新账户表的方法
	public boolean update(Account a) {
		QueryRunner qr = new QueryRunner(C3P0Test.ds);
		try {
			// 2.发送sql语句
			String sql = "update account set username=?,balance=? where id=?";
			int result = qr.update(sql,new Object[] {
				a.getUsername() , a.getBalance() , a.getId()
			});
			if (result > 0) {// 如果所影响的行数>0,表示修改成功
				return true;
			}
			return false;// 修改失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常,返回空
	}

	// 3.删除账户信息的方法
	public Boolean delete(int id) {
		QueryRunner qr = new QueryRunner(C3P0Test.ds);
		try {
			String sql = "delete from account where id=?";
			int result = qr.update(sql , id);
			if (result > 0) {// 如果所影响的行数>0,表示删除成功
				return true;
			}
			return false;// 删除失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常返回false
	}

	// 2.新增账户信息的方法
	public Boolean insert(Account a) {
		QueryRunner qr = new QueryRunner(C3P0Test.ds);
		try {
			String sql = "insert into account(username,balance)" + " values (?,?)";
			int result = qr.update(sql, new Object[] {
				a.getUsername(),a.getBalance()
			});
			if (result > 0) {// 如果所影响的行数>0,表示新增成功
				return true;
			}
			return false;// 新增失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常返回false
	}

	// 1.查询账户表的方法
	public ArrayList<Account> findAll() {
		QueryRunner qr = new QueryRunner(C3P0Test.ds);
		ResultSet rs = null;// 结果集--运货
		try {
			String sql = "select * from Account";
			// 创建数组
			ArrayList<Account> list = new ArrayList<Account>();
			qr.query(sql, new BeanListHandler(Account.class));
			return list;// 返回集合list
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;// 出现异常,返回空
	}

}

DBCP-DAO
package miao.inClass.JDBC_Account.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.sun.org.apache.regexp.internal.RE;

import miao.inClass.JDBC_Account.entity.Account;
import miao.inClass.JDBC_Account.utils.C3P0Test;
import miao.inClass.JDBC_Account.utils.DBCPTest;
import miao.inClass.JDBC_Account.utils.JDBCUtil;

//账户信息表的数据访问操作--增删改查操作
public class AccountDao3 {

	// 4.查询某用户信息--已成功
	public Account thefind(int id) {
		QueryRunner qr = new QueryRunner(DBCPTest.ds);
		try {
			String sql = "select * from account where id = ?";
			Account a = (Account) qr.query(sql, new BeanHandler(Account.class),id);
			return a;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;// 出现异常,返回空
	}

	// 5.更新账户表的方法
	public boolean update(Account a) {
		// 1.直接从数据源获取QueryRunner操作对象
		QueryRunner qr = new QueryRunner(DBCPTest.ds);
		try {
			String sql = "update account set username=?,balance=? where id=?";
			int result = qr.update(sql, new Object[]
					{ a.getUsername(), a.getBalance(), a.getId() });
			if (result > 0) {// 如果所影响的行数>0,表示修改成功
				return true;
			}
			return false;// 修改失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常,返回空
	}

	// 3.删除账户信息的方法
	public Boolean delete(int id) {
		// 1.直接从数据源获取QueryRunner操作对象
		QueryRunner qr = new QueryRunner(DBCPTest.ds);
		try {
			String sql = "delete from account where id=?;";
			int result = qr.update(sql, id);
			if (result > 0) {// 如果所影响的行数>0,表示删除成功
				return true;
			}
			return false;// 删除失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常返回false
	}

	// 2.新增账户信息的方法
	public Boolean insert(Account a) {
		// 1.直接从数据源获取QueryRunner操作对象
		QueryRunner qr = new QueryRunner(DBCPTest.ds);
		try {
			String sql = "insert into account(username,balance) values (?,?);";
			int result = qr.update(sql, new Object[] {a.getUsername(), a.getBalance() });
			if (result > 0) {// 如果所影响的行数>0,表示新增成功
				return true;
			}
			return false;// 新增失败返回false
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;// 出现异常返回false
	}

	// 1.查询账户表的方法
	public ArrayList<Account> findAll() {
		// 1.直接从数据源获取QueryRunner操作对象
		QueryRunner qr = new QueryRunner(DBCPTest.ds);
		try {
			String sql = "select * from Account";
			ArrayList<Account> list = (ArrayList<Account>) qr.query(sql,new BeanListHandler(Account.class));
			return list;// 返回集合list
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;// 出现异常,返回空
	}

}

5、Servlet层

新增功能,删除功能,查找信息表功能,根据id查找信息功能,修改信息功能

1.查找全部信息的Servlet

package miao.inClass.JDBC_Account.Servlet;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import miao.inClass.JDBC_Account.dao.AccountDao;
import miao.inClass.JDBC_Account.dao.AccountDao2;
import miao.inClass.JDBC_Account.dao.AccountDao3;
import miao.inClass.JDBC_Account.entity.Account;

/**
 * 查询所有账户信息的方法
 */
@WebServlet("/FindAllServlet")
public class FindAllServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charest=utf-8");
		//1.创建dao层的对象
		AccountDao3 dao = new AccountDao3();
		ArrayList<Account> list = dao.findAll();//数据对像
		//2.吧查到的结果存入域对象
		HttpSession session = request.getSession();
		session.setAttribute("accounts", list);
		//3.跳转到JSP页面显示
		//response.sendRedirect("account.jsp");//地址栏变化
		request.getRequestDispatcher("account.jsp")
			.forward(request, response);//请求转发
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

2.新增信息的Servlet

package miao.inClass.JDBC_Account.Servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import miao.inClass.JDBC_Account.dao.AccountDao;
import miao.inClass.JDBC_Account.dao.AccountDao2;
import miao.inClass.JDBC_Account.dao.AccountDao3;
import miao.inClass.JDBC_Account.entity.Account;

/**
 * 新增账户信息操作AddServlet
 */
@WebServlet("/AddServlet")
public class AddServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//1.获取表单那提交参数
		String username = request.getParameter("username");
		String balance = request.getParameter("balance");
		//2.吧获取的参数封装到JavaBean中
		Account a = new Account();//创建空对象
		a.setUsername(username);
		a.setBalance(Double.parseDouble(balance));
		//3.调用Dao层,把JavaBean的数据包新增进数据库
		AccountDao3 dao = new AccountDao3();
		boolean result = dao.insert(a);
		//4.判断结果,是否要跳转或输出错误信息
		if(result) {
//			response.sendRedirect("/Demo1120_JDBC_project/FindAllServlet");
			request.getRequestDispatcher("/FindAllServlet").forward(request, response);// 请求转发
		}else {
			out.print("<h1>Sorry,新增账户信息失败!</h1>");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

3.更新信息的Servlet

package miao.inClass.JDBC_Account.Servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import miao.inClass.JDBC_Account.dao.AccountDao;
import miao.inClass.JDBC_Account.dao.AccountDao2;
import miao.inClass.JDBC_Account.dao.AccountDao3;
import miao.inClass.JDBC_Account.entity.Account;

/**
 * 更新账户表操作 UpdateServlet
 */
@WebServlet("/UpdateServlet")
public class UpdateServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");//若没有,存入数据库的中文则会出现乱码
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//1.获取表单那提交参数
		int id = Integer.parseInt(request.getParameter("id"));
		String username = request.getParameter("username");
		double balance = Double.parseDouble(request.getParameter("balance"));
		//2.吧获取的参数封装到JavaBean中
		Account a = new Account();//创建空对象
		a.setId(id);
		a.setUsername(username);
		a.setBalance(balance);
		//3.调用Dao层,把JavaBean的数据包新增进数据库
		AccountDao3 dao = new AccountDao3();
		boolean result = dao.update(a);
		//4.判断结果,是否要跳转或输出错误信息
		if(result) {
			response.sendRedirect("/Demo1124DBCP/FindAllServlet");
		}else {
			out.print("<h1>Sorry,更新账户信息失败!</h1>");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

4.删除信息的Servlet

package miao.inClass.JDBC_Account.Servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import miao.inClass.JDBC_Account.dao.AccountDao;
import miao.inClass.JDBC_Account.dao.AccountDao2;
import miao.inClass.JDBC_Account.dao.AccountDao3;
import miao.inClass.JDBC_Account.entity.Account;

/**
 * 删除用户信息操作类DelServlet
 */
@WebServlet("/DelServlet")
public class DelServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charest=utf-8");
		PrintWriter out = response.getWriter();
		//1.获取地址栏传递的参数
		int id =  Integer.parseInt(request.getParameter("id"));
		//2..调用Dao层,执行操作返回结果
		AccountDao3 dao = new AccountDao3();
		boolean result = dao.delete(id);
		//3.判断结果,是否要跳转或输出错误信息
		if(result) {
			response.sendRedirect("/Demo1124DBCP/FindAllServlet");
		}else {
			out.print("<h1>Sorry,删除账户信息失败!</h1>");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

5.查找信息的Servlet

package miao.inClass.JDBC_Account.Servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import miao.inClass.JDBC_Account.dao.AccountDao;
import miao.inClass.JDBC_Account.dao.AccountDao2;
import miao.inClass.JDBC_Account.dao.AccountDao3;
import miao.inClass.JDBC_Account.entity.Account;

/**
 * Servlet implementation class TheFindServlet
 */
@WebServlet("/TheFindServlet")
public class TheFindServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charest=utf-8");
		// 1.获取表单那提交参数
		int id = Integer.parseInt(request.getParameter("id"));
		// 2.吧获取的参数封装到JavaBean中
//		Account a = new Account();// 创建空对象
		
		// 3.调用Dao层,把JavaBean的数据包新增进数据库
		AccountDao3 dao = new AccountDao3();
		Account a = dao.thefind(id);// 数据对像
//		a.setId(id);
		// 2.吧查到的结果存入域对象
		HttpSession session = request.getSession();
		session.setAttribute("account", a);
		
		// 3.把要显示的账户对象存入请求域对象中
//		request.setAttribute("account", a);
		//4.跳转页面
		request.getRequestDispatcher("detail.jsp").forward(request, response);
		// response.sendRedirect("account.jsp");//地址栏变化
//		request.getRequestDispatcher("account.jsp").forward(request, response);// 请求转发
		// response.sendRedirect("/Demo1120_JDBC_project/FindAllServlet");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

6、JSP

1.显示信息表

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>账户信息页面</title>
</head>
<body>
	<h1>账户信息页面</h1>
	<p>
		<table width="600" border="1">
			<tr>
				<th height="40"> 账户编号</th>
				<th height="40"> 户主姓名</th>
				<th height="40"> 账户余额</th>
				<th height="40"> 账户操作</th>
			</tr>
			<c:forEach items="${accounts }" var="acc">
				<tr><%--名字要与JavaBean相同 --%>
					<td height="40">${acc.id }</td>
					<td height="40">${acc.username }</td>
					<td height="40">${acc.balance }</td>
					<th height="40">
						<a href="updateAccount.jsp?id=${acc.id }">修改</a>
						&nbsp;&nbsp;
						<a href="/Demo1124DBCP/DelServlet?id=${acc.id }">删除</a>
					</th>
				</tr>
			</c:forEach>
		</table>
	</p>
	<a href="addAccount.jsp">新增账户信息</a>
	<a href="theAccount.jsp">查找账户信息</a>
</body>
</html>

2.新增信息

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>新增账户信息页面</title>
</head>
<body>
	<h1>新增账户信息页面</h1>
	<form action="/Demo1124DBCP/AddServlet" method="post">
		<p>户主姓名:<input type="text" name="username"></p>
		<p>账户余额:<input type="text" name="balance"></p>
		<p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			<input type="submit" value="提交">
		</p>
	</form>
</body>
</html>

3.更新信息

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改账户信息页面</title>
</head>
<body>
	<h1>修改账户信息页面</h1>
	<form action="/Demo1124DBCP/UpdateServlet" method="post">
		<p>账户编号:<input type="text" name="id"
			value="${param.id }" readonly="readonly"></p>
		<p>户主姓名:<input type="text" name="username"></p>
		<p>账户余额:<input type="text" name="balance"></p>
		<p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			<input type="submit" value="提交">
		</p>
	</form>
</body>
</html>

4.查找信息

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>根据用户id查找账户信息</title>
</head>
<body>
	<h1>根据用户id查找账户信息</h1>
	<form action="/Demo1124DBCP/TheFindServlet" method="post">
		<p>账户编号:<input type="text" name="id"  style="width:200px"
			 placeholder="请输入账户编号">
			&nbsp;&nbsp;&nbsp;&nbsp;
			<input type="submit" value="查找">
		</p>
	</form>
</body>
</html>

5.显示查找的信息

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>账户详情</title>
</head>
<body>
	<h1>账户详情</h1>
	<h2>账户:${account.id }</h2>
	<h2>姓名:${account.username }</h2>
	<h2>账户:${account.balance }</h2>
</body>
</html>

7、外部项目导入

导入项目:点击Eclipse的File-->import出现此窗体

在这里插入图片描述
导入外部项目或者移除Tomcat重装时报错需要注意的:
重新导入Tomcat和jre环境,通过Add Library来添加需要的,通过Remove来移除不需要的在这里插入图片描述
在这里插入图片描述

解决链接可参考
导入其他人项目Description Resource Path Location Type Target runtime Apache Tomcat v9.0 is not defined. class_springmvc Unknown Faceted Project Problem - 旺旺a - 博客园 (cnblogs.com)

8、JSP开发模型

在这里插入图片描述

1.JSPModel1开发模型

在这里插入图片描述

2.JSPModel2开发模型

在这里插入图片描述

3.MVC设计模型

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值