java实现商城项目(添加商品功能)

701 阅读4分钟

前言:目前只写了商城面对商家添加商品的功能,陆续会慢慢完善其他的功能。

准备工作:

  1.      数据库建表
    
  2.      编写HTML网页
    
  3.      jdbc与数据库连接
    
  4.      java语言实现连接 
    

开始实现:

数据库:

1.建一张商品表和商家用户表

2.备注(id唯一自增,business_user中的business_id为主键business_product中的bus_id为外键,用来保障表的完整性)。

CREATE TABLE business_user(
business_id INT PRIMARY KEY AUTO_INCREMENT,#用户id
business_name VARCHAR(20),#昵称
account VARCHAR(20) NOT NULL ,#账号
PASSWORD VARCHAR(20) NOT NULL,#密码
UNIQUE KEY(account)
);
CREATE TABLE business_product(
bus_id INT,#用户id
pro_id INT PRIMARY KEY AUTO_INCREMENT,#商品id
product VARCHAR(20) NOT NULL,#商品
pro_price DOUBLE NOT NULL,#价格
remark TEXT,#备注
pro_inventory INT,#库存
FOREIGN KEY(bus_id) REFERENCES business_system(business_id)
);

HTML语言

1.写出增加增加商品的网页

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>买买卖卖商家版~~~</title>
    <style>
        body {
            background-color: lightblue;
        }
        form {
            color: plum;
            text-align: center;
            margin: auto;
            margin-top: 18%;
            font-size: 25px;
            margin-right: 100px;
        }
        input {
            height: 30px;
        }
    </style>
</head>
<body>
<form action="add" method="post">
    &nbsp;ID&nbsp;&nbsp;&nbsp;<input type="text" name="businessID"/><br/> 商品
    <input type="text" name="busProduct"/><br/> 价格
    <input type="text" name="busPrice"/><br/> 备注
    <input type="text" name="remark"/><br/> 库存
    <input type="text" name="inventory"/><br/>
    <br>
    <input type="submit" size="100px" value="添加"/>
</form>
</body>
</html>

jdbc

1.BaseDAO(通用增删改查等等方法),BusinessBAO(一个接口,起规范代码作用),BusinessBAOImpl(增删改查具体方法,简化版)。

(1)BaseDAO

