Javaweb实现增删改查操作操作

Javaweb实现增删改查操作操作

一:准备工作
1:Idea编辑器(eclispe和myeclispe都可以,个人推荐使用idea),新建一个web项目
2:数据库mysql
3:需要提前了解的知识点
servlet
el和jstl表达式
项目的基本的框架实现(Javaweb经典的三层架构)
4:UUID自动生成id的工具
5:在idea中生成的包结构
Javaweb实现增删改查操作操作_第1张图片
二:数据库的设计和实现操作
需要在设计库中实现数据库的创建和数据表的填写
1.数据库和数据表的创建
Javaweb实现增删改查操作操作_第2张图片
在这里插入图片描述
2.向数据库中添加数据
Javaweb实现增删改查操作操作_第3张图片
3.数据库连接工具druid和dbutils
Javaweb实现增删改查操作操作_第4张图片

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包了,不过作为基础还是希望大家能够用心对待基础
Javaweb实现增删改查操作操作_第5张图片
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 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 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 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 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 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 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 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 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 findAllProduct() {
        //1.定义sql
        String sql = "select * from product order by pdate desc";
        return template.query(sql,new BeanPropertyRowMapper(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.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" %>



    
        
        
        
        
        修改用户

        
        
        
        
    
    
        

修改商品信息

<%--设置影藏域,提交信息的时候同时也把id也给提交了,作为后面运行的标准--%>

Javaweb实现增删改查操作操作_第6张图片

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>



    
        
        
        
        
        修改用户

        
        
        
        
    
    
        

修改商品信息

<%--设置影藏域,提交信息的时候同时也把id也给提交了,作为后面运行的标准--%>

Javaweb实现增删改查操作操作_第7张图片
下面重点来讲一下list.jsp显示页面,实现数据的从域对象中获取出来,再在前台显示的效果

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


    商品列表
    
    
    
    
    
    
    
    



     

商品信息列表

<%--遍历域对象中的数据,var是为了给对象起一个别名,方便读取--%>
序号 商品名称 出厂价 销售价 出厂日期 商品描述 操作
${s.count} ${product.pname} ${product.market_price} ${product.shop_price} ${product.pdate} ${product.pdesc} 修改  删除

该功能是使用jstl和el表达式来实现其功能的,大家可以多看看,该用法真的很秒,本人很喜欢
Javaweb实现增删改查操作操作_第8张图片

以上就是我对Javaweb中实现增删改查的一点拙见,希望大家有意见只管在评论区里提,还有有需要源码的私聊我,大家一块共同进步吧

你可能感兴趣的:(Javaweb)