您的位置:首页 > 其它

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

2017-08-31 22:51 239 查看
这里 有两种批量删除的方法。

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

①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错误。【谨记!切记!】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