【java】【MyBatisPlus】【四】【完】MyBatisPlus一些实战总结(枚举、翻页、sql、组合条件、自增主键、逻辑删除)

目录

一、枚举

1、数据库type字段是Integer 类型枚举

2、创建一个该字段的枚举类 TypeEnum

 3、修改实体类

4、配置文件新增mybatis-plus的配置

5、检验:

5.1 查询显示

5.3 库里验证 

二、自增主键不是id字段处理

三、逻辑删除字段不是delete字段处理

1、实体加注解

2、yml配置文件新增配置

四、单表查询 

1、使用mybatis-plus自带的lambdaQueryWrapper条件进行查询

1.1 controller

1.2 servcie

1.3 serviceImpl

1.4 mapper

2、使用mybatis-plus自带的lambdaQueryWrapper条件进行+page进行分页查询

2.1 PageBean

2.2 controller

 2.3 service

2.4 servicrImpl

2.5 mapper

五、多表查询

1、使用sql语句进行多表查询

1.1 UserRoleDto接收返回数据

1.2 controller

1.3 service

1.4 servcieImpl

1.5 mapper

1.6 xml

2、翻页+组合条件查询

2.1 controller

2.2 service

2.3 serviceImpl

2.4 mapper

2.5 xml

六、事务处理

1、serviceImpl

2、yml配置事务日志

七、判重

1、数据库设置唯一判重

2、代码判重 

2.1 新增判重

2.2 修改判重


前言:项目实战过程当中,一些总结,例如枚举应用、翻页、单表、多表查询、翻页、自增主键、逻辑删除、判重等

 

一、枚举

1、数据库type字段是Integer 类型枚举

type字段 枚举用热类型:1-高温水;2-低温水;3-蒸汽;

2、创建一个该字段的枚举类 TypeEnum

package com.bocai.enums;


import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.*;

/**
 * a表的type字段 枚举用热类型:1-高温水;2-低温水;3-蒸汽;
 * 注意配置文件yml有配置
 */
@AllArgsConstructor
@NoArgsConstructor
@Getter
public enum TypeEnum {
    HIGHTEMPERATUREWATER(1,"高温水"),
    LOWTEMPERATUREWATER(2,"低温水"),
    STEAM(3,"蒸汽")
    ;

    @EnumValue //将注解标注的数值存储到数据库中
    private  Integer hottype;
    @JsonValue
    private  String desc;




}

上面2个注解很重要:@EnumValue //将注解标注的数值存储到数据库中

@JsonValue //在页面显示,不写这个就先森上面的枚举STEAM、LOWTEMPERATUREWATER、HIGHTEMPERATUREWATER

 3、修改实体类

package com.bocai.pojo;

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 java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

import com.bocai.enums.TypeEnum;
import lombok.Data;

/**
 * 
 * @TableName inhousing
 */
@TableName(value ="inhousing")
@Data
public class Inhousing implements Serializable {
    /**
     * 
     */
    @TableId(type = IdType.AUTO)
    private Integer uniqueid;
  

    /**
     * 用热类型:1-高温水;2-低温水;3-蒸汽;
     */
    private TypeEnum hottype;

   

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

4、配置文件新增mybatis-plus的配置

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true # 在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # ?????sql
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler  # 配置全局枚举处理器,好像还有说json的
  global-config:
    db-config:
      id-type: auto   # 数据库id生产规则全局 配置 # ASSIGN_ID雪花算法,数据库id建议使用Long类型
      logic-delete-field: deleted # 全局配置逻辑删除字段名
      logic-delete-value: 0 # 全局配置# 逻辑已删除值(默认为 1)这里因为我是反的所以改成0
      logic-not-delete-value: 1  # 逻辑未删除值(默认为 0)这里因为我是反的所以改成1
      # table-prefix: tbl_    # 数据库表前缀全局配置
    banner: false   # 关闭控制台mybatis-plus的logo
#  type-enums-package: com.bocai.enums   # 扫描通用枚举包 或者使用上面那个枚举全局配置

有两种方式:1、 default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler  # 配置全局枚举处理器,好像还有说json的

2、#  type-enums-package: com.bocai.enums   # 扫描通用枚举包 或者使用上面那个枚举全局配置

5、检验:

5.1 查询显示

5.3 库里验证 

二、自增主键不是id字段处理

@TableName(value ="user")
@Data
public class User implements Serializable {
    /**
     * 自增主键
     */
    @TableId(type = IdType.AUTO)
    private Integer uniqueid;

三、逻辑删除字段不是delete字段处理

1、实体加注解

