mybatis plus中json格式实战

news/2024/2/27 17:44:08

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>StudyMybatisPlus</artifactId><version>0.0.1-SNAPSHOT</version><name>StudyMybatisPlus</name><description>Demo project for Spring Boot</description><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><dependency><groupId>org.reflections</groupId><artifactId>reflections</artifactId><version>0.9.10</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.application.yml

#配置端口
server:port: 80spring:#配置数据源datasource:#配置数据源类型type: com.zaxxer.hikari.HikariDataSource#配置连接数据库的信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=trueusername: rootpassword: root#mybatis plus配置
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 字段名和数据库中字段名一致map-underscore-to-camel-case: falseglobal-config:db-config:#配置mybatis plus 在更新时只更新非空和非NULL的字段update-strategy: not_empty# 实体名字和数据库表名一致table-underline: false# 需要转化为json的字段
map-field-scan-package: "com.example"

3.MapData.java

package com.example.studymybatisplus.anno;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MapData {
}

4.TypeConfig.java

package com.example.studymybatisplus.config;import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropertiesCustomizer;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.example.studymybatisplus.anno.MapData;
import org.reflections.Reflections;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;/*** 注册需要转换为Map的处理器*/
@Configuration
public class TypeConfig implements MybatisPlusPropertiesCustomizer {@Value("${map-field-scan-package}")String packageName;@Overridepublic void customize(MybatisPlusProperties properties) {Reflections reflections = new Reflections(this.packageName);Set<Class<?>> typesAnnotatedWith = reflections.getTypesAnnotatedWith(TableName.class);Set<Class<?>> mapTypeSet = new HashSet<>();typesAnnotatedWith.forEach(clazz -> {Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);if (field.getAnnotation(MapData.class) != null) {if(mapTypeSet.contains(field.getType())){continue;}mapTypeSet.add(field.getType());properties.getConfiguration().getTypeHandlerRegistry().register(field.getType(), JacksonTypeHandler.class);}}});}
}

5.UserMapper.java

package com.example.studymybatisplus.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.studymybatisplus.pojo.User;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface UserMapper extends BaseMapper<User> {/*** 测试自定义sql*/List<User> getUserList();
}

6.User.java

package com.example.studymybatisplus.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.studymybatisplus.anno.MapData;
import lombok.Data;@Data
@TableName(autoResultMap = true)
public class User {@TableId(type = IdType.AUTO)private Long id;private String name = "";private Integer age = 0;@MapDataprivate UserInfo info = new UserInfo();
}

7.UserInfo.java

package com.example.studymybatisplus.pojo;import lombok.Data;import java.util.HashMap;
import java.util.Map;@Data
public class UserInfo {private String address="";private Map<Integer, Integer> map = new HashMap<>();private DataVo dataVo = new DataVo();private Integer aaa;
}

8.DataVo.java

package com.example.studymybatisplus.pojo;import lombok.Data;import java.util.HashMap;
import java.util.Map;@Data
public class DataVo {private Integer num;private Map<Integer, Integer> map2 = new HashMap<>();
}

9.主方法

package com.example.studymybatisplus;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.studymybatisplus.mapper")
public class StudyMybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(StudyMybatisPlusApplication.class, args);}
}

10.UserMapper.xml   // 测试自定义sql

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.studymybatisplus.mapper.UserMapper"><select id="getUserList" resultType="com.example.studymybatisplus.pojo.User">SELECT id, name, age, infoFROM user</select>
</mapper>

可见,完全不需要ResultMap了,非常完美!!!

11.测试用例

