Mysql 5.7.8开始支持Json对象和Json数组,但在Mysql 8版本中使用Json性能更佳。
使用Json格式的好处:
SELECT VERSION();

2、创建mysql表
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `text` json DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

3、定义实体类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;
@Data
//开启自动映射
@TableName(value = "test",autoResultMap = true)
public class Test {
@TableId(type = IdType.AUTO)
private Integer id;
//定义Json字段handler
@TableField(typeHandler = FastjsonTypeHandler.class)
private JsonNode text;
}
import lombok.Data;
import java.io.Serializable;
@Data
public class JsonNode implements Serializable {
private Integer id;
private String name;
private Integer age;
}
4、定义Mapper、Service、ServiceImpl
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.yiyou.base.entity.Test; public interface TestMapper extends BaseMapper{ }
import com.baomidou.mybatisplus.extension.service.IService; import com.yiyou.base.entity.Test; public interface TestService extends IService{ boolean insert(Test test); }
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yiyou.base.entity.Test; import com.yiyou.base.mapper.TestMapper; import com.yiyou.base.service.TestService; import org.springframework.stereotype.Service; @Service public class TestServiceImpl extends ServiceImplimplements TestService { @Override public boolean insert(Test test) { return this.saveOrUpdate(test); } }
5、Controller层实现
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.yiyou.base.entity.Test;
import com.yiyou.base.service.TestService;
import com.yiyou.model.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
@Slf4j
@Api(tags = "test")
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestService testService;
@ApiOperation("新增")
@PostMapping("/save")
public R save(@RequestBody Test test) {
return R.ok(testService.insert(test));
}
@ApiOperation("根据Id获取对象")
@GetMapping("/getById/{id}")
public R getById(@PathVariable("id") Integer id) {
return R.ok(testService.getById(id));
}
@ApiOperation("根据Id删除")
@DeleteMapping("/deleteById/{id}")
public R deleteById(@PathVariable("id") Integer id) {
return R.ok(testService.removeById(id));
}
@ApiOperation("条件查询")
@PostMapping("/findList")
public R> findList(@RequestBody Test test) {
LambdaQueryChainWrapper queryWrapper = testService.lambdaQuery();
queryWrapper
.eq(Objects.nonNull(test.getId()),Test::getId,test.getId())
// .apply(Objects.nonNull(test.getText()),"text -> '$.name' LIKE CONCAT('%',{0},'%')",test.getText().getName())
.apply(Objects.nonNull(test.getText()), "text -> '$.age' = {0}", test.getText().getAge());
// .like(Objects.nonNull(test.getText()),Test::getText,test.getText());
return R.ok(queryWrapper.list());
}
SELECT * FROM TEST WHERE text -> '$[*].name' like '%测%'
或 上面的"*"也可以使用下标
SELECT * FROM TEST WHERE text -> '$[1].name' like '%测%'
Json字段精确查询
使用箭头函数
SELECT * FROM TEST WHERE text -> '$.name' = '测试'
SELECT * FROM TEST WHERE JSON_CONTAINS(text,JSON_OBJECT('name', '测试'))
SELECT id, text -> '$[*].name' AS name FROM TEST;
SELECT id, JSON_EXTRACT( text, '$[*].name' ) AS name FROM TEST;
SELECT id, JSON_UNQUOTE(text, '$[*].name' ) AS name FROM TEST;
SELECT id, text -> '$[*].*' AS name FROM TEST;
提示:使用apply方法拼接sql片段,apply 是可以通过占位符的形式,传入多个参数。
例如:
LambdaQueryChainWrapperqueryWrapper = testService.lambdaQuery(); queryWrapper .apply(Objects.nonNull(test.getText()),"text -> '$.name' LIKE CONCAT('%',{0},'%')",test.getText().getName())//模糊查询 .apply(Objects.nonNull(test.getText()), "text -> '$.age' = {0}", test.getText().getAge());//精确查询
上一篇:Nginx入门(二)配置静态网站