Free MyBatis Tool插件的进阶使用指南(消灭dao层的繁琐编码)

目录

  • 零、起因
  • 一、怎么使用Free MyBatis Tool插件?
    • 1 基本使用
    • 2 进阶使用(搞清楚Options的用法)
      • 2.1 概览
      • 2.2 详述
        • 2.2.0 Options(一项都不勾选)
        • 2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】
        • 2.2.2 Comment(实体注释)【和“2.2.1”相比,没任何变化...】
        • 2.2.3 Use-Schema(使用Schema前缀)【和“2.2.1”相比,没任何变化...】
        • 2.2.4 Overwrite-Java【和“2.2.1”相比,没任何变化...】
        • 2.2.5 Overwrite-Xml【和“2.2.1”相比,没任何变化...】
        • 2.2.6 Repository-Annotation(Repository注解)【在UserMapper.java中打上@Repository注解】
        • 2.2.7 toString/hashCode/equals【给UserDO增加这些方法】
        • 2.2.8 Parent-Interface(Dao公共父接口)【别勾选这个!】
        • 2.2.9 JSR310:Date and Time API【UserDO的Date会变成LocalDateTime】
        • 2.2.10 JPA-Annotation(JPA注解)【UserDO会带上JPA注解】
        • 2.2.11 Actual-Column(实际的列名)【UserDO字段名和表的列名一致】
        • 2.2.12 Use-Alias(启用别名查询)【UserMapper.xml的列名会发生变化】
        • 2.2.13 Use-Example【别勾选这个!】
        • 2.2.14 Page(分页,需开启Use-Example)【自己实现分页吧,别勾选这个!】
        • 2.2.15 Add-ForUpdate(需开启Use-Example)【自己实现悲观锁吧,别勾选这个!】
      • 2.3 结论【推荐勾选哪些呢?】

零、起因

  • 后端开发少不了设计表(例如:xxx表)。
  • 设计好表后,少不了需要去实现xxxDO、xxxMapper.java、xxxMapper.xml(ORM框架选Mybatis的情况)。
    • 这些都是模板代码,让人来写真费劲啊! 【问题】
  • 【解决办法】:利用“Free MyBatis Tool插件”消灭dao层的繁琐编码。
    在这里插入图片描述

一、怎么使用Free MyBatis Tool插件?

1 基本使用

在这里插入图片描述

  • Options中那么多选项,具体是啥意思?

2 进阶使用(搞清楚Options的用法)

2.1 概览

  • Use-Lombok
  • Comment(实体注释)
  • Use-Schema(使用Schema前缀)
  • Overwrite-Java
  • Overwrite-Xml
  • Repository-Annotation(Repository注解)
  • toString/hashCode/equals
  • Parent-Interface(Dao公共父接口)
  • JSR310:Date and Time API
  • JPA-Annotation(JPA注解)
  • Actual-Column(实际的列名)
  • Use-Alias(启用别名查询)
  • Use-Example
  • Page(分页,需开启Use-Example)
  • Add-ForUpdate(需开启Use-Example)

2.2 详述

2.2.0 Options(一项都不勾选)
  • UserDO
package com.forrest.demo.model;

import java.io.Serializable;
import java.util.Date;

/**
 * user
 */
public class UserDO implements Serializable {
    private Integer id;

    private String username;

    private String passwordHash;

    private String email;

    private Date registrationDate;

    private Date lastLoginTime;

    private static final long serialVersionUID = 1L;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPasswordHash() {
        return passwordHash;
    }

    public void setPasswordHash(String passwordHash) {
        this.passwordHash = passwordHash;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getRegistrationDate() {
        return registrationDate;
    }

    public void setRegistrationDate(Date registrationDate) {
        this.registrationDate = registrationDate;
    }

    public Date getLastLoginTime() {
        return lastLoginTime;
    }

    public void setLastLoginTime(Date lastLoginTime) {
        this.lastLoginTime = lastLoginTime;
    }
}
  • UserMapper.java
package com.forrest.demo.dao;

import com.forrest.demo.model.UserDO;

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(UserDO record);

    int insertSelective(UserDO record);

    UserDO selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(UserDO record);

