我想把删除商品是也把图片也删除功能完善
来源:4-14 删除商品的代码实现
MasonM
2019-06-01 14:39:04
public void delete(Integer pid) {
Connection conn=null;
PreparedStatement pstmt=null;
PreparedStatement pstmt2=null;
ResultSet rs=null;
try {
//获得连接
conn=JDBCUtils.getConnection();
//编写SQL
String sql = "DELETE FROM product WHERE pid=?";
String sql2 ="SELECT path FROM product WHERE pid=?";
//预编译SQL
pstmt2 = conn.prepareStatement(sql2);
pstmt=conn.prepareStatement(sql);
//设置具体参数
pstmt2.setInt(1, pid);
pstmt.setInt(1, pid);
//执行SQL
rs= pstmt2.executeQuery();
if (rs.next()) {
String path = rs.getString("path");
File file = new File(path);
if (file.isFile() && file.exists()) {
file.delete();
System.out.println("删除:"+path+" 成功!!");
}
}
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(pstmt,conn);
JDBCUtils.release(rs,pstmt2,conn);
}
}老师,我把代码写成这样,但我发现商品成功删除了,但图片没删除成功,请问是图片路径出问题了吗?
而且我这样写好不好,用同一个conn对象来预编译两个sql语句
5回答
同学你好,同学的理解是正确的~
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
MasonM
提问者
2019-06-01
1:哈哈哈老师,我一开始删除商品但没删除到图片是因为我删除的路径错了我直接用了数据库中商品的path来创建File对象来执行删除了,这样程序没能找到图片在磁盘上的绝对路径所以我那时候没删除成功
另外我查询这个图片的地址是为了确认删除是否成功执行了
2:老师你的意思是,用"/"和"\"来写路径都是没问题的吗?都能正常执行吗?
3:编译后的java文件也会发布到WEB-INF下是什么意思呢?
是这样吗?
在IDEA中发布项目后,里的out文件夹下

是这样吗?
老师你的意思是,当项目发布之后,整个web这个文件夹是不存在了,然后web文件夹下的东西全
好帮手慕阿莹
2019-06-01
1、是可以的,但是不明白同学为什么说,把商品删除了,图片没有删除,
删除应该是删除指定pid的整条数据呀,同学用老师的方法没有办法把图片删除吗?
同学这个删除商品后,又查询这个图片的地址是什么意思呢?是为了确认是否删除了吗?
比如说,删除pid是6的,则应该是整条数据都被删除了呀

2、D:\ideaJavaCode\shop\out\artifacts\shop_war_exploded\/upload/75e46788bd9743498eea432d3813153c.jpg 这个\/ 是因为获取路径时的分隔符是\ 的,而拼接的写成了“/”
这个么有关系的,windows会进行识别,不过window的文件往往用“\”例如:

而链接往往用/,

但只要能显示到就可以呦,同学这里不必纠结。
3、
request.getServletContext().getRealPath("/") 是获取的这个项目根路径在电脑中的真实路径,实际上,web文件夹下的发布后就是项目的根路径,同学猜的没错哦。
编译后的java文件也会发布到WEB-INF下,发布后是没有web这个文件夹的,它就是根路径了。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
MasonM
提问者
2019-06-01
另外我还想知道
我使用的request.getServletContext().getRealPath("/")语句
后面的getRealPath("/"),是代表获取到项目的根路径吗?
因为我发现

红框中的路径是通过request.getServletContext().getRealPath("/")获取到的
请问,

这里是否就是项目的根路径呢?这里好像是Web目录来的

MasonM
提问者
2019-06-01
老师我把我的代码完善了,请评价一下
public void delete(Integer pid, HttpServletRequest request) {
Connection conn=null;
PreparedStatement pstmt=null;
PreparedStatement pstmt2=null;
ResultSet rs=null;
try {
//获得连接
conn=JDBCUtils.getConnection();
//编写SQL
String sql = "DELETE FROM product WHERE pid=?";
String sql2 ="SELECT path FROM product WHERE pid=?";
//预编译SQL
pstmt2 = conn.prepareStatement(sql2);
pstmt=conn.prepareStatement(sql);
//设置具体参数
pstmt2.setInt(1, pid);
pstmt.setInt(1, pid);
//执行SQL
rs= pstmt2.executeQuery();
if (rs.next()) {
String path = rs.getString("path");
String filePath=request.getServletContext().getRealPath("/")+path;
File file = new File(filePath);
if (file.isFile() && file.exists()) {
file.delete();
System.out.println("删除:"+filePath+" 成功!!");
}
}
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(pstmt,conn);
JDBCUtils.release(rs,pstmt2,conn);
}
}
成功删除了对应商品的图片,我之前删除失败,应该是,我删除文件是使用的路径只是

这一种,upload前面的路径没完善,所以程序没找到在硬盘上图片的具体位置,所以,
我在delete方法中,传入了request对象,并使用了request.getServletContext().getRealPath("/")来获取服务器里文件的绝对路径

然后就成功执行了file.delete();的删除方法了
请老师评价一下我的代码完成的如何?
另外,我有点疑问
删除:D:\ideaJavaCode\shop\out\artifacts\shop_war_exploded\/upload/75e46788bd9743498eea432d3813153c.jpg 成功!!
在这个路径里,我发现符号不对了

红框中\/,这样的路径是正确的吗?请老师解答一下,谢谢!
相似问题