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

来源:互联网 发布:工程设计图软件 编辑:程序博客网 时间:2024/05/17 11:05

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

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

①servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取这些 pidString[] 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:

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

@Overridepublic 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错误。【谨记!切记!】