    int updateByPrimaryKey(UserDO record);
}
  • 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.forrest.demo.dao.UserMapper">
  <resultMap id="BaseResultMap" type="com.forrest.demo.model.UserDO">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password_hash" jdbcType="VARCHAR" property="passwordHash" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="registration_date" jdbcType="TIMESTAMP" property="registrationDate" />
    <result column="last_login_time" jdbcType="TIMESTAMP" property="lastLoginTime" />
  </resultMap>
  <sql id="Base_Column_List">
    id, username, password_hash, email, registration_date, last_login_time
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from user
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from user
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.forrest.demo.model.UserDO" useGeneratedKeys="true">
    insert into user (username, password_hash, email, 
      registration_date, last_login_time)
    values (#{username,jdbcType=VARCHAR}, #{passwordHash,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, 
      #{registrationDate,jdbcType=TIMESTAMP}, #{lastLoginTime,jdbcType=TIMESTAMP})
  </insert>
  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.forrest.demo.model.UserDO" useGeneratedKeys="true">
    insert into user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="username != null">
        username,
      </if>
      <if test="passwordHash != null">
        password_hash,
      </if>
      <if test="email != null">
        email,
      </if>
      <if test="registrationDate != null">
        registration_date,
      </if>
      <if test="lastLoginTime != null">
        last_login_time,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="username != null">
        #{username,jdbcType=VARCHAR},
      </if>
      <if test="passwordHash != null">
        #{passwordHash,jdbcType=VARCHAR},
      </if>
      <if test="email != null">
        #{email,jdbcType=VARCHAR},
      </if>
      <if test="registrationDate != null">
        #{registrationDate,jdbcType=TIMESTAMP},
      </if>
      <if test="lastLoginTime != null">
        #{lastLoginTime,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.forrest.demo.model.UserDO">
    update user
    <set>
      <if test="username != null">
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="passwordHash != null">
        password_hash = #{passwordHash,jdbcType=VARCHAR},
      </if>
      <if test="email != null">
        email = #{email,jdbcType=VARCHAR},
      </if>
      <if test="registrationDate != null">
        registration_date = #{registrationDate,jdbcType=TIMESTAMP},
      </if>
      <if test="lastLoginTime != null">
        last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.forrest.demo.model.UserDO">
    update user
    set username = #{username,jdbcType=VARCHAR},
      password_hash = #{passwordHash,jdbcType=VARCHAR},
      email = #{email,jdbcType=VARCHAR},
      registration_date = #{registrationDate,jdbcType=TIMESTAMP},
      last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>
2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】
  • 看了“2.2.0”很自然就知道Use-Lombok的好处了:可以消除UserDO中的getter和setter代码
  • UserDO
/**
 * user
 */
@Data
public class UserDO implements Serializable {
    private Integer id;

    private String username;

    private String passwordHash;

    private String email;

    private Date registrationDate;

    private Date lastLoginTime;

    private static final long serialVersionUID = 1L;
}
  • UserMapper.java
    • 没变化,和“2.2.0”一样
  • UserMapper.xml
    • 没变化,和“2.2.0”一样
2.2.2 Comment(实体注释)【和“2.2.1”相比,没任何变化…】
  • 我以为会给UserDO增加注释…但并没有。
  • 和“2.2.1”相比,没任何变化…
2.2.3 Use-Schema(使用Schema前缀)【和“2.2.1”相比,没任何变化…】
  • 在“2.2.2”基础上没有增加任何内容。
  • 这个Schema可以被简单理解为user表在哪个数据库中。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
2.2.4 Overwrite-Java【和“2.2.1”相比,没任何变化…】
  • 即使已经有UserDO.java和UserMapper.java了,让开发者选择是否覆写这两个文件。
    在这里插入图片描述
2.2.5 Overwrite-Xml【和“2.2.1”相比,没任何变化…】
  • 同理,即使已经有UserMapper.xml了,让开发者选择是否覆写这个xml文件。
2.2.6 Repository-Annotation(Repository注解)【在UserMapper.java中打上@Repository注解】
  • 在UserMapper.java中打上@Repository注解。
    在这里插入图片描述
2.2.7 toString/hashCode/equals【给UserDO增加这些方法】
  • 给UserDO增加toString/hashCode/equals方法:
package com.forrest.demo.model;

import java.io.Serializable;
import java.util.Date;
import lombok.Data;

/**
 * user
 */
@Data
public class UserDO implements Serializable {
	...

    @Override
    public boolean equals(Object that) {
        if (this == that) {
            return true;
        }
        if (that == null) {
            return false;
        }
        if (getClass() != that.getClass()) {
            return false;
        }
        UserDO other = (UserDO) that;
        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
            && (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))
            && (this.getPasswordHash() == null ? other.getPasswordHash() == null : this.getPasswordHash().equals(other.getPasswordHash()))
            && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail()))
            && (this.getRegistrationDate() == null ? other.getRegistrationDate() == null : this.getRegistrationDate().equals(other.getRegistrationDate()))
            && (this.getLastLoginTime() == null ? other.getLastLoginTime() == null : this.getLastLoginTime().equals(other.getLastLoginTime()));
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());
        result = prime * result + ((getPasswordHash() == null) ? 0 : getPasswordHash().hashCode());
        result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode());
        result = prime * result + ((getRegistrationDate() == null) ? 0 : getRegistrationDate().hashCode());
        result = prime * result + ((getLastLoginTime() == null) ? 0 : getLastLoginTime().hashCode());
        return result;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", username=").append(username);
        sb.append(", passwordHash=").append(passwordHash);
        sb.append(", email=").append(email);
        sb.append(", registrationDate=").append(registrationDate);
        sb.append(", lastLoginTime=").append(lastLoginTime);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }
}
  • @Data注解会自动生成一个类的toString、hashCode和equals方法。**因此,没必要勾选“toString/hashCode/equals”。**即使有特殊需求,也是自己去覆写这些方法,而不是用“Free MyBatis Tool插件”生成的。
