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

xiaoxiao2021-02-28  96

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

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

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

转载请注明原文地址: https://www.6miu.com/read-61494.html

最新回复(0)