电子商城 批量删除 商品时,dao操作遇到 二维数组 元素赋值问题。【加深 二维数组初始化的理解】
2017-08-31 22:51
239 查看
这里 有两种批量删除的方法。
处理批量删除请求的方法:
①servlet:
这里模拟 传过来的 多个 商品id,String[ ] ids。
======【这里 富有常规的定义创建数组规则:行列大写,“省行不省列”】。这里却是偏偏 “省列不省行”。
=====************这种java基础的语法细节,如果不加深理解,反复使用。养成好的使用习惯。很容易再次犯错!而且一旦出错。很难找出bug错误。【谨记!切记!】
处理批量删除请求的方法:
①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错误。【谨记!切记!】
相关文章推荐
- C++STL中对vector进行erase删除元素操作中遇到的问题。
- 对cookie操作的时候遇到了一些的 删除、修改、查询不了问题,看来篇文章发现不错,抓一下
- 线性表链式存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、归并等)
- 使用 通用mapper时 根据主键进行 删除 更新操作 遇到的问题
- 用for循环来删除ArrayList集合中的所有元素所遇到的问题
- Mysql bench执行sql语句批量操作数据所遇到的问题
- java中删除list指定元素遇到的问题
- [VB.NET]detailsview 的更新、插入、删除操作遇到的问题
- 今天开发中遇到的一个关于初始化赋值问题
- DATAGRID编辑、更新、删除操作中遇到的问题
- 关联式容器map/multimap之初始化、删除元素、交换元素及清空操作
- 数组顺序表初始化、特定位置插入元素、删除特定值等操作
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 2017 青岛网络赛 Smallest Minimum Cut 最大流最小割问题, (加深理解最大流问题)
- 解决函数中返回局部指针变量的问题,加深理解《堆和栈》问题。
- 删除容器中元素时的迭代器失效问题
- Ubuntu中初步安装好MYSQL后,无法登陆问题及mysql添加、删除账号和修改密码操作
- 超低级错误List删除元素(没有理解拿着就用)
- MVC3学习第八章 葵花点穴手之指如疾风----MVC3下实现数据的批量删除和利用EF初始化我们的数据