2.2.8 Parent-Interface(Dao公共父接口)【别勾选这个!】
  • UserMapper.java
package com.forrest.demo.dao;

import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper {
}
  • MyBatisBaseDao
package com.forrest.demo.dao;

import java.io.Serializable;
import java.util.List;
import org.apache.ibatis.annotations.Param;

/**
 * DAO公共基类,由MybatisGenerator自动生成请勿修改
 * @param <Model> The Model Class 这里是泛型不是Model类
 * @param <PK> The Primary Key Class 如果是无主键,则可以用Model来跳过,如果是多主键则是Key类
 * @param <E> The Example Class
 */
public interface MyBatisBaseDao<Model, PK extends Serializable, E> {
    int deleteByPrimaryKey(PK id);

    int insert(Model record);

    int insertSelective(Model record);

    Model selectByPrimaryKey(PK id);

    int updateByPrimaryKeySelective(Model record);

    int updateByPrimaryKey(Model record);
}
  • 很显然,别勾选“Parent-Interface(Dao公共父接口)”
2.2.9 JSR310:Date and Time API【UserDO的Date会变成LocalDateTime】
  • UserDO的变化
    在这里插入图片描述
  • 对比“2.2.1”,UserMapper.java和UserMapper.xml没变化。
  • JSR-310: Date and Time APIJava 8中引入的一个新日期和时间API,它提供了一系列用于日期、时间、时区和时钟的类和接口。这个API旨在解决旧版Date和Calendar类存在的问题,并提供了更加易用、更加强大、类型安全的日期和时间操作。

在使用Free MyBatis Tool插件时,如果选择了支持JSR-310,插件会根据这个新的日期时间API生成相应的代码。这意味着在xxxDO和Mapper接口日期时间字段将会使用JSR-310中的类,例如LocalDate、LocalTime、LocalDateTime、ZonedDateTime等,而不是Java 7及以前版本中使用的java.util.Date或java.sql.Date。

  • 按理来说,应该勾选“JSR310:Date and Time API”。但实际开发中,不少字段仍然用的是Date… (如果自己没有决策权,也只能被迫用Date,懂的都懂:))
2.2.10 JPA-Annotation(JPA注解)【UserDO会带上JPA注解】
  • UserDO会带上JPA注解:
package com.forrest.demo.model;

import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;

/**
 * user
 */
