phpMyAdmin数据库插入数组仅首个值成功入库问题求助
问题描述
向phpMyAdmin管理的数据库插入多选的蔬菜值时,选中broccoli、carrots、Cabbage三个选项后执行插入,最终仅broccoli成功写入,其余两个值未入库。
现有代码
Servlet 代码
String[] vege = request.getParameterValues("vegetables-selected"); Model mod = new Model(); mod.setVegetables(vege);
Model 实体代码
private String[] Vegetables; public String[] getVegetables() { return Vegetables; } public void setVegetables(String[] vegetables) { Vegetables = vegetables; }
数据库操作代码
public static int AddRecipes(Model mod) { int i = 0; try { Driver(dbloader); Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(Add_Recipe); pst.setInt(1, mod.getUsers_ID()); pst.setString(2, mod.getTitle()); pst.setString(3, mod.getVegetables()); i = pst.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } return i; }
故障原因
PreparedStatement.setString()方法的入参要求是String类型,传入String[]字符串数组时,方法不会自动将数组拼接为合法字符串,只会默认取数组的第一个元素写入,因此只有第一个选项broccoli入库,后续值全部丢失。- 直接将多值数组存入单个数据库字段本身不符合数据库设计范式,后续做查询、统计时会非常麻烦。
修复方法
快速修复(单字段存储场景)
如果数据库对应字段是VARCHAR/TEXT/MySQLSET类型,先将数组拼接为逗号分隔的字符串再传入参数,修改数据库操作代码如下:
// 将数组拼接为逗号分隔的字符串,例:"broccoli,carrots,Cabbage" String vegetableStr = String.join(",", mod.getVegetables()); pst.setString(3, vegetableStr);
后续从数据库读取该字段时,调用字符串的split(",")方法即可转回数组使用。如果使用的是MySQL的SET类型,该拼接格式完全符合SET类型的写入语法,可直接使用。
规范修复(推荐长期使用)
新建两张关联表存储多对多关系:
- 蔬菜字典表
vegetables:存储蔬菜ID、蔬菜名称 - 食谱-蔬菜关联表
recipe_vegetables:存储食谱ID、对应蔬菜ID
插入食谱时,先写入食谱主表数据拿到生成的食谱ID,再批量将选中的蔬菜ID和当前食谱ID写入关联表即可。这种方式不会出现值丢失问题,后续做筛选、统计、关联查询的效率远高于单字段存拼接字符串的方案。
内容的提问来源于stack exchange,提问作者Benjie Alcontin
相关产品推荐
相关产品推荐