   /**
     * 0不启用 1启用
     */
    @TableLogic
    private Boolean isenable;

2、yml配置文件新增配置

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true # 在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # ?????sql
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler  # 配置全局枚举处理器,好像还有说json的
  global-config:
    db-config:
      id-type: auto   # 数据库id生产规则全局 配置 # ASSIGN_ID雪花算法,数据库id建议使用Long类型
      logic-delete-field: deleted # 全局配置逻辑删除字段名
      logic-delete-value: 0 # 全局配置# 逻辑已删除值(默认为 1)这里因为我是反的所以改成0
      logic-not-delete-value: 1  # 逻辑未删除值(默认为 0)这里因为我是反的所以改成1
      # table-prefix: tbl_    # 数据库表前缀全局配置
    banner: false   # 关闭控制台mybatis-plus的logo
#  type-enums-package: com.bocai.enums   # 扫描通用枚举包 或者使用上面那个枚举全局配置

四、单表查询 

1、使用mybatis-plus自带的lambdaQueryWrapper条件进行查询

1.1 controller

package com.bocai.controller;

import com.bocai.common.Result;

import com.bocai.dto.UserRoleDto;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.User;
import com.bocai.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/niubi")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;


    /**
     * 查询全部用户--无翻页
     * @return
     */
    @GetMapping
    public Result list(){
        log.info("查询全部启用用户信息!");
        List<User> list = userService.userList();
        return Result.success(list);
    }
}

1.2 servcie

package com.bocai.service;


import com.bocai.dto.UserRoleDto;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.User;

import java.util.List;

/**
* @author cheng
* @description 针对表【user】的数据库操作Service
* @createDate 2023-11-07 14:52:28
*/
public interface UserService extends IService<User> {


    /**
     * 查询全部启用用户 ==无翻页
     * @return
     */
    List<User> userList();
}

1.3 serviceImpl

package com.bocai.service.impl;

import com.aliyun.oss.ServiceException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bocai.dto.UserRoleDto;

import com.bocai.mapper.UserRoleMapper;
import com.bocai.pojo.Emp;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.Role;
import com.bocai.pojo.User;
import com.bocai.service.UserService;
import com.bocai.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author cheng
* @description 针对表【user】的数据库操作Service实现
* @createDate 2023-11-07 14:52:28
*/
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
    implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserRoleMapper userRoleMapper;

    /**
     * 启用用户
     * @return
     */
    @Override
    public List<User> userList() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.select(User::getLoginname, User::getRealname, User::getIsenable);

        List<User> users = userMapper.selectList(lambdaQueryWrapper);

        return users;
    }

1.4 mapper

package com.bocai.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bocai.dto.UserRoleDto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bocai.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
* @author cheng
* @description 针对表【user】的数据库操作Mapper
* @createDate 2023-11-07 14:52:28
* @Entity com.bocai.pojo.User
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {}

2、使用mybatis-plus自带的lambdaQueryWrapper条件进行+page进行分页查询

2.1 PageBean

package com.bocai.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

/**
 * 分页查询结果封装类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {

    private Long total;//总记录数
    private List rows;//数据列表

}

新增一个PageBean来装载返回数据

2.2 controller

package com.bocai.controller;

import com.bocai.pojo.Emp;
import com.bocai.pojo.PageBean;
import com.bocai.common.Result;
import com.bocai.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;

@RestController
@RequestMapping("/emps")
@Slf4j
public class EmpController {
    @Autowired
    private EmpService empService;

    /**
     * 条件分页查询
     * @param page
     * @param pageSize
     * @param name
     * @param gender
     * @param begin
     * @param end
     * @return
     */
    @GetMapping
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize,
                       String name, Short gender,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
        log.info("分页查询参数:{}  {} {}  {}  {}  {}",page,pageSize,name,gender,begin,end);
        PageBean pageBean = empService.pageList(page,pageSize,name,gender,begin,end);
        return Result.success(pageBean);
    }
}

 2.3 service

package com.bocai.service;

import com.bocai.pojo.Emp;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bocai.pojo.PageBean;

import java.time.LocalDate;
import java.util.List;

/**
* @author cheng
* @description 针对表【emp(员工表)】的数据库操作Service
* @createDate 2023-10-31 10:44:06
*/
public interface EmpService extends IService<Emp> {

    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @return
     */
    PageBean pageList(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end);
}