@Table(name="user")
@Data
public class UserDO implements Serializable {
    @Id
    @GeneratedValue
    @GeneratedValue(generator = "JDBC")
    private Integer id;

    @NotEmpty
    private String username;

    @NotEmpty
    private String passwordHash;

    @NotEmpty
    private String email;

    private LocalDateTime registrationDate;

    private LocalDateTime lastLoginTime;

    private static final long serialVersionUID = 1L;
}
  • 对比“2.2.9”,UserMapper.java和UserMapper.xml没变化。

JPA(Java Persistence API)是Java持久化API的简称,它是Java EE规范的一部分,旨在简化Java对象和关系数据库之间的映射和持久化操作。

实际开发中,我咋很少见到JPA注解…

2.2.11 Actual-Column(实际的列名)【UserDO字段名和表的列名一致】
  • UserDO字段名和表的列名一致:
    在这里插入图片描述

类似的,在UserMapper.xml和UserMapper.java中,也从passwordHash变成了password_hash(其他字段同理)。

  • 但这显然不符合Java命名习惯,因此,不要勾选“Actual-Column(实际的列名)”。
2.2.12 Use-Alias(启用别名查询)【UserMapper.xml的列名会发生变化】
  • UserMapper.xml的列名会发生变化:
    在这里插入图片描述
  • 一般来说,如果是单表查询,我们是不需要这么写的:select user.id from user where id = 1;。因此,没必要勾选“Use-Alias(启用别名查询)”。
2.2.13 Use-Example【别勾选这个!】
  • 会增加一个UserDOExample
public class UserDOExample {
    protected String orderByClause;

    protected boolean distinct;

    protected List<Criteria> oredCriteria;	
    ...
}
  • UserMapper.java会这么写:
public interface UserMapper {
    long countByExample(UserDOExample example);

    int deleteByExample(UserDOExample example);

    int deleteByPrimaryKey(Integer id);
    ...
}

只能说…别勾选这个!

2.2.14 Page(分页,需开启Use-Example)【自己实现分页吧,别勾选这个!】
2.2.15 Add-ForUpdate(需开启Use-Example)【自己实现悲观锁吧,别勾选这个!】

2.3 结论【推荐勾选哪些呢?】

  • 打开设置,如下图所示:
    在这里插入图片描述
  • 此外,我觉得生成的UserMapper.java中的方法命名不符合习惯,还得自行做一些调整。
public interface UserMapper {
    int deleteByPrimaryKey(Integer id);
    ...
}

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

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

相关文章

《QT实用小工具·十二》邮件批量发送工具

1、概述 源码放在文章末尾 该项目实现了邮件的批量发送&#xff0c;如下图所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef SMTPCLIENT_H #define SMTPCLIENT_H#include <QtGui> #include <QtNetwork> #if (QT_VERSION > QT_VERSION_CHECK(5,0,…

.kat6.l6st6r勒索病毒肆虐,这些应对策略或许能帮到你

引言&#xff1a; 近年来&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒更是成为了公众关注的焦点。其中&#xff0c;.kat6.l6st6r勒索病毒以其独特的传播方式和破坏力&#xff0c;给全球用户带来了极大的困扰。本文将深入探讨.kat6.l6st6r勒索病毒的特点&#xf…

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是&#xff0c;用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的&#xff1f; 其实很简单&#xff0c;只要键盘发送下面的两个报文给主机&#xff0c;字母A就能在主机上显示出来。 (1)…

深入理解C/C++的内存管理

在C和C中&#xff0c;高效的内存管理是编写性能优化和资源高效利用程序的关键。本文将深入探讨C/C内存管理的各个方面&#xff0c;包括内存的分布、C语言和C中的动态内存管理方式&#xff0c;以及new和delete操作符的使用 C/C内存分布 C和C程序的内存可以分为以下几个区域&…

MySQL安装卸载-合

目录 1.Linux下安装 1.1下载 1.2.上传 ​​​​​​​1.3.解压 ​​​​​​​1.4.安装 ​​​​​​​1.5.启动服务 ​​​​​​​1.6.查询临时密码 ​​​​​​​1.7.修改临时密码 ​​​​​​​1.8.创建用户 ​​​​​​​1.9.分配权限 ​​​​​​​1.10.重…

