Mybatis多对多,复杂增删改查(特殊需求循环插入,分组查询)

2021.8.31
从25号开始练习复杂的mybatis多对多,从设计数据库思路到实现需求功能转移到实体项目中
1.之前很少看过字符转换的详细内容从今往后会注意字符串转换此项目为转数组(date)实体项目会有UUID生成的字符串
2.在添加时如果原表设计的首个id是自动增长的,在xml中要设置是否使用jdbc的getGenerateKeys方法获取主键并赋值到keyProperty设置的主键字段中将要插入字段对应的生成的id抽出来
3.@service中如果中间表角色id不想用逗号的形式要做循环插入数据
4.修改多表连接的中间表 因为是1-2 2-3的形式不能做修改只能删除干净后重新插入新数据

表结构
在这里插入图片描述
实体类Entity—user

package com.example.unicom.entity;import lombok.Data;@Data
public class User {private Integer id;private String name;private String phone;private Integer age;private String sex;private String date;private String name1;private String js_id;
}

Entity—js(死表)

package com.example.unicom.entity;import lombok.Data;@Data
public class Js {private Integer id;private String name;private String date;
}

Entity—user_role

package com.example.unicom.entity;import lombok.Data;@Data
public class UserJs {private Integer id;private Integer id1;private Integer user_id;private String js_id;
}

UsrtController

package com.example.unicom.controller;import com.example.unicom.entity.User;
import com.example.unicom.entity.base.GeneralResponse;import com.example.unicom.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author 孙翊轩* @since 2021-08-25*/
@RestController
@RequestMapping("/isp/unicom/user")
public class UserController {@Autowiredprivate UserService userService;
//    @Autowired
//    private UserJsService userJsService;@RequestMapping(value = "selectUser",method = RequestMethod.GET)public GeneralResponse selectUser(){try{List<User>userList=userService.selectUser();return new GeneralResponse("SUCCESS","查询成功",userList);}catch (Exception e){e.printStackTrace();}return new GeneralResponse("FAIL","查询失败",null);}@RequestMapping(value ="addUser" ,method =RequestMethod.POST )public GeneralResponse addUser(@RequestBody User user){try{userService.addUser(user);return new GeneralResponse("SUCCESS","添加成功",null);}catch (Exception e) {e.printStackTrace();return new GeneralResponse("FAIL","添加失败",null);}}@RequestMapping(value = "updateUser",method = RequestMethod.GET)public GeneralResponse updateUser(@RequestBody User user){try{userService.updateUser(user);return new GeneralResponse("SUCCESS","修改成功",null);}catch (Exception e){e.printStackTrace();}return new GeneralResponse("FAIL","修改失败",null);}@RequestMapping(value = "deleteUser",method = RequestMethod.GET)public GeneralResponse deleteUser(@RequestBody User user){try{userService.deleteUser(user);return new GeneralResponse("SUCCESS","删除成功",null);}catch (Exception e){e.printStackTrace();}return new GeneralResponse("FAIL","删除失败",null);}
}

UserService接口

package com.example.unicom.service;import com.example.unicom.entity.User;
import com.example.unicom.entity.base.GeneralResponse;
import org.springframework.stereotype.Repository;import java.util.List;public interface UserService {List<User> selectUser();GeneralResponse addUser(User user);GeneralResponse updateUser(User user);GeneralResponse deleteUser(User user);
}

@Service业务层 UserServiceImpl

package com.example.unicom.service.impl;import com.example.unicom.entity.User;
import com.example.unicom.entity.UserJs;
import com.example.unicom.entity.base.GeneralResponse;
import com.example.unicom.mapper.JsMapper;
import com.example.unicom.mapper.UserJsMapper;
import com.example.unicom.mapper.UserMapper;
import com.example.unicom.service.JsService;
import com.example.unicom.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate UserJsMapper userJsMapper;@Overridepublic List<User> selectUser() {List<User>userList=userMapper.selectUser();return userList;}@Transactional@Overridepublic GeneralResponse addUser(User user) {userMapper.addUser(user);String[] arr=user.getJs_id().split(",");UserJs userjs=new UserJs();for (int i = 0; i < arr.length; i++) {userjs.setUser_id(user.getId());userjs.setJs_id(arr[i]);userJsMapper.addUserJs(userjs);}return null;}@Overridepublic GeneralResponse updateUser(User user) {userMapper.updateUser(user);userJsMapper.deleteUserJs(user.getId());UserJs userjs=new UserJs();String[] arr=user.getJs_id().split(",");for (int i = 0; i < arr.length; i++) {userjs.setUser_id(user.getId());userjs.setJs_id(arr[i]);userJsMapper.addUserJs(userjs);}return null;}@Overridepublic GeneralResponse deleteUser(User user) {userMapper.deleteUser(user);userJsMapper.deleteUserJs(user.getId());return null;}
}