2.4 servicrImpl

package com.bocai.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bocai.pojo.Emp;
import com.bocai.pojo.PageBean;
import com.bocai.service.EmpService;
import com.bocai.mapper.EmpMapper;
import com.bocai.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author cheng
* @description 针对表【emp(员工表)】的数据库操作Service实现
* @createDate 2023-10-31 10:44:06
*/
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp>
    implements EmpService{

    @Autowired
    private EmpMapper empMapper;

    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @param name
     * @param gender
     * @param begin
     * @param end
     * @return
     */
    @Override
    public PageBean pageList(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {
        LambdaQueryWrapper<Emp> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(StringUtils.isNotBlank(name),Emp::getName,name)
                .eq(gender != null,Emp::getGender,gender)
                .ge(begin != null,Emp::getEntrydate,begin)
                .le(end != null,Emp::getEntrydate,end);
        Page<Emp> pageEmp = new Page<>(page,pageSize);
        empMapper.selectPage(pageEmp,lambdaQueryWrapper);
        PageBean pageBean = new PageBean(pageEmp.getTotal(),pageEmp.getRecords());

        return pageBean;
    }
}

2.5 mapper

package com.bocai.mapper;

import com.bocai.pojo.Emp;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
* @author cheng
* @description 针对表【emp(员工表)】的数据库操作Mapper
* @createDate 2023-10-31 10:44:06
* @Entity com.bocai.pojo.Emp
*/
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {

}

五、多表查询

1、使用sql语句进行多表查询

1.1 UserRoleDto接收返回数据

package com.bocai.dto;

import com.bocai.pojo.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserRoleDto extends User {
    private String roleName;  //非user表字段
}

1.2 controller

package com.bocai.controller;

import com.bocai.common.Result;

import com.bocai.dto.UserRoleDto;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.User;
import com.bocai.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/niubi")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;



    /**
     * 查询全部用户--无翻页--- 使用sql以及指定显示字段
     * @return
     */
    @GetMapping("/sql")
    public Result listSql(){
        log.info("查询全部启用用户信息显示+sql多表!");
        List<UserRoleDto> list = userService.userSqlList();
        return Result.success(list);
    }

1.3 service

package com.bocai.service;


import com.bocai.dto.UserRoleDto;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.User;

import java.util.List;

/**
* @author cheng
* @description 针对表【user】的数据库操作Service
* @createDate 2023-11-07 14:52:28
*/
public interface UserService extends IService<User> {




    /**
     * 查询全部用户无翻页--("查询全部启用用户信息显示+sql多表!");
     * @return
     */
    List<UserRoleDto> userSqlList();
}

1.4 servcieImpl

package com.bocai.service.impl;

import com.aliyun.oss.ServiceException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bocai.dto.UserRoleDto;

import com.bocai.mapper.UserRoleMapper;
import com.bocai.pojo.Emp;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.Role;
import com.bocai.pojo.User;
import com.bocai.service.UserService;
import com.bocai.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author cheng
* @description 针对表【user】的数据库操作Service实现
* @createDate 2023-11-07 14:52:28
*/
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
    implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserRoleMapper userRoleMapper;

   

    /**
     * 查询全部用户无翻页--("查询全部启用用户信息显示+sql多表!");
     * @return
     */
    @Override
    public List<UserRoleDto> userSqlList() {
        List<UserRoleDto> UserRoleDto = userMapper.selectSqlList();
        return UserRoleDto;
    }
}

1.5 mapper

package com.bocai.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bocai.dto.UserRoleDto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bocai.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
* @author cheng
* @description 针对表【user】的数据库操作Mapper
* @createDate 2023-11-07 14:52:28
* @Entity com.bocai.pojo.User
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 使用sql多表联查
     * @return
     */
    List<UserRoleDto> selectSqlList();
}

