Javaweb实现增删改查操作操作
一:准备工作
1:Idea编辑器(eclispe和myeclispe都可以,个人推荐使用idea),新建一个web项目
2:数据库mysql
3:需要提前了解的知识点
servlet
el和jstl表达式
项目的基本的框架实现(Javaweb经典的三层架构)
4:UUID自动生成id的工具
5:在idea中生成的包结构
二:数据库的设计和实现操作
需要在设计库中实现数据库的创建和数据表的填写
1.数据库和数据表的创建
2.向数据库中添加数据
3.数据库连接工具druid和dbutils
package cn.ujiuye.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* JDBC工具类 使用Durid连接池
*/
public class JDBCUtils {
private static DataSource ds ;
static {
try {
//1.加载配置文件
Properties pro = new Properties();
//使用ClassLoader加载配置文件,获取字节输入流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//2.初始化连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池对象
*/
public static DataSource getDataSource(){
return ds;
}
/**
* 获取连接Connection对象
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
三:常用工具类和架构解析
1:bootstrap是一个很强大的前端框架,集合了html,css,js的集合,让像我这样的前端菜鸡的新手能够也实现对美的页面的追求,有需要的去中文网去了解吧https://www.bootcss.com/
2:UUID是Java.utils包下提供的一个自动生成的一个工具类,能够自动生成不会重复的id,可以把它简单封装一下,后面直接调用,下面贴出封装源码
package cn.ujiuye.utils;
import java.util.UUID;
public class UUIDUtils {
public static String getPid() {
String str = UUID.randomUUID().toString().replace("-", "");
return str;
}
}
3.常用jar包分析,后期会使用到maven工程,就不用手动导入jar包了,不过作为基础还是希望大家能够用心对待基础
4.简单说一下三层架构
servlet和jsp主要是控制和显示,让用户能够直接看到现象
service 处理业务逻辑层,能够更好的实现其相关的业务逻辑的实现
dao 数据持久化层,主要用于和数据库进行交互,返回和传递数据
除此之外别忘了实体类Javabean的书写,本篇博客我更多的使用了接口的思想
四 简单实现一下增删改查
首先说下JavaBean的书写,尽可能的让其和数据库中的字段和前端传过来的的数据三者合一,这样才能尽可能的后期不会存在这个值那个值没有被赋值上,出现空值的现象,还有最好使用其包装类型,不会出现数据库中出现了空值而赋不上值的现象
package cn.ujiuye.domain;
import java.util.Date;
/**
* product
* javabean
*/
public class Product {
private String pid;
private String pname;
private double market_price;
private double shop_price;
private Date pdate;
private String pdesc;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public double getMarket_price() {
return market_price;
}
public void setMarket_price(double market_price) {
this.market_price = market_price;
}
public double getShop_price() {
return shop_price;
}
public void setShop_price(double shop_price) {
this.shop_price = shop_price;
}
public Date getPdate() {
return pdate;
}
public void setPdate(Date pdate) {
this.pdate = pdate;
}
public String getPdesc() {
return pdesc;
}
public void setPdesc(String pdesc) {
this.pdesc = pdesc;
}
@Override
public String toString() {
return "Product{" +
"pid='" + pid + '\'' +
", pname='" + pname + '\'' +
", market_price=" + market_price +
", shop_price=" + shop_price +
", pdate=" + pdate +
", pdesc='" + pdesc + '\'' +
'}';
}
}
增加的servlet
package cn.ujiuye.web.servlet;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
import cn.ujiuye.utils.UUIDUtils;
import org.apache.commons.beanutils.BeanUtils;
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 java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@WebServlet("/addProductServlet")
public class AddProductServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码格式
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
//2.封装数据
Map<String, String[]> map = request.getParameterMap();
Product product = new Product();
try {
//先把当前时间按照格式转化成对应的字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currentTime = sdf.format(date);
System.out.println(currentTime);
//再把字符串转化为相对于的时间格式
Date time = sdf.parse(currentTime);
System.out.println(time);
//封装一下上架的时间
product.setPdate(time);
//使用UUID工具类,随机生成Pid,保证数据不重复
product.setPid(UUIDUtils.getPid());
BeanUtils.populate(product,map);
//3.处理业务逻辑
ProductService service = new ProductServiceImpl();
service.addProduct(product);
System.out.println(product);
} catch (Exception e) {
e.printStackTrace();
}
//4.重定向到登录页面
response.sendRedirect(request.getContextPath()+"/findAllProductServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
增加的时候要特别注意哪些数据不能够直接封装进入JavaBean中去,需要手动给传入进入,比如这个时间是使用UUID工具类生成的,故需要手动给传入进去,还有当前时间也是自动生成的,也需要手动给传入进入,才能够是生成了一个完成的对象,数据完整来实现操作
删除的servlet
package cn.ujiuye.web.servlet;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
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 java.io.IOException;
@WebServlet("/delUserServlet")
public class DelUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从后台的数据获取相对于的id
String pid = request.getParameter("id");
System.out.println(pid);
//处理业务逻辑
ProductService service = new ProductServiceImpl();
service.deleteProduct(pid);
//对结果进行相应,不管删除不删除都重定向到findAllProductServlet
response.sendRedirect(request.getContextPath()+"/findAllProductServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
注意从前台获取你点击的事件的按钮,从而将其id给传入进来,从id来获取其数据的详细信息从而反馈过来
修改的servlet
package cn.ujiuye.web.servlet;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
import org.apache.commons.beanutils.BeanUtils;
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 java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/updateProductServlet")
public class UpdateProductServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.封装数据
Map<String, String[]> map = request.getParameterMap();
Product product = new Product();
try {
BeanUtils.populate(product,map);
} catch (Exception e) {
e.printStackTrace();
}
//2.处理业务逻辑
ProductService service = new ProductServiceImpl();
service.updateProduct(product);
//3.重定向到findAllProductservlet
response.sendRedirect(request.getContextPath()+"/findAllProductServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
注意修改的操作第一步需要实现数据的回显,然后将该对象传入到后台,从而达到修改的目的
package cn.ujiuye.web.servlet;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
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 java.io.IOException;
import java.util.List;
@WebServlet("/findAllProductServlet")
public class FindAllProductServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//处理业务逻辑
ProductService service = new ProductServiceImpl();
List<Product> products = service.fandAll();
System.out.println(products);
//将域对象存起来,实现数据的传递
request.setAttribute("products",products);
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
无论是查询单个的信息还是查询所有的人的信息,都需要我们明确要查询的条件,传递什么参数,让其返回什么类型的数据,只有明确了这些细节问题,才能够让我们能够快速定位自己的需要,从而达到自己想要的效果
service层接口,引入接口的思想,更多的是想控制一下业务逻辑,不至于有很多很多的servlet,对自己的需求不太清楚
package cn.ujiuye.service;
import cn.ujiuye.domain.PageBean;
import cn.ujiuye.domain.Product;
import java.util.List;
/**
* 业务逻辑层接口层
*/
public interface ProductService {
/**
* 查询所有的商品信息
* @return
*/
List<Product> fandAll();
/**
* 添加商品
*/
void addProduct(Product product);
/**
* 根据id查询当前的商品信息
* @param id
* @return
*/
Product findProductById(String id);
/**
* 修改商品的信息
* @param product
*/
void updateProduct(Product product);
/**
* 删除商品信息
* @param pid
*/
void deleteProduct(String pid);
/**
* 删除多选中的商品信息
* @param pids
*/
void deleteSelectedProduct(String[] pids);
/**
* 分页查询
* @param currentPage
* @param rows
* @return
*/
PageBean<Product> findUserByPage(String currentPage, String rows);
}
package cn.ujiuye.service.impl;
/**
* 业务逻辑实现层
*/
import cn.ujiuye.dao.ProductDao;
import cn.ujiuye.dao.impl.ProductDaoImpl;
import cn.ujiuye.domain.PageBean;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import java.util.List;
public class ProductServiceImpl implements ProductService {
private ProductDao dao = new ProductDaoImpl();
/**
* 查询所有的商品信息
* @return
*/
@Override
public List<Product> fandAll() {
return dao.findAllProduct();
}
/**
* 添加商品信息
*/
@Override
public void addProduct(Product product) {
dao.addProduct(product);
}
@Override
public Product findProductById(String id) {
return dao.findProductById(id);
}
@Override
public void updateProduct(Product product) {
dao.updateProduct(product);
}
@Override
public void deleteProduct(String pid) {
dao.delteProductById(pid);
}
@Override
public void deleteSelectedProduct(String[] pids) {
for (String pid : pids) {
dao.delteProductById(pid);
}
}
}
dao层实现数据的持久化操作,更多的是实现对数据的前后台交互,数据能够来回之间相互传递,这里我也引入了接口的概念,里面可能有点语句是关于关于分页的,我怕删除的不去,对各位有所影响
package cn.ujiuye.dao;
import cn.ujiuye.domain.Product;
import java.util.List;
/**
* 持久化接口
*/
public interface ProductDao {
/**
* 查询所有的商品的信息
* @return
*/
List<Product> findAllProduct();
/**
* 添加商品
* @param product
*/
void addProduct(Product product);
/**
* 查询当前的商品的信息
* @param id
* @return
*/
Product findProductById(String id);
void updateProduct(Product product);
void delteProductById(String pid);
/**
* 查询总的记录数的方法
* @return
*/
int findTotalCount();
/**
* 查询每页数据
* @param start
* @param rows
* @return
*/
List<Product> findByPage(int start, int rows);
}
package cn.ujiuye.dao.impl;
import cn.ujiuye.dao.ProductDao;
import cn.ujiuye.domain.Product;
import cn.ujiuye.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
/**
* 持久化dao接口的实现类
*/
public class ProductDaoImpl implements ProductDao {
//加载数据源
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 查询所有的商品的信息
* @return
*/
@Override
public List<Product> findAllProduct() {
//1.定义sql
String sql = "select * from product order by pdate desc";
return template.query(sql,new BeanPropertyRowMapper<Product>(Product.class));
}
/**
* 添加商品信息
* @param product
*/
@Override
public void addProduct(Product product) {
//1.定义sql
String sql = "insert into product values(?,?,?,?,?,?)";
//处理sql
template.update(sql,product.getPid(),product.getPname(),product.getMarket_price(),product.getShop_price(),product.getPdate(),product.getPdesc());
}
/**
* 查询当前的商品信息
* @param id
* @return
*/
@Override
public Product findProductById(String id) {
String sql = "select * from product where pid = ?";
return template.queryForObject(sql,new BeanPropertyRowMapper<Product>(Product.class),id);
}
/**
* 修改当前商品的信息
* @param product
*/
@Override
public void updateProduct(Product product) {
String sql = "update product set pname=?,market_price=?,shop_price=?,pdesc=? where pid=?";
template.update(sql,product.getPname(),product.getMarket_price(),product.getShop_price(),product.getPdesc(),product.getPid());
}
/**
* 根据id来删除对应的商品的信息
* @param pid
*/
@Override
public void delteProductById(String pid) {
String sql = "delete from product where pid = ?";
template.update(sql,pid);
}
}
持久化层对数据进行操作,我个人比较喜欢的druid连接池和spring操控JDBCtemplete对数据库进行操作,方便便捷,当然c3p0和dbutils也是一样的道理,看个人爱好
下面关于前端jsp页面,我就重点展示一下我的list.jsp页面,其他的都大概贴一下源码和运行结果
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
<!-- 指定字符集 -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>修改用户</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</head>
<body>
<div class="container" style="width: 400px;">
<h3 style="text-align: center;">修改商品信息</h3>
<form action="${pageContext.request.contextPath}/updateProductServlet" method="post">
<%--设置影藏域,提交信息的时候同时也把id也给提交了,作为后面运行的标准--%>
<input type="hidden" name="pid" value="${product.pid}">
<div class="form-group">
<label for="pname">商品名称:</label>
<input type="text" value="${product.pname}" class="form-control" id="pname" name="pname">
</div>
<div class="form-group">
<label for="market_price">出厂价格:</label>
<input type="text" value="${product.market_price}" class="form-control" id="market_price" name="market_price">
</div>
<div class="form-group">
<label for="shop_price">零售价格:</label>
<input type="text" value="${product.shop_price}" class="form-control" id="shop_price" name="shop_price">
</div>
<div class="form-group">
<label for="pdesc">商品详情:</label>
<input type="text" value="${product.pdesc}" class="form-control" id="pdesc" name="pdesc"/>
</div>
<div class="form-group" style="text-align: center">
<input class="btn btn-primary" type="submit" value="提交" />
<input class="btn btn-default" type="reset" value="重置" />
<input class="btn btn-default" type="button" value="返回"/>
</div>
</form>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
<!-- 指定字符集 -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>修改用户</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-2.1.0.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</head>
<body>
<div class="container" style="width: 400px;">
<h3 style="text-align: center;">修改商品信息</h3>
<form action="${pageContext.request.contextPath}/updateProductServlet" method="post">
<%--设置影藏域,提交信息的时候同时也把id也给提交了,作为后面运行的标准--%>
<input type="hidden" name="pid" value="${product.pid}">
<div class="form-group">
<label for="pname">商品名称:</label>
<input type="text" value="${product.pname}" class="form-control" id="pname" name="pname">
</div>
<div class="form-group">
<label for="market_price">出厂价格:</label>
<input type="text" value="${product.market_price}" class="form-control" id="market_price" name="market_price">
</div>
<div class="form-group">
<label for="shop_price">零售价格:</label>
<input type="text" value="${product.shop_price}" class="form-control" id="shop_price" name="shop_price">
</div>
<div class="form-group">
<label for="pdesc">商品详情:</label>
<input type="text" value="${product.pdesc}" class="form-control" id="pdesc" name="pdesc"/>
</div>
<div class="form-group" style="text-align: center">
<input class="btn btn-primary" type="submit" value="提交" />
<input class="btn btn-default" type="reset" value="重置" />
<input class="btn btn-default" type="button" value="返回"/>
</div>
</form>
</div>
</body>
</html>
下面重点来讲一下list.jsp显示页面,实现数据的从域对象中获取出来,再在前台显示的效果
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>商品列表</title>
<!-- 1. 导入CSS的全局样式 -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- 2. jQuery导入,建议使用1.9以上的版本 -->
<script src="js/jquery-2.1.0.min.js"></script>
<!-- 3. 导入bootstrap的js文件 -->
<script src="js/bootstrap.min.js"></script>
<style type="text/css">
td, th {
text-align: center;
}
</style>
<script>
/*对删除的代码提示框的显示*/
function deleteUser(id) {
//${pageContext.request.contextPath}/delUserServlet?id=${product.id}
//安全提示
if (confirm("您确定要删除吗?")){
//访问路径
location.href="${pageContext.request.contextPath}/delUserServlet?id="+id;
}
}
/*提交表单,对表单中的数据进行校验 随着页面的加载就开始加载的数据*/
$(function () {
//全选和全不选
$("[type=checkbox]:first").click(function () {
$("[type=checkbox]").prop("checked",this.checked);
});
//批量删除
$("#delSelected").click(function () {
var pids = $("[type=checkbox]:gt(0):checked").serialize();
//判断pids是否有值
if (pids.length==0 || pids==""){
alert("请您选择需要删除的选项?");
return;
}
if (confirm("确定要删除吗?")){
location.href="${pageContext.request.contextPath}/delSelectedServlet?"+pids;
}
});
});
</script>
</head>
<body>
<h3 style="text-align: center">商品信息列表</h3>
<div style="float: right;margin: 5px;">
<a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加商品</a>
<a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a>
</div>
<form id="form" action="" method="post">
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th><input type="checkbox" id="firstCb"></th>
<th>序号</th>
<th>商品名称</th>
<th>出厂价</th>
<th>销售价</th>
<th>出厂日期</th>
<th>商品描述</th>
<th>操作</th>
</tr>
<%--遍历域对象中的数据,var是为了给对象起一个别名,方便读取--%>
<c:forEach items="${pb.list}" var="product" varStatus="s">
<tr>
<td><input type="checkbox" name="pids" value="${product.pid}"></td>
<td>${s.count}</td>
<td>${product.pname}</td>
<td>${product.market_price}</td>
<td>${product.shop_price}</td>
<td>${product.pdate}</td>
<td>${product.pdesc}</td>
<td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findProductServlet?id=${product.pid}">修改</a>
<a class="btn btn-default btn-sm" href="javascript:deleteUser('${product.pid}');">删除</a></td>
</tr>
</c:forEach>
</table>
</form>
</ul>
</nav>
</body>
</html>
该功能是使用jstl和el表达式来实现其功能的,大家可以多看看,该用法真的很秒,本人很喜欢
以上就是我对Javaweb中实现增删改查的一点拙见,希望大家有意见只管在评论区里提,还有有需要源码的私聊我,大家一块共同进步吧