package com.hqh_02.shopping.business.dao;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public abstract class BaseDAO<T> {
    public final String DRIVER = "com.mysql.cj.jdbc.Driver" ;
    public final String URL = "jdbc:mysql://localhost:3306/market_system?rewriteBatchedStatements=true&useServerPrepStmts=false";
    public final String USER = "root";
    public final String PWD = "8808808820dvc";

    protected Connection conn ;
    protected PreparedStatement psmt ;
    protected ResultSet rs ;

    //T的Class对象
    private Class entityClass ;

    public BaseDAO(){
        //getClass() 获取Class对象,当前我们执行的是new FruitDAOImpl() , 创建的是FruitDAOImpl的实例
        //那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法
        //因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class
        //所以getGenericSuperclass()获取到的是BaseDAO的Class
        Type genericType = getClass().getGenericSuperclass();
        //ParameterizedType 参数化类型
        Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
        //获取到的<T>中的T的真实的类型
        Type actualType = actualTypeArguments[0];
        try {
            entityClass = Class.forName(actualType.getTypeName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    protected Connection getConn(){
        try {
            //1.加载驱动
            Class.forName(DRIVER);
            //2.通过驱动管理器获取连接对象
            return DriverManager.getConnection(URL, USER, PWD);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null ;
    }

    protected void close(ResultSet rs , PreparedStatement psmt , Connection conn){
        try {
            if (rs != null) {
                rs.close();
            }
            if(psmt!=null){
                psmt.close();
            }
            if(conn!=null && !conn.isClosed()){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //给预处理命令对象设置参数
    private void setParams(PreparedStatement psmt , Object... params) throws SQLException {
        if(params!=null && params.length>0){
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
        }
    }

    //执行更新,返回影响行数
    protected int executeUpdate(String sql , Object... params){
        boolean insertFlag = false ;
        insertFlag = sql.trim().toUpperCase().startsWith("INSERT");
        try {
            conn = getConn();
            if(insertFlag){
                psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            }else {
                psmt = conn.prepareStatement(sql);
            }
            setParams(psmt,params);
            int count = psmt.executeUpdate() ;

            rs = psmt.getGeneratedKeys();
            if(rs.next()){
                return ((Long)rs.getLong(1)).intValue();
            }
            return count ;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(rs,psmt,conn);
        }
        return 0;
    }

    //通过反射技术给obj对象的property属性赋propertyValue值
    private void setValue(Object obj ,  String property , Object propertyValue){
        Class clazz = obj.getClass();
        try {
            //获取property这个字符串对应的属性名 , 比如 "fid"  去找 obj对象中的 fid 属性
            Field field = clazz.getDeclaredField(property);
            if(field!=null){
                field.setAccessible(true);
                field.set(obj,propertyValue);
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    //执行复杂查询,返回例如统计结果
    protected Object[] executeComplexQuery(String sql , Object... params){
        try {
            conn = getConn() ;
            psmt = conn.prepareStatement(sql);
            setParams(psmt,params);
            rs = psmt.executeQuery();

            //通过rs可以获取结果集的元数据
            //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等

            ResultSetMetaData rsmd = rs.getMetaData();
            //获取结果集的列数
            int columnCount = rsmd.getColumnCount();
            Object[] columnValueArr = new Object[columnCount];
            //6.解析rs
            if(rs.next()){
                for(int i = 0 ; i<columnCount;i++){
                    Object columnValue = rs.getObject(i+1);     //33    苹果      5
                    columnValueArr[i]=columnValue;
                }
                return columnValueArr ;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rs,psmt,conn);
        }
        return null ;
    }

    //执行查询,返回单个实体对象
    protected T load(String sql , Object... params){
        try {
            conn = getConn() ;
            psmt = conn.prepareStatement(sql);
            setParams(psmt,params);
            rs = psmt.executeQuery();

            //通过rs可以获取结果集的元数据
            //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等

            ResultSetMetaData rsmd = rs.getMetaData();
            //获取结果集的列数
            int columnCount = rsmd.getColumnCount();
            //6.解析rs
            if(rs.next()){
                T entity = (T)entityClass.newInstance();

                for(int i = 0 ; i<columnCount;i++){
                    String columnName = rsmd.getColumnName(i+1);            //fid   fname   price
                    Object columnValue = rs.getObject(i+1);     //33    苹果      5
                    setValue(entity,columnName,columnValue);
                }
                return entity ;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } finally {
            close(rs,psmt,conn);
        }
        return null ;
    }


    //执行查询,返回List
    protected List<T> executeQuery(String sql , Object... params){
        List<T> list = new ArrayList<>();
        try {
            conn = getConn() ;
            psmt = conn.prepareStatement(sql);
            setParams(psmt,params);
            rs = psmt.executeQuery();

            //通过rs可以获取结果集的元数据
            //元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等

            ResultSetMetaData rsmd = rs.getMetaData();
            //获取结果集的列数
            int columnCount = rsmd.getColumnCount();
            //6.解析rs
            while(rs.next()){
                T entity = (T)entityClass.newInstance();

                for(int i = 0 ; i<columnCount;i++){
                    String columnName = rsmd.getColumnName(i+1);            //fid   fname   price
                    Object columnValue = rs.getObject(i+1);     //33    苹果      5
                    setValue(entity,columnName,columnValue);
                }
                list.add(entity);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } finally {
            close(rs,psmt,conn);
        }
        return list ;
    }
}

(2)BusinessDAO

package com.hqh_02.shopping.business.dao.pro;

import com.hqh_02.shopping.business.bean.Product.BusinessProduct;

import java.util.List;

public interface BusinessProductDAO {
    List<BusinessProduct> getProList();

    //新增库存
    boolean addPro(BusinessProduct product);

    //修改库存
    boolean updatePro(BusinessProduct product);

    //根据名称查询特定库存
    BusinessProduct getProByPname(String pname);

    //删除特定库存记录
    boolean delPro(String pname);
}

(3)BusinessDAOImpl

package com.hqh_02.shopping.business.dao.pro;

import com.hqh_02.shopping.business.bean.Product.BusinessProduct;
import com.hqh_02.shopping.business.dao.BaseDAO;

import java.util.List;

public class BusinessProDAOImpl extends BaseDAO<BusinessProduct> implements BusinessProductDAO{
    @Override
    public List<BusinessProduct> getProList() {
        return super.executeQuery("select * from t_fruit");
    }

    @Override
    public boolean addPro(BusinessProduct businessProduct) {
        String sql = "insert into business_product (bus_id,product,pro_price,remark,pro_inventory)VALUES(?,?,?,?,?);";
        int count = super.executeUpdate(sql,businessProduct.getBusId(),businessProduct.getBusProduct(),businessProduct.getBusPrice(),businessProduct.getRemarks(),businessProduct.getInventory()) ;
        //insert语句返回的是自增列的值,而不是影响行数
        //System.out.println(count);
        //retun这里可以做一个判断,count是否大于0,大于返回true,小于返回false
        return count>0;
    }

    @Override
    public boolean updatePro(BusinessProduct product) {
        String sql = "update t_fruit set fcount = ? where fid = ? " ;
        return super.executeUpdate(sql)>0;
    }

    @Override
    public BusinessProduct getProByPname(String pname) {
        return super.load("select * from t_fruit where fname like ? ",pname);
    }

    @Override
    public boolean delPro(String pname) {
        String sql = "delete from t_fruit where fname like ? " ;
        return super.executeUpdate(sql,pname)>0;
    }
}

注:只写了增加商品的功能

java

1.配置好Tomcat(这个一定要配置好,如果没配置好会出很多差错)具体如何配置请自行去看其他大佬的博客或网课。

2.以servlet继承HTTPServlet,重写doPost方法。

3.配置web.xml文件

4.最后肯定不能忘了两个类

(1)商品类

package com.hqh_02.shopping.business.bean.Product;

public class BusinessProduct {
    //店家ID
    private Integer busId;
    //商品
    private String busProduct;
    //价格
    private Double busPrice;
    //备注
    private String remarks;
    //库存
    private Integer inventory;

    public Integer getBusId() {
        return busId;
    }

    public void setBusId(Integer busId) {
        this.busId = busId;
    }

    public String getBusProduct() {
        return busProduct;
    }

    public void setBusProduct(String busProduct) {
        this.busProduct = busProduct;
    }

    public Double getBusPrice() {
        return busPrice;
    }

    public void setBusPrice(Double busPrice) {
        this.busPrice = busPrice;
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    public Integer getInventory() {
        return inventory;
    }

    public void setInventory(Integer inventory) {
        this.inventory = inventory;
    }

    public BusinessProduct(int busId, String busProduct, double busPrice, String remarks, int inventory) {
        this.busId = busId;
        this.busProduct = busProduct;
        this.busPrice = busPrice;
        this.remarks = remarks;
        this.inventory = inventory;
    }
}

(2)商家用户类

package com.hqh_02.shopping.business.bean.user;

public class BusinessUser {
    //姓名
    private String busiName;
    //邮箱
    private String busiemail;
    //密码
    private String busiPassword;

    public String getBusiName() {
        return busiName;
    }

    public void setBusiName(String busiName) {
        this.busiName = busiName;
    }

    public String getBusiemil() {
        return busiemail;
    }

    public void setBusiemil(String busiemil) {
        this.busiemail = busiemil;
    }

    public String getBusiPassword() {
        return busiPassword;
    }

    public void setBusiPassword(String busiPassword) {
        this.busiPassword = busiPassword;
    }

    public BusinessUser(String busiName, String busiemail, String busiPassword) {
        this.busiName = busiName;
        this.busiemail = busiemail;
        this.busiPassword = busiPassword;
    }
}

(3)AddServlet类

package com.hqh_02.shopping.business.servlet;

import com.hqh_02.shopping.business.bean.Product.BusinessProduct;
import com.hqh_02.shopping.business.dao.pro.BusinessProDAOImpl;
import com.hqh_02.shopping.business.dao.pro.BusinessProductDAO;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//需要子类重写HttpServlet的方法,不然默认是404
public class AddServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest requst, HttpServletResponse response) throws ServletException, IOException {
        requst.setCharacterEncoding("UTF-8");
//        response.sendRedirect("index.html");
        int businessID= Integer.parseInt(requst.getParameter("businessID"));
        String businessProduct=requst.getParameter("busProduct");
        double price= Double.parseDouble(requst.getParameter("busPrice"));
        String remark=requst.getParameter("remark");
        int inventory=Integer.parseInt(requst.getParameter("inventory"));
        BusinessProductDAO businessProductDAO=new BusinessProDAOImpl();
        boolean flag=businessProductDAO.addPro(new BusinessProduct(businessID,businessProduct,price,remark,inventory));
        System.out.println(flag?"添加成功":"添加失败");
    }
}

(4)web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>com.hqh_02.shopping.business.servlet.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>ServletLogin</servlet-name>
        <servlet-class>com.hqh_02.shopping.business.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletLogin</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>EnrollServlet</servlet-name>
        <servlet-class>com.hqh_02.shopping.business.servlet.EnrollServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>EnrollServlet</servlet-name>
        <url-pattern>/Enroll</url-pattern>
    </servlet-mapping>
</web-app>

最后实现效果

(1)HTML网页

image.png (2)数据库

image.png