package com.example.studymybatisplus;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.studymybatisplus.mapper.UserMapper;
import com.example.studymybatisplus.pojo.User;
import com.example.studymybatisplus.pojo.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;
import java.util.Random;@SpringBootTest
class StudyMybatisPlusApplicationTests {@AutowiredUserMapper userMapper;@Testvoid contextLoads() {for (int i = 0; i < 10; i++) {User newUser = new User();newUser.setName("xx");newUser.setAge(30);newUser.getInfo().setAddress("北京 " + new Random().nextInt(10000));newUser.getInfo().getMap().put(1, 123);newUser.getInfo().getDataVo().setNum(222);newUser.getInfo().getDataVo().getMap2().put(666, 888);newUser.getInfo().getDataVo2().setNum(112222);int insert = userMapper.insert(newUser);System.out.println("insert:" + insert);System.out.println(newUser);// 测试QueryWrapperLambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();List<User> userList1 = userMapper.selectList(lambda);System.out.println(userList1);// 现在自定义sql也完全不需要ResultMap了List<User> userList2 = userMapper.getUserList();System.out.println(userList2);}}
}

9.输出

JDBC Connection [HikariProxyConnection@1111497601 wrapping com.mysql.cj.jdbc.ConnectionImpl@f1d1463] will not be managed by Spring
==>  Preparing: SELECT id,name,age,info FROM user
==> Parameters: 
<==    Columns: id, name, age, info
<==        Row: 1, xx, 30, <<BLOB>>
<==        Row: 2, xx, 30, <<BLOB>>
<==        Row: 3, xx, 30, <<BLOB>>
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27502e5c]
[User(id=1, name=xx, age=30, info=UserInfo(address=北京2, map={1=123}, dataVo=DataVo(num=222, map2={666=888}), aaa=null)), User(id=2, name=xx, age=30, info=UserInfo(address=北京1, map={1=123}, dataVo=DataVo(num=222, map2={666=888}), aaa=null)), User(id=3, name=xx, age=30, info=UserInfo(address=北京 5542, map={1=123}, dataVo=DataVo(num=222, map2={666=888}), aaa=null))]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12266084] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1839613624 wrapping com.mysql.cj.jdbc.ConnectionImpl@f1d1463] will not be managed by Spring
==>  Preparing: SELECT id, name, age, info FROM user
==> Parameters: 
<==    Columns: id, name, age, info
<==        Row: 1, xx, 30, <<BLOB>>
<==        Row: 2, xx, 30, <<BLOB>>
<==        Row: 3, xx, 30, <<BLOB>>
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12266084]
[User(id=1, name=xx, age=30, info=UserInfo(address=北京2, map={1=123}, dataVo=DataVo(num=222, map2={666=888}), aaa=null)), User(id=2, name=xx, age=30, info=UserInfo(address=北京1, map={1=123}, dataVo=DataVo(num=222, map2={666=888}), aaa=null)), User(id=3, name=xx, age=30, info=UserInfo(address=北京 5542, map={1=123}, dataVo=DataVo(num=222, map2={666=888}), aaa=null))]
2023-10-22 00:14:07.258  INFO 10232 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-10-22 00:14:07.274  INFO 10232 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

可见,业务层可以愉快的使用Entity了,完全不需要关心是不是自定义sql,完美支持json,这样子mysql和mongodb就是一模一样了,只不过是复杂的类型多了一个自定义的@MapData注解!!

总结:

1.增加字段发现确实是可以的,删除字段就报错,所以这也符合游戏的目标也就是不能删和改字段名字。

2.注意在Entity中给默认值,因为我们用的都是包装类型,使用xdb的经验告诉我,所有的数据要给默认值,Map类型也要初始化一下。


http://www.ppmy.cn/news/1170104.html

相关文章

YZ系列工具之YZ12:VBA_4种方法设计下拉列表

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

Ansible的debug模块和魔法变量介绍,fact变量采集和缓存相关操作演示

目录 一.debug模块的使用方法 1.帮助文档给出的示例 2.主要用到的参数 &#xff08;1&#xff09;msg&#xff1a;主要用这个参数来指定要输出的信息 &#xff08;2&#xff09;var&#xff1a;打印指定的变量&#xff0c;一般是通过register注册了的变量 &#xff08;3&…

如何利用示波器解析I2C数据

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘校园大使&#xff0c;湖南区域的日常实习&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &am…

2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

文章目录 一、实用工具类模块&#xff08;一&#xff09;功能 二、设计和封装&#xff08;一&#xff09;日志宏封装&#xff08;二&#xff09;mysql_util封装&#xff08;三&#xff09;Jsoncpp-API封装&#xff08;四&#xff09;file_util封装&#xff08;五&#xff09;st…

CUDA编程- __syncthreads()函数

基本概念 __syncthreads() 是CUDA编程中非常关键的一个同步原语。它的功能是确保在某个线程块中的所有线程在执行到这个函数之前都已完成它们之前的所有指令。一旦所有线程都到达这个同步点&#xff0c;它们才可以继续执行__syncthreads()之后的指令。这个函数只能在设备代码&…

Docker数据管理、端口映射、容器互联

目录 一、Docker 的数据管理&#xff1a; 1&#xff0e;数据卷&#xff1a; 1.1 宿主机目录/var/www/html 挂载到容器中的/data1&#xff1a; 1.2 测试&#xff1a; 2&#xff0e;数据卷容器&#xff1a; 2.1 创建一个容器作为数据卷容器&#xff1a; 2.2 挂载a1容器中的数据卷…

K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系

写在前面 前几天被问到&#xff0c;这里整理笔记之前也没怎么注意这个问题理解不足小伙伴帮忙指正 曾以为老去是很遥远的事&#xff0c;突然发现年轻是很久以前的事了。时光好不经用&#xff0c;抬眼已是半生&#xff0c;所谓的中年危机&#xff0c;真正让人焦虑的不是孤单、不…

Kotlin中的函数分类(顶层、成员、局部、递归等)

