电子商城 批量删除 商品时,dao操作遇到 二维数组 元素赋值问题。【加深 二维数组初始化的理解】

这里 有两种批量删除的方法。

处理批量删除请求的方法:

①servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取这些 pid
		String[] pids = request.getParameterValues("pid");//===牢记:【接收:表单项name属性值 或 参数name值】所以是“pid”,不是“pids”。
		/*===######===
		 * 参数名=pid 的同名参数,有多个值,也就是:有多个同名的表单项(只能是checkBox)。
		 * ===select的option没有name属性。*/
		
		//怎么根据 pids 删除?
		/*
		 * 方案1:遍历 pids 取出每一个 pid
		 *   调用 service deleByPid(pid) 删除
		 * 方案2:更优。	使用queryRunner的batch()批处理方法。
		 *   
		 */
		ProductService ps = new ProductServiceImpl();
		try {
			ps.delByPids(pids);
			request.getRequestDispatcher("/FindAll").forward(request, response);
		} catch (SQLException e) {
			e.printStackTrace();
		}//批量删除
	}
②service:

/*
	 * 新知识点:
	 *  批量操作 
	 */
	@Override
	public void delByPids(String[] pids) throws SQLException {
		ProductDao pd = new ProductDaoImpl();
		pd.delByPids(pids);
	}
③dao:

@Override
	public void delByPids(String[] pids) throws SQLException {
		//===QueryRunner qr = new QueryRunner();
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "delete from product where pid=?";
		/*
		 * 二维数组结构
		 * 长度是要删除的 pid 的数量
		 * 每一个元素都是一个一维数组,一维数组的值 --- pid
		 */
		Object[][] params = new Object[pids.length][];
		for (int i = 0; i < params.length; i++) {
			//params[i][0]=pids[i];//===self方式==NullPointerException==Why?
			params[i]=new Object[]{pids[i]};//==teacher==answer==ok
		}
		//==######=外围数组的长度决定了 sql 语句执行的次数,里面的一维数组的值用于补齐每次执行sql所需的参数===了解了。
		qr.batch(sql, params);
	}





//params[i][0]=pids[i];//===self方式==NullPointerException==Why?
========同学讨论得出结论,解惑:

这里模拟 传过来的 多个 商品id,String[ ] ids。

package cn.itcast.dao.impl;

public class test {
	public static void main(String[] args) {
			String[] pids = {"1","2","3"};
			
			//===
			Object[][] params = new Object[pids.length][];
			
			System.out.println(params[pids.length].length);
			
			for (int i = 0; i < params.length; i++) {
				System.out.println("pids[i]:"+pids[i]);
				params[i][0]=(Object)pids[i];//===self==NullPointerException===Why?
				/*
				 * ===self==NullPointerException===Why?===解惑:
				 * ===【讨论得出结论:
				 * 【理解角度:数组动态初始化 和 静态初始化 的区别。
				 * 动态初始化:定义数组时,给大小,不赋值;后期{}任意赋值;
				 * 静态初始化:直接大括号给值。
				 * 
				 * 二维数组 看作 两层一维数组。
				 * 这里: Object[][] params = new Object[pids.length][];
				 * 这里省略列数,给了行数。
				 * 那么 外层一维  数组params给定了大小,可以动态初始化;
				 * 然而 内层一维  数组params[i]没给定大小,也没静态初始化。
				 * 所以:可看作 只是声明 了数组名,没有new,没有 创建数组。即看作:内层一维数组 Object[] params[i]=null;
				 * 所以 params[i][0]=(Object)pids[i];给内层一维数组元素 赋值,相当于给null 赋值。所以空指针,数组下标也会越界。

				 * 】
				 * */
				
				//params[i]=new Object[]{pids[i]};//====ok======
				for (int j = 0; j < params[i].length; j++) {
					System.out.println(params[i][j]);
				}
			}
	}
}

======【这里 富有常规的定义创建数组规则:行列大写,“省行不省列”】。这里却是偏偏 “省列不省行”。

=====************这种java基础的语法细节,如果不加深理解,反复使用。养成好的使用习惯。很容易再次犯错!而且一旦出错。很难找出bug错误。【谨记!切记!】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值