前言:目前只写了商城面对商家添加商品的功能,陆续会慢慢完善其他的功能。
准备工作:
-
数据库建表 -
编写HTML网页 -
jdbc与数据库连接 -
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">
ID <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网页
(2)数据库