Java任务:购物车的增删改查

来自CloudWiki
跳转至: 导航搜索

任务描述:购物车的增删查改

如图7-2所示,消费者可以实现对购物车的查询 和商品信息的修改

Java20-10-10.png

图7-2 查看和修改商品

定义接口

商品数据接口CartDao

package dao;
package dao;
import entity.*;
public interface CartDao {
	public int getNum(Integer uid);//获取购物车商品总数
	
	 public void addGoods(Integer uid,Integer gid,Integer num);//添加商品
	 
	  public void delGoods(Integer cid);//删除商品
	  
	  public void queryGoods(Integer uid);//查询购物车内已放商品
	  
	  public int hasGoods(Integer uid,Integer gid);//查询购物车内是否已有某件商品
	 
	  public void modifyGoods(Integer cid,Integer num);//修改购物车内该种商品的数量
	
}


实现思路

  • 我们现在已经定义了一个CartDao接口。
  • 接下来我们用MYSQL数据库来实现这个接口。

任务实现

创建测试数据

接下来我们在 MySQL 中创建 cloud 数据库,并创建 carts 数据表,表结构如下:

mysql> create database cloud;
    
Query OK, 1 row affected (0.00 sec)

mysql> use cloud;

 Database changed

数据表 carts:

CREATE TABLE IF NOT EXISTS `carts` (   
       `id` INT unsigned AUTO_INCREMENT,      
       `uid` INT(10) NOT NULL,   
       `gid` INT(10) NOT NULL,
       `num` INT(11) NOT NULL,       
        PRIMARY KEY (`id`)    
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入几条购物车数据(插的时候,uid,gid 分别对应着 user表和 goods表里的 id号,必须得是真实存在的。

MariaDB [cloud]> INSERT INTO `carts`(`uid`,`gid`,`num`) VALUES('1',`3`,3);
ERROR 1054 (42S22): Unknown column '3' in 'field list'

MariaDB [cloud]> INSERT INTO `carts`(`uid`,`gid`,`num`) VALUES('1','3','3');
Query OK, 1 row affected (0.00 sec)

MariaDB [cloud]> INSERT INTO `carts`(`uid`,`gid`,`num`) VALUES('1','4','2');
Query OK, 1 row affected (0.00 sec)

MariaDB [cloud]> SELECT * FROM `carts` inner join `goods` on `carts`.`gid` = `goods`.`id`;
+----+-----+-----+-----+----+-----------------+-------+-----+
| id | uid | gid | num | id | name            | price | num |
+----+-----+-----+-----+----+-----------------+-------+-----+
|  1 |   1 |   3 |   3 |  3 | 兰州牛肉面      |    12 |  20 |
|  2 |   1 |   4 |   2 |  4 | 黄焖鸡米饭      |    12 |  30 |
+----+-----+-----+-----+----+-----------------+-------+-----+

MariaDB [cloud]> SELECT `carts`.`id`,`goods`.`name`,`goods`.`price`,`carts`.num FROM `carts` inner join `goods` on `carts`.`gid` = `goods`.`id`;
+----+-----------------+-------+-----+
| id | name            | price | num |
+----+-----------------+-------+-----+
|  1 | 兰州牛肉面      |    12 |   3 |
|  2 | 黄焖鸡米饭      |    12 |   2 |
+----+-----------------+-------+-----+
2 rows in set (0.00 sec)

建立数据库连接

Java-20-10-3.png

Java-20-10-4.png

在main方法中建立这个类的对象测试一下:

 	
     public static void main(String[] args) {
		// TODO Auto-generated method stub
		CartDaoSQL s = new CartDaoSQL(); 
	}

运行结果:

Java-20-10-5.png

编写getNum方法

编写getNum方法,返回购物车商品数。

public int getNum(Integer uid) {
		 
		 int rowCount = 0;
		 try { 
	    		ResultSet rs = null;   //建立一个空的结果集
	            //1.创建PreparedStatement 对象,让它与一条SQL模板绑定;
	    		String sql = "SELECT sum(`carts`.num) record FROM `carts` "
	    				+ "inner join `goods` on `carts`.`gid` = `goods`.`id` where uid= ?";
	    		PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);  
	    		pstmt.setInt(1,uid);
                 //2.执行查询 
	            rs = pstmt.executeQuery();//执行查询		           
	            if(rs.next()){
	               rowCount=rs.getInt("record");
	            }
                pstmt.close();	    	     		
	            
	     }catch (SQLException e) {//捕捉、处理异常
	             System.out.println(e.getMessage());
	     }
		 return rowCount;
	  }


结果:

MySQL连接成功!
购物车现有商品为:

编写addGoods方法

public void addGoods(Integer uid,Integer gid,Integer num){	   
		  Connection conn =  this.conn;
	      int i = 0;
	      String sql = "insert into carts (uid,gid,num) values(?,?,?)";
	      PreparedStatement pstmt;
	      try {//1.创建PreparedStatement 对象,让它与一条SQL模板绑定;
	            pstmt = (PreparedStatement) conn.prepareStatement(sql);
	            pstmt.setInt(1, uid);
	            pstmt.setInt(2, gid);  //pstmt.setInt(2, user.getAge()); pstmt.setDate  
	            pstmt.setInt(3, num);  
	            
	            i = pstmt.executeUpdate();//2.执行查询 
	            if(i!=0){ //3.查看查询状态
	            	System.out.println("商品"+gid+"插入成功!");
		        }else {
		        	System.out.println("商品"+gid+"插入失败!");
		        }
	            pstmt.close();
	            
	        } catch (SQLException e) {
	        	System.out.println(e.getMessage());
	        }  		
	}

结果:

MySQL连接成功!
购物车现有商品为:3
向购物车中添加商品...

编写delGoods方法

public void delGoods(Integer cid) {//cid为购物车某条订单的id号 Connection conn = this.conn; int i = 0; String sql = "DELETE FROM carts WHERE id = ? "; try { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, Integer.valueOf(cid)); i = pstmt.executeUpdate(); if(i!=0){ System.out.println("订单"+cid+"删除成功!"); }else { System.out.println("订单"+cid+"删除失败!"); } pstmt.close(); }catch (SQLException e) { System.out.println(e.getMessage()); } }

编写hasGoods方法

public int hasGoods(Integer uid,Integer gid) {//查询某一商品
		int rowCount = 0;
		try { 
	    		ResultSet rs = null;   //建立一个空的结果集

	            //1.创建PreparedStatement 对象,让它与一条SQL模板绑定;
	    		String sql = "select num from carts where uid=? and gid=? ";
	    		PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);    		                               
	    		pstmt.setInt(1, uid);
	    		pstmt.setInt(2, gid);
	            //3.执行查询 
	            rs = pstmt.executeQuery();//执行查询   
	                     
                if(rs.next()){
	               rowCount=rs.getInt("num");
	            }
                pstmt.close();
	            
	    }catch (SQLException e) {//捕捉、处理异常
	             System.out.println(e.getMessage());	            
	    }
		return rowCount;
	}

编写queryGoods()方法

public void queryGoods(Integer uid){//查询所有商品
		  
		  String total ="";	       
	      try { //1.编写预编译语句
	    	    String sql = "SELECT `carts`.`id`,`goods`.`name`,`goods`.`price`,`carts`.num FROM `carts` "
	    	    		+ "inner join `goods` on `carts`.`gid` = `goods`.`id`where uid= ?";
	    	    PreparedStatement pstmt = (PreparedStatement)conn.prepareStatement(sql);
	    	    pstmt.setInt(1, uid);
	            //2.执行查询 
	            ResultSet  rs = pstmt.executeQuery();//执行查询
	            int col = rs.getMetaData().getColumnCount();//获取字段数	            
	            
	            //3. 打印数据表表头	 	            
	            for (int i = 1; i <= col; i++) {
	            	String col_name = rs.getMetaData().getColumnName(i);
	            	total +=(col_name+"\t");
	            	if (i == 2 ) {//此行仅仅是为了显示更好看,可以删去
                   	total +=("\t");
                   }	            	
	            }
	            total +=("\r\n");
	            total +=("==================================\r\n");   
	            
	          //4. 打印数据表结果	
	            while (rs.next()) {
	                for (int i = 1; i <= col; i++) {
	                	total +=(rs.getString(i) + "\t");
	                    if ((i == 2) && (rs.getString(i).length() < 8)) {//此行仅仅是为了显示更好看,可以删去
	                    	total +=("\t");
	                    }
	                 }
	                total +=("\r\n");
	            }
	            
	        } catch (SQLException e) {
	        	total =(e.getMessage());
	        }
	        
		System.out.println(total);
	}




编写modifyGoods方法

public void modifyGoods(Integer cid,Integer num) {		
		//修改商品
		  int i = 0;
	      String sql = "UPDATE carts SET num=?"  
	                 + " WHERE id=?";  
	      PreparedStatement pstmt;
	      try {
	             pstmt = (PreparedStatement) conn.prepareStatement(sql);
	             pstmt.setInt(1, num);
	             pstmt.setInt(2,Integer.valueOf(cid));            
	             i = pstmt.executeUpdate();
	             if(i!=0){ 
	            	 System.out.println("订单"+cid+"修改成功!");
		         }else {
		        	 System.out.println("订单"+cid+"修改失败!");
		         }
	             pstmt.close();
	             
	         } catch (SQLException e) {
	         	 System.out.println(e.getMessage());
	         }		
	}

测试代码

main. TestCart:

package main;

import java.util.Scanner;

import dao.*;
import entity.*;

public class TestCart {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CartDao s = new CartDaoSQL(); 
		UserDao uds =new UserDaoSQL();
		uds.queryUser();
		System.out.println("请输入用户id号:");
		Scanner sc = new Scanner(System.in);
		int uid = Integer.valueOf(sc.next());//输入用户id号
		
		/* 向购物车种添加商品  */
		GoodsDao g = new GoodsDaoSQL(); 
		System.out.println("商城现有商品:");
		System.out.println(g.findAll());
		System.out.println("您想购买什么商品?(输入商品id号)");
		int gid,num;
		gid = Integer.valueOf(sc.next());//输入商品id号
		System.out.println("购买该商品的数量为:");
		num = Integer.valueOf(sc.next());//输入商品购买数量
		s.addGoods(uid, gid, num);
		System.out.println("您想购买什么商品?(输入商品id号)");
		gid = Integer.valueOf(sc.next());//输入商品id号
		System.out.println("购买该商品的数量为:");
		num = Integer.valueOf(sc.next());//输入商品购买数量
		s.addGoods(uid, gid, num);
		
		/* 查询购物车中商品 */
		//获取购物车商品总数
		System.out.println("该用户购物车共有:" + s.getNum(uid)+" 件商品");
		//查询购物车所有商品
		System.out.println("该用户购物车如下所示:");
		s.queryGoods(uid);
		
		/* 修改购物车内商品的订购数目 */
		System.out.println("您想修改什么商品?(输入订单id号)");
		int  cid = Integer.valueOf(sc.next());//输入商品id号
		System.out.println("修改后,该商品的数量为:");
		num = Integer.valueOf(sc.next());
		s.modifyGoods(cid, num);
		//获取购物车商品总数
		System.out.println("该用户购物车共有:" + s.getNum(uid)+" 件商品");
		//查询购物车所有商品
		System.out.println("该用户购物车如下所示:");
		s.queryGoods(uid);
		
		/* 删除购物车中 商品  */
		System.out.println("您想取消什么订单的购买?(输入订单id号)");
		cid = Integer.valueOf(sc.next());//输入订单id号
		s.delGoods(cid);
		//查看购物车内某商品是否存在
		int now_num = s.hasGoods(uid,gid);
		if(now_num !=0 ) {
			System.out.println("编号为"+gid+"的商品现在不在购物车中");
		}
		//获取购物车商品总数
		System.out.println("该用户购物车共有:" + s.getNum(uid)+" 件商品");
		//查询购物车所有商品
		System.out.println("该用户购物车如下所示:");
		s.queryGoods(uid);
		
		
		sc.close();
				
	}
		
}