在 Kotlin 中&#xff0c;函数可以按照不同的方式进行分类。在本篇博客中&#xff0c;我们将介绍以下几种常见的函数分类&#xff0c;并提供示例代码进行演示。 顶层函数&#xff1a; 顶层函数是指定义在文件中的函数&#xff0c;不依赖于任何类或对象。它们可以在文件的任何…

分布式锁 - 理论篇

一、为什么需要分布式锁 二、分布式锁实现 1.分布式锁演进 - 基本原理 我们可以同时去一个地方“占坑”&#xff0c;如果占到&#xff0c;就执行逻辑。否则就必须等待&#xff0c;直到释放锁。“占坑”可以去redis&#xff0c;可以去数据库&#xff0c;可以去任何大家都能访…

YOLOv7-PTQ量化部署

目录 前言一、PTQ量化浅析二、YOLOv7模型训练1. 项目的克隆和必要的环境依赖1.1 项目的克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改模型配置文件3.2 修改数据配置文件3.3 训练模型3.4 mAP测试 三、…

LoadRunner录制脚本+编写脚本

LoadRunner安装* 为什么选择LoadRunner 1&#xff09;Jmeter没有录制功能 2&#xff09;可以设计非常非常丰富的测试场景 3&#xff09;LoadRunner能够产出非常丰富的测试报告 LoadRunner三大组件的关系 每个组件是干什么的 VUG&#xff1a;录制脚本&#xff0c;&#xff…

Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)

HSV通道的含义 HSV通道是指图像处理中的一种颜色模型&#xff0c;它由色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&#xff08;Value&#xff09;三个通道组成。色调表示颜色的种类&#xff0c;饱和度表示颜色的纯度或鲜艳程度&#xf…

百度松果20231022作业

越狱 盒子与球 斯特林第二类数&#xff08;用dp求&#xff09;*盒子的阶乘 int dp[11][11]; //n>k int A(int x){int res1;fer(i,2,x1)res*i;return res; } signed main(){IOS;dp[2][1]dp[2][2]dp[1][1]1;fer(i,3,11){dp[i][1]1;fer(j,2,i){dp[i][j]j*dp[i-1][j]dp[i-1][j-…

python 均值滤波

网上公开的均值滤波方法不能较好地对两端进行滤波(有边际效应&#xff0c;或者序列长度缩短)&#xff0c;于是自己写了一个可以对两端也进行滤波的函数 def meanfilt(x, N):x_pad np.r_[np.zeros(N-1), x]denominator np.r_[np.arange(1, N1), np.ones(len(x)-N)*N]win_sum …

详解使用sklearn实现一元线性回归和多元线性回归

[Open In Colab] 文章目录 1. 线性回归简介2. 使用sklearn进行一元线性回归3. 线性回归的coef_参数和intercept_参数4. 使用sklearn实现多元线性回归4.1 利用PolynomialFeatures构造输入4.2 进行多元线性回归 5. 总结 import numpy as np import matplotlib.pyplot as plt1. 线…

Java基础(第一期):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现

文章目录 IDEA1.1 IDEA概述1.2 IDEA的下载和安装1.2.1 下载1.2.2 安装 1.3 IDEA中层级结构介绍1.3.1 结构分类1.3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; …

靶机 DC-2

DC_2 信息搜集 存活检测 详细扫描 添加 host 后台网页扫描 网页信息搜集 主页面 找到 flag1&#xff0c;提示使用 cewl 密码生成工具 wp 登陆界面 使用 wpscan 扫描用户 wpscan --url http://dc-2/ --enumerate u 扫描出用户 tom、jerry、admin 将三个用户名写入文件中…

一文带你彻底弄懂ZGC

1 推荐的文章 1.1 必看 干掉1ms以内的Java垃圾收集器ZGC到底是个什么东西&#xff1f; 1.2 选看 ZGC有什么缺点? 2 疑问【皆来自上面两篇文章】 2.1 什么使得用户线程工作的同时&#xff0c;让垃圾收集器可以回收垃圾-读写屏障 ZGC (Z Garbage Collector) 和读写屏障: …

灵性·挖掘 3:自我迭代之路

灵性挖掘 3&#xff1a;自我迭代之路 你的观众只有一个&#xff0c;就是你自己不谈感受&#xff0c;只谈行动式感受熬竞争对手用力过猛会反杀自己。进入这种状态是无我的状态。 你的观众只有一个&#xff0c;就是你自己 我活着到底是为了干啥呢&#xff1f; 我吃喝玩乐好像也…

C#/.NET/.NET Core推荐学习书籍

前言 作为一名程序员&#xff0c;我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力。古人有云&#xff1a;“书中自有黄金屋&#xff0c;书中只有颜如玉”&#xff0c;说明了书籍的重要性&#xff0c;没错工作多年来&#xff0c;发现身边那些优秀的同事、大佬都…
最新文章