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包:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ccd89a35753aa332ff5827af8e7e0f63.png)
2.方法二:
数据库连接池
1.数据库连接池1-DBCP
需要用到的Jar包![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/192837abb81a14eaaac0c7876986bdc1.png)
方法二代码–使用静态代码块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
方法二代码–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
需要用到的Jar包![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/afb1404eef244dd90a44e9563e5e41ec.png)
3.方法三:通过配置文件使用数据库连接池
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层
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>
<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 >
<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 >
<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="请输入账户编号">
<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、外部项目导入
导入外部项目或者移除Tomcat重装时报错需要注意的:
8、JSP开发模型
1.JSPModel1开发模型
2.JSPModel2开发模型
3.MVC设计模型