1.6 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.bocai.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.bocai.pojo.User">
            <result property="uniqueid" column="uniqueId" jdbcType="INTEGER"/>
            <result property="administrationcode" column="administrationCode" jdbcType="VARCHAR"/>
            <result property="fixgroupid" column="fixGroupId" jdbcType="INTEGER"/>
            <result property="loginname" column="loginName" jdbcType="VARCHAR"/>
            <result property="password" column="password" jdbcType="CHAR"/>
            <result property="realname" column="realName" jdbcType="VARCHAR"/>     
            <result property="isspecial" column="isSpecial" jdbcType="BIT"/>
            <result property="isenable" column="isEnable" jdbcType="BIT"/>
  
    </resultMap>

    <sql id="Base_Column_List">
        uniqueId,
        loginName,password,realName,
        
    </sql>
    <select id="selectSqlList" resultType="com.bocai.dto.UserRoleDto">
        SELECT a.`realName`,a.`loginName`,c.`name` as roleName
        FROM USER a
        JOIN user_role b ON a.`uniqueId`=b.`userId`
        JOIN role c ON b.`roleId`=c.`uniqueId`
        WHERE a.`isEnable`='1';

    </select>


</mapper>

2、翻页+组合条件查询

2.1 controller

package com.bocai.controller;

import com.bocai.common.Result;

import com.bocai.dto.UserRoleDto;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.User;
import com.bocai.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/niubi")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;



    /**
     *  使用sql多表查询分页,带条件
     *      * @param page 第几页
     *      * @param pageSize 每页条数
     *      * @param realName 真实姓名
     *      * @param userLevel 用户级别
     * @return
     */
    @GetMapping("/sql/page")
    public Result listSqlPage(@RequestParam(defaultValue = "1") Integer page,
                              @RequestParam(defaultValue = "10") Integer pageSize,
                              String realName,Integer userLevel){
        log.info("查询全部启用用户信息显示+sql多表!翻页当前第{}页,每页{},姓名{},用户级别{}",page,pageSize,realName,userLevel);
        PageBean pageBean = userService.userSqlPageList(page,pageSize,realName,userLevel);
        return Result.success(pageBean);
    }
}

2.2 service

package com.bocai.service;


import com.bocai.dto.UserRoleDto;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.User;

import java.util.List;

/**
* @author cheng
* @description 针对表【user】的数据库操作Service
* @createDate 2023-11-07 14:52:28
*/
public interface UserService extends IService<User> {



    /**
     * 多表联查+翻页+条件查询+sql
     * @param page
     * @param pageSize
     * @param realName
     * @param userLevel
     * @return
     */
    PageBean userSqlPageList(Integer page, Integer pageSize,String realName,Integer userLevel);
}

2.3 serviceImpl

package com.bocai.service.impl;

import com.aliyun.oss.ServiceException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bocai.dto.UserRoleDto;

import com.bocai.mapper.UserRoleMapper;
import com.bocai.pojo.Emp;
import com.bocai.pojo.PageBean;
import com.bocai.pojo.Role;
import com.bocai.pojo.User;
import com.bocai.service.UserService;
import com.bocai.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author cheng
* @description 针对表【user】的数据库操作Service实现
* @createDate 2023-11-07 14:52:28
*/
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
    implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserRoleMapper userRoleMapper;


    /**
     * 多表联查+翻页+条件查询+sql
     * @param page
     * @param pageSize
     * @param realName
     * @param userLevel
     * @return
     */
    @Override
    public PageBean userSqlPageList(Integer page, Integer pageSize,String realName,Integer userLevel) {

        Page<UserRoleDto> pageUserRole = new Page<>(page,pageSize);
        userMapper.selectUserRoleDtoPage(pageUserRole,realName,userLevel);
        pageUserRole.getRecords();
        log.info("sss{},{},{},{},{}",pageUserRole.getTotal());
        PageBean pageBean = new PageBean(pageUserRole.getTotal(),pageUserRole.getRecords());
        return pageBean;
    }


}

2.4 mapper

package com.bocai.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bocai.dto.UserRoleDto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bocai.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
* @author cheng
* @description 针对表【user】的数据库操作Mapper
* @createDate 2023-11-07 14:52:28
* @Entity com.bocai.pojo.User
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {

   

    /**
     * 多表联查+翻页+条件查询+sql
     * @param pageUserRole
     * @param realName
     * @param userLevel
     * @return
     */
    Page<UserRoleDto>selectUserRoleDtoPage(Page<UserRoleDto> pageUserRole, String realName,Integer userLevel);


}