00-JAVA基础-脚本引擎

JAVA脚本引擎 什么是JAVA脚本引擎 Java 平台自带了如JavaScript、Groovy等脚本语言的引擎&#xff0c;可以在运行时动态地加载和执行脚本代码。这些脚本引擎可以直接在Java应用程序中使用&#xff0c;例如&#xff0c;通过ScriptEngineManager来获取特定脚本语言的ScriptEngi…

第18讲:数据在内存中的存储

⽬录 1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 ——————————————————————————————————————————— 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

VC++建立空文档失败的一种情形

假设现在要在单文档程序的客户区创建控件; 把控件作为视类的成员变量; 先把成员变量定义加到视类头文件; 然后在视类的, BOOL CMyttView::PreCreateWindow(CREATESTRUCT& cs) {....... } 在此成员函数中创建控件; 运行程序,就会出现如下错误, 这就需要在类向导…

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha&#xff0c;在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中&#xff0c;搜索movie render &#xff0c;加载movie render q…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘&#xff0c;可以用鼠标实时改变仪表盘的读数。 下面为demo演示&#xff1a; 该项目部分代码如下&#xff1a; #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

UE小:UE5.3无法创建C++工程

当您在使用Unreal Engine (UE) 构建项目时&#xff0c;如果遇到以下问题&#xff1a; Running C:/Program Files/Epic Games/UE\_5.3/Engine/Build/BatchFiles/Build.bat -projectfiles -project"C:/UEProject/Shp\_1/Shp\_1.uproject" -game -rocket -progress Usi…

Vuex的模块化管理

1&#xff1a;定义一个单独的模块。由于mutation的第二个参数只能提交一个对象&#xff0c;所以这里的ThisLog是个json串。 2&#xff1a;在Vuex中的Store.js中引入该模块 3&#xff1a;在别的组件中通过...mapState调用模块保存的State的值。 4&#xff1a;用...mapMutations修…

界面控件Kendo UI for jQuery 2024 Q1亮点 - 新的ToggleButton组件

Telerik & Kendo UI 2024 Q1 版本于2024年初发布&#xff0c;在此版本中将AI集成到了UI组件中&#xff0c;在整个产品组合中引入AI Prompt组件以及10多个新的UI控件、支持Angular 17、多个数据可视化功能增强等。 P.S&#xff1a;Kendo UI for jQuery提供了在短时间内构建…

递归算法解读

递归&#xff08;Recursion&#xff09;是计算机科学中的一个重要概念&#xff0c;它指的是一个函数&#xff08;或过程&#xff09;在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题&#xff0c;这些更小的子问题也使用相同的解决方案&…

文字超出收起展开功能的实现(vue2)

1.编写展开收起组件 <template><div class"text-clamp"><div class"text" :style"{height}"><span v-if"isVisible" class"btn" click"toggle">{{isExpand ? 收起 : ... 展开}}</spa…

24-Web服务核心功能有哪些,如何实现?

在Go项目开发中&#xff0c;绝大部分情况下&#xff0c;我们是在写能提供某种功能的后端服务&#xff0c;这些功能以RPC API 接口或者RESTful API接口的形式对外提供&#xff0c;能提供这两种API接口的服务也统称为Web服务。 Web服务的核心功能 将这些功能分成了基础功能和高…

day63 单调栈part02

503. 下一个更大元素 II 中等 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…

基于隐私保护的可追踪可撤销密文策略属性加密方案论文阅读

论文是2022年发表的A Traceable and Revocable Ciphertext-Policy Attribute-based Encryption Scheme Based on Privacy Protection 摘要 本篇论文提出了一种具有用户撤销、白盒追踪、策略策略隐藏功能的CP-ABE方案。在该方案中密文被分为两个部分&#xff1a;第一个部分是和…

Servlet 的基本理解

Servlet 是JavaEE规范的一种&#xff0c;主要是为了扩展Java作为Web服务的功能&#xff0c;统一接口。由其他内部厂商如tomcat&#xff0c;jetty内部实现web的功能。如一个http请求到来&#xff1a;容器将请求封装为servlet中的HttpServletRequest对象&#xff0c;调用init()&a…