UserMapper口

package com.example.unicom.mapper;import com.example.unicom.entity.User;
import com.example.unicom.entity.UserJs;
import com.example.unicom.entity.base.GeneralResponse;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface UserMapper {List<User> selectUser();void addUser(User user);void updateUser(User user);void deleteUser(User user);void addJsId(Integer id, int roleId);
}

UserMapper.xml映射

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.unicom.mapper.UserMapper"><select id="selectUser" resultType="com.example.unicom.entity.User">SELECT u.id,u.`name`,u.age,u.phone,u.sex,GROUP_CONCAT(j.`name` )as name1,j.dateFROM `user` AS uLEFT JOIN  user_js AS uj ON u.id=uj.user_idLEFT JOIN js AS J ON J.id=uj.js_idGROUP BY u.id</select><insert id="addUser" parameterType="com.example.unicom.entity.User" useGeneratedKeys="true" keyProperty="id"keyColumn="id">insert into user<trim prefix="(" suffix= ")" suffixOverrides=","><if test="name !=null">name,</if><if test="phone !=null">phone,</if><if test="age !=null">age,</if><if test="sex !=null">sex,</if><if test="date !=null">date,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id !=null">#{id,jdbcType=INTEGER},</if><if test="name !=null">#{name,jdbcType=VARCHAR},</if><if test="phone !=null">#{phone,jdbcType=VARCHAR},</if><if test="age !=null">#{age,jdbcType=INTEGER},</if><if test="sex !=null">#{sex,jdbcType=VARCHAR},</if><if test="date !=null">#{date,jdbcType=VARCHAR},</if></trim></insert><update id="updateUser" parameterType="com.example.unicom.entity.User">update user set name=#{name} ,phone=#{phone},age=#{age},sex=#{sex},date=#{date}where id = #{id}</update><delete id="deleteUser" parameterType="com.example.unicom.entity.User">delete from user where id=#{id};</delete>
</mapper>

中间需要多对多操作所以展示中间表(逻辑外键关联非绑定)的映射内容)**

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.unicom.mapper.UserJsMapper"><insert id="addUserJs" parameterType="com.example.unicom.entity.UserJs">insert into user_js(user_id,js_id) values (#{user_id},#{js_id})</insert><update id="delete" parameterType="com.example.unicom.entity.UserJs">delete from user_js where user_id=#{user_id}insert into user_js (js_id) values (#{js_id});</update><delete id="deleteUserJs" parameterType="com.example.unicom.entity.UserJs">delete from user_js where user_id=#{user_id}</delete>
</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes mysql pxc_K8S使用operator部署和管理Percona - PXC集群

概述pxc为mysql的一种集群模型&#xff0c;我们结合operator和k8s 完成pxc的部署和扩容硬盘使用local卷&#xff0c;如何管理local卷请翻阅 我的另一篇文章https://www.jianshu.com/p/bfa204cef8c0英文文档详情 https://percona.github.io/percona-xtradb-cluster-operator/con…

Springboot递归树(需求返回List树状结构数据)

一、本主的应用场景 部门里面有一个属性是当前部门的上级部门&#xff0c;而当前部门又会有下级部门&#xff0c;下级部门还有下级部门&#xff0c;这就形成了一个向下无限循环&#xff0c;呈现出树状结构。 二、认识JSONObject JSONObject只是一种数据结构&#xff0c;可以理…

data-role参数表:

data-role参数表&#xff1a; data-role参数表&#xff1a; page 页面容器&#xff0c;其内部的mobile元素将会继承这个容器上所设置的属性 header 页面标题容器&#xff0c;这个容器内部可以包含文字、返回按钮、功能按钮等元素 footer 页面页脚容器&#x…

hubbledotnet mysql_HubbleDotNet 简介

系统简介HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件。开源协议是 Apache 2.0。HubbleDotNet提供了基于SQL的全文检索接口&#xff0c;使用者只需会操作SQL&#xff0c;就可以很快学会使用HubbleDotNet进行全文检索。 HubbleDotNet可以实现全文索引…

浅谈从学校(培训机构)跳跃到企业初/中级java开发工程师的学习路线(由浅入深)