2.5 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.bocai.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.bocai.pojo.User">
            <result property="uniqueid" column="uniqueId" jdbcType="INTEGER"/>
            <result property="administrationcode" column="administrationCode" jdbcType="VARCHAR"/>
            <result property="fixgroupid" column="fixGroupId" jdbcType="INTEGER"/>
            <result property="loginname" column="loginName" jdbcType="VARCHAR"/>
            <result property="password" column="password" jdbcType="CHAR"/>
            <result property="realname" column="realName" jdbcType="VARCHAR"/>     
            <result property="isspecial" column="isSpecial" jdbcType="BIT"/>
            <result property="isenable" column="isEnable" jdbcType="BIT"/>
  
    </resultMap>

    <sql id="Base_Column_List">
        uniqueId,
        loginName,password,realName,
        
    </sql>
       <select id="selectUserRoleDtoPage" resultType="com.bocai.dto.UserRoleDto">
        SELECT a.uniqueid,a.`realName`,a.`loginName`,c.`name` as roleName
        FROM USER a
                 JOIN user_role b ON a.`uniqueId`=b.`userId`
                 JOIN role c ON b.`roleId`=c.`uniqueId`
        <where>a.`isEnable`='1'
            <if test="realName != null">
             and   a.realName like concat('%', #{realName}, '%')
            </if>
            <if test="userLevel != null">
            and a.userLevel=#{userLevel}
            </if>
        </where>

    </select>


</mapper>

六、事务处理

1、serviceImpl

    @Override
    @Transactional
    public void deleteById(Integer id) {

        userMapper.deleteById(id);
//        int i = 1/0;
        userMapper.updateUserById(id);


        Map<String, Object> map = new HashMap<>();
        map.put("userid",id);
        userRoleMapper.deleteByMap(map); //根据用户id删除用户与角色关系

    }

2、yml配置事务日志

#spring事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

七、判重

1、数据库设置唯一判重

2、代码判重 

2.1 新增判重


    /**
     * 新增角色
     * @param role
     */
    @Override
    public void addRole(Role role) {

        LambdaQueryWrapper<Role> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(role.getName() != null,Role::getName, role.getName());


        long count = roleMapper.selectCount(lambdaQueryWrapper);
        if (count > 0) {
            throw new ServiceException("该角色名已存在!");
        }
        role.setUpdatetime(LocalDateTime.now());
        role.setAdduserid(2);
        roleMapper.insert(role);

    }

2.2 修改判重

    /**
     * 修改角色
     * @param role
     */
    @Override
    public void alterUser(Role role) {

        LambdaQueryWrapper<Role> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(role.getName() != null,Role::getName, role.getName())
                .ne(role.getUniqueid() != null, Role::getUniqueid,role.getUniqueid());


        long count = roleMapper.selectCount(lambdaQueryWrapper);
        if (count > 0) {
            throw new ServiceException("该角色名已存在!");
        }
        role.setUpdatetime(LocalDateTime.now());
        roleMapper.updateById(role);
    }

注意这里有个自己跟自己判重的逻辑,使用了ne的方式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子 文章目录 [动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结 LCR 091. 粉刷房子 题目解析 (1) 一排房子&#xff0c;共有n个 (2) 染…

在任何机器人上实施 ROS 导航堆栈的指南

文章目录 路径规划参考 路径规划 路径规划是导航的最终目标。这允许用户向机器人给出目标姿势&#xff0c;并让它在给定的环境中自主地从当前位置导航到目标位置。这是我们迄今为止所做的一切&#xff08;地图绘制和本地化&#xff09;的汇集点。ROS 导航堆栈已经为我们完成了…

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…

Docker两个容器互相请求接口

BEGIN 环境&#xff1a;Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络&#xff0c;包括其ID、名称、驱动以及作用范围 在 Docker 中&#xff0c;容器通过 Docker 网络进行相互通信&#xff1b;在 Docker 中有…

第二十七章 解读Transformer_车道线检测中的Transformer(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 SE简单实现 class SELayer(nn.Module):d…

Invalid bound statement (not found)

说明&#xff1a;记录一次Mapper.xml调用数据库存储过程的错误&#xff1b; 报错信息&#xff1a;Invalid bound statement (not found)&#xff0c;Mapper的全限定类名 场景&#xff1a;我仔仔细细核对过了方法名&#xff0c;参数&#xff0c;都没有问题&#xff0c;使用插件…

基于 HarmonyOS 的 HTTPS 请求过程开发示例(ArkTS)

介绍 本篇 Codelab 基于网络模块以及 Webview 实现一次 HTTPS 请求&#xff0c;并对其过程进行抓包分析。效果如图所示&#xff1a; 相关概念 ● Webview&#xff1a;提供 Web 控制能力&#xff0c;Web 组件提供网页显示能力。 ● HTTP数据请求&#xff1a;网络管理模块&am…

开发知识点-Django

Django 1 了解简介2 Django项目结构3 url 地址 和视图函数4 路由配置5 请求及响应6 GET请求和POST请求查询字符串 7 Django设计模式及模板层8 模板层-变量和标签9 模板层-过滤器和继承继承 重写 10 url反向解析11 静态文件12 Django 应用及分布式路由创建之后 注册 一下 13 模型…

力扣每日一题 ---- 2905. 找出满足差值条件的下标 II

这道题带有绝对值差的题&#xff0c;一看就是双指针的题&#xff0c;并且还带有两个限制&#xff0c;那么我们的做法就是 固定一个条件&#xff0c;维护一个条件 本题还用到了一个贪心思路&#xff0c;会介绍到 那我们怎么固定一个条件&#xff0c;维护一个条件&#xff1f; …

基于ssm的大学生社团管理系统

基于ssm的大学生社团管理系统 摘要 基于SSM的大学生社团管理系统是一个全面、高效的社团管理平台&#xff0c;旨在帮助大学生和社团管理员更方便、更快捷地进行社团活动的组织和管理。该系统基于Spring、SpringMVC和MyBatis&#xff08;简称SSM&#xff09;开发&#xff0c;这三…

CentOS Linux 系统镜像

CentOS Linux具有以下特点&#xff1a; 稳定性&#xff1a;CentOS Linux旨在提供一个稳定、可靠的服务器环境&#xff0c;适合用于关键业务应用和生产环境。高效性&#xff1a;CentOS Linux经过优化和调整&#xff0c;可以充分发挥硬件的性能&#xff0c;提高系统的整体效率。…

selenium自动化测试入门 —— 键盘鼠标事件ActionChains

在使用 Selenium WebDriver 做自动化测试的时候&#xff0c;会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作&#xff1b;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中&#xff0c;有一个专门的类来负责实现这些测试场…

DevChat:提升编程效率的AI编程助手

一、DevChat是什么&#xff1f; DevChat是一个集成了多种主流大模型的AI编程工具&#xff0c;专注于提升程序员的编程效率。它整合了ChatGPT、Codex等热门AI大模型&#xff0c;支持自然语言编程、代码编写、代码生成、代码补全等功能。DevChat最大的优势是一站式服务&#xff…

掌握未来技术趋势:深度学习与量子计算的融合

掌握未来技术趋势&#xff1a;深度学习与量子计算的融合 摘要&#xff1a;本博客将探讨深度学习与量子计算融合的未来趋势&#xff0c;分析这两大技术领域结合带来的潜力和挑战。通过具体案例和技术细节&#xff0c;我们将一睹这两大技术在人工智能、药物研发和金融科技等领域…

【HarmonyOS】HarmonyOS Test测试用例中一些断言API的使用

【关键词】 单元测试框架、HarmonyOS Test、assertThrowError、assertFail、assertEqual 【测试代码及测试结果展示】 这里以新建API9工程自动生成的ohosTest来编写单元测试代码。 1、 测试代码&#xff1a; import { describe, it, expect } from ohos/hypium import abil…

Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH

环境: Win10 专业版 自制小程序 问题描述: Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH 解决方案: 在执行本程序前需要以管理员身份运行!关闭杀毒软件,否则会失败,本方案只能在个人电脑测试体验, 只能用于学习测试体验 ,勿用与商业行为 1.先完全JH…

Hadoop 视频分析系统

视频分析系统 业务流程 原始数据 vedio.json {"rank":1,"title":"《逃出大英博物馆》第二集","dzl":"77.8","bfl":"523.9","zfl":"39000","type":"影视",&quo…

强化学习中广义策略迭代

一、广义策略迭代 策略迭代包括两个同时进行的交互过程&#xff0c;一个使价值函数与当前策略保持一致&#xff08;策略评估&#xff09;&#xff0c;另一个使策略在当前价值函数下变得贪婪&#xff08;策略改进&#xff09;。在策略迭代中&#xff0c;这两个过程交替进行&…

汽车之家车型_车系_配置参数数据抓取

// 导入所需的库 #include <iostream> #include <fstream> #include <string> #include <curl/curl.h> #include <regex>// 声明全局变量 std::string htmlContent; std::regex carModelRegex("\\d{4}-\\d{2}-\\d{2}"); std::regex ca…

matlab 点云最小二乘拟合平面(PCA法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 见:matlab 点云最小二乘拟合平面(PCA法详细过程版)。 二、代码实现 clc;clear; %% --------