如何使用Spring和Mybatis在mysql中存储Json数组或Json对象

时间:2016-11-15 17:27:17

标签: spring-mvc mybatis

Controller.java

@RequestMapping(value = { ControllerUriConstant.add }, method = RequestMethod.POST)
@ActivityMapping(activity = ActivityEnum.ADD)
public String addActivities(@ModelAttribute("activityForm") ActivityForm activityForm, BindingResult bindingResult, Model model,
        HttpServletRequest request) throws Exception {
    new ActivityFormValidator().validate(activityForm, bindingResult, request.getLocale(), getMessageSource(), null, activityService);
    if (bindingResult.hasErrors()) {
        model.addAttribute(Constants.ACTIVITY_FORM,activityForm );
        model.addAttribute(Constants.HAS_ERROR, Boolean.TRUE);
        model.addAttribute("add", true);
        model.addAttribute(Constants.ERROR_MESSAGE, getMessageSource().getMessage("ulearn.messages.add.failed", activityForm.getName()));
        return "activityform";
    } else {
        model.addAttribute(Constants.SUCCESS_MESSAGE, getMessageSource().getMessage("ulearn.messages.add.success", activityForm.getName()));
        JSONArray address =new JSONArray();
        JSONObject jo = new JSONObject();
        jo.put("id", "1");
        jo.put("name","Test");
        JSONObject jo1= new JSONObject();
        jo1.put("id", "1");
        jo1.put("name", "Test2");
        JSONObject jo2= new JSONObject();
        jo2.put("id", "1");
        jo2.put("name", "Test3");
        address.add(jo);
        address.add(jo1);
        address.add(jo2);

        activityForm.setInsertJsonMysql(address);
        activityService.add(activityForm);
    }
    return getActivities( model, request);
}

Service.java

public void add(ActivityForm activityForm) throws TechnoShineException {
    try {
        Activity activity = new Activity();
        activity.setName(activityForm.getName());
        activity.setActive(activityForm.getActive());
        activity.setInsertJsonMysql(activityForm.getInsertJsonMysql());
        activityDAO.getMapper().insert(activity);
        logAudit(getAuditableList(activity, null), getMessageSource().getMessage("ulearn.messages.add.success", activity.getName()), 0, ActivityEnum.ADD);
    } catch (Exception e) {
        throw new TechnoShineException(e, ActivityService.class);
    }
}

Mapper.xml

<insert id="insert" parameterType="com.technoshinelabs.ulearn.persistance.bean.controlpanel.Activity">
    INSERT INTO activity (activity_name,is_active,json_array)
    VALUES (#{name},#{active},#{insertJsonMysql})
</insert>

//最后得到此错误错误由以下引起:java.lang.IllegalStateException:类型handler对于属性&quot; insertJsonMysql&#39;的参数映射为null。未指定和/或找不到指定的javaType / jdbcType组合。

  
    

[1]:https://i.stack.imgur.com/OeZeR.png

  

1 个答案:

答案 0 :(得分:0)

我想你要存储的是实际的JSON,MySQL表列 json_array 的类型是 VARCHAR TEXT

JSONArray实际上只是一个用于构建JSON的实用程序类。

然后,您应将类 Activity 的属性 insertJsonMysql 的类型更改为 String ,并将其设置为的String表示形式JSONArray

activity.setInsertJsonMysql(activityForm.getInsertJsonMysql().toString());

编辑:关于插入枚举列。

根据MySQL 5.7 Reference Manual,我会说你插入enum类型列的方式与插入任何String的方式相同,DB将根据 CREATE TABLE 中声明的值列表检查提供的值。

但根据您提供的代码示例, insertJsonMysql 的值将为:

[{"id":"1","name":"Test1"},{"id":"1","name":"Test2"},{"id":"1","name":"Test3"}]

这意味着其中一个枚举值必须是这个确切的字符串。

然而,我觉得这不是你所期望的。也许使用SET类型的列是一个更接近的答案。