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

问题描述 投票:1回答:1

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:类型处理程序在属性“insertJsonMysql”的参数映射上为null。未指定和/或找不到指定的javaType / jdbcType组合。

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

spring-mvc mybatis
1个回答
0
投票

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

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

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

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

编辑:关于插入枚举列。

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.