1.先别学SSM&#xff0c;也别学Mybatis ,直接百度SpringBoot 为什么学它呢&#xff0c;简单&#xff0c;还有你要用到的几乎所有框架都可以以最简单的模式去学习&#xff0c;比如mybatis。 springboot天然集成了你在校学习的ssm以及任何你需要用到的东西&#xff0c;真正意义…

interface接口_接口 interface

接口不是类&#xff0c;而是对类的一组需求描述。Arrays类中的sort方法承诺可以对对象数组进行排序&#xff0c;但要求满足下列条件&#xff1a;对象所属的类必须实现了Comparable接口。public interface Comparable {int compareTo(Object other); }Java SE5.0&#xff0c;Com…

代码视图与StoryBoard.Xib文件视图的跳转

在storyboard中拖拽的控件,当我们使用纯代码进行编写的时候,进行跳转的时候用我们平时用的[self.navigationController popToViewController:Vc animated:YES], 你会发现跳转的后出现的页面只有你用用纯代码写的,而storyboard中的没有,这时候我们使用这个方法还是比较简单不能实…

influxdb mysql对比_InfluxDB读写性能测试

这里将告诉您InfluxDB读写性能测试,教程操作步骤:今天进行了InfluxDB和MySQL的对比测试&#xff0c;这里记录下结果&#xff0c;也方便我以后查阅。操作系统&#xff1a; CentOS6.5_x64InfluxDB版本 &#xff1a; v1.1.0MySQL版本&#xff1a;v5.1.73CPU &#xff1a; Intel(R)…

Nginx windows安装部署

一、Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的. 它也是一种轻量级的Web服务器…

前端学习(1514):vue-router使用步骤

<!-- 1引入插件的js --> <!-- 2设置链接 --> <!-- 3设立容器部分 --> <!-- 4提供要渲染的组件 --> <!-- 5配置路由 --> <!-- 6挂载路由 --> <!DOCTYPE html> <html lang"en"><head><meta charset"UT…

1024电商项目的邮箱验证码与图形验证码功能模块

项目基于springcloudalibaba&#xff0c;模块功能大致概括就是登录页面的时候先完成图形验证码的校验&#xff0c;输入的数字和字母与图片上的相对应之后&#xff0c;会向对应的邮箱或手机号发送邮箱/短信验证码二次验证。这里展示的是邮箱验证码。 用到的技术点有&#xff1a…

Android自己的自动化测试Monkeyrunner和用法示例

眼下android SDK在配有现成的测试工具monkey 和 monkeyrunner两。也许我们不看一样的兄弟名字。但事实是完全跑了两个完全不同的工具。在测试的不同区域的应用程序。总体&#xff0c;monkey主要用于压力和可靠性测试&#xff0c;拟键盘事件流。而且能够自定义发送的次数&#x…

内存大对象dump linux_在 Linux 上创建并调试转储文件 | Linux 中国

了解如何处理转储文件将帮你找到应用中难以重现的 bug。• 来源&#xff1a;linux.cn • 作者&#xff1a;Stephan Avenwedde • 译者&#xff1a;Xingyu.Wang •(本文字数&#xff1a;5501&#xff0c;阅读时长大约&#xff1a;6 分钟)崩溃转储、内存转储、核心转储、系统转储…

爬虫用mysql存储还是mongodb_【面试题】Mongodb和MySQL存储爬虫数据的特点是什么?...

(1)问题分析面试官主要考核Mongodb和MySQL数据库的特点&#xff0c;以及关系型与非关系型数据库。(2)核心问题讲解MySQL属于关系型数据库&#xff0c;它具有以下特点&#xff1a;在不同的引擎上有不同的存储方式。查询语句是使用传统的sql语句&#xff0c;拥有较为成熟的体系&a…

mysql originator_MySQL数据库事件调度(Event)

4.创建事件调度每5秒在表中插入数据MySQL> create event if not exists event_t1 on schedule every 5 second do insert into t values(1,1,sysdate());Query OK, 0 rows affected (0.01 sec)mysql> select * from t; --查看事件执行数据-------------------…

前端学习(1520):vue-router嵌套路由

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title></head> <!-- 1引入…

python与sql连接不上_Python连接不上SQL Server的两种根治思路

连接不上数据库&#xff0c;首先可以排除是代码的问题&#xff0c;连接方式都是千篇一律的。大多数问题都是本机的两个原因造成的&#xff0c;1.服务没有开启,2.没有启动SQL配置的TCP/IP下面给出统一解决方案&#xff1a;首先从开始菜单找到SQL数据库的配置工具&#xff0c;比如…