[SSM]MyBatisPlus进阶

news2024/11/24 1:51:33

三、进阶篇

3.1映射

3.1.1自动映射规则

  • 表名和实体类名映射 -> 表名user 实体类名User
  • 字段名和实体类属性名映射 -> 字段名name 实体类属性名name
  • 字段名下划线命名方式和实体类属性驼峰命名方式映射 -> 字段名 user_email 实体类属性名 userEmail

开启驼峰命名

mybatis-plus.configuration.map-underscore-to-camel-case=true

3.1.2表映射

  • 通过@TableName()注解指定映射的数据库表名,就会按照指定的表名进行映射
  • 如:此时将数据库的表名改为t_user,要完成表名和实体类名的映射,需要将实体类名也要指定为t_user
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
  • 如果有很多实体类,对应到数据库表中的很多表,我们不需要每个依次配置,只需要配置一个全局的设置,他都会给每个实体类名前面添加指定的前缀。
#表映射全局配置
mybatis-plus.global-config.db-config.table-prefix=t_

3.1.3字段映射

  • 什么场景下会改变字段映射呢?

场景一

  • 当数据库字段和表实体类的属性不一致时,我们可以使用@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致。

  • 如:此时数据库字段的名称我们改为username,在根据实体类的属性拼接SQL的使用,就会使用@TableField()中指定的名称username进行拼接,完成查询

    @TableField("username")
    private String name;
  • 此时的SQL语句是这样的
SELECT id,username AS name,email FROM t_user

场景二

  • 数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接SQL语句,例如:
SELECT  id,username AS name,age,email,desc  FROM t_user
  • 这条语句直接进行查询的时候,会出现错误:

Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desc FROM t_user’ at line 1

  • 原因是desc属于关键字,不能直接用于SQL查询,要解决这个问题,就需要将desc字段加上符号,将他变为非关键字,才能完成查询。这个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过@TableField()改变实体类的属性名称,将desc变为desc,就可以解决这个问题
@TableField("`desc`")
private String desc;

3.1.4字段失效

  • 当数据库中有字段不希望被查询,我们可以通过@Table(select=false)来隐藏这个字段,拿在拼接SQL语句的时候,就不会拼接这个字段。
  • 如:如果不想显示年龄信息,那么可以在age属性上添加这个注解来隐藏这个字段
@TableField(select = false)
private Integer age;
  • 通过查询生成的SQL语句,发现并没有拼接age字段

3.1.5视图属性

  • 在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在这个字段,叫做视图字段。

  • 我们可以通过@TableField(exist=false)来去掉这个字段,不让他作为查询字段。

@TableField(exist = false)
private Integer online;
  • 通过查询生成的SQL语句,发现并没有online字段

3.2条件构造器

3.3等值查询

3.3.1eq

  • 使用QueryWrapper对象,构建查询条件
@Test
void eq() {
    //1.创建条件查询对象
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //2.设置查询条件,指定查询的字段和匹配的值
    queryWrapper.eq("username","Jack");
    //3.进行条件查询
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}
  • 测试效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 如果我们每次都是自己进行字段名称的编写,有可能会出现名称写错的情况,怎么避免这种情况呢,我们可以使用LambdaQueryWrapper对象,在构建字段时,使用方法引用的方式来选择字段,这样做可以避免字段拼写错误。
@Test
void eq2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(User::getName,"Jack");
    User user = userMapper.selectOne(lambdaQueryWrapper);
    System.out.println(user);
}
  • 我们的构建条件是从哪里来的?应该是从客户端通过请求发送过来的,由服务器接收的。在网站中一般都会有多个条件入口,用户可以选择一个或多个条件进行查询,那这个时候在请求时,我们不能确定所有的条件都是有值的,部分条件可能用户没有传值,那么该条件就为null。
  • 那么null的条件,我们是不需要进行查询条件拼接的,否则就会出现如下情况,将为null的条件进行拼接,筛选后无法查询出结果。
@Test
void isNull() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(User::getName,null);
    User user = userMapper.selectOne(lambdaQueryWrapper);
    System.out.println(user);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 我们要解决这个问题,可以先判断是否为空,根据判断结果选择是否拼接该字段。
@Test
void isNUll2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //String username="Jone";
    String username=null;
    lambdaQueryWrapper.eq(username!=null,User::getName,username);
    //User user = userMapper.selectOne(lambdaQueryWrapper);
    List<User> user = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(user);
}

3.3.2allEq

  • 如何通过多个eq,构建多条件查询
@Test
void allEq1() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(User::getName,"Tom");
    lambdaQueryWrapper.eq(User::getAge,28);
    User user = userMapper.selectOne(lambdaQueryWrapper);
    System.out.println(user);
}
  • 如果此时有多个条件需要同时判断,我们可以将这多个条件放入到Map集合中,更加的方便。
@Test
void allEq2() {
    //1.构建条件Map
    HashMap<String, Object> map = new HashMap<>();
    map.put("username","Tom");
    //map.put("age",28);
    map.put("age",null);
    //2.创建QueryWrapper对象
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //3.使用条件完成查询
    queryWrapper.allEq(map,false);
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}
  • 参数params:表示传递的Map集合
  • 参数null2IsNull:表示对于为null的条件是否判断为isNull

3.3.3ne

  • 不等ne
@Test
void ne() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.ne(User::getName,"Tom");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4范围查询

3.4.1gt

@Test
void gt() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.gt(User::getAge,20);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4.2ge

@Test
void ge() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.ge(User::getAge,20);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4.3lt

@Test
void lt() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.lt(User::getAge,20);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4.4le

@Test
void le() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.le(User::getAge,20);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4.5between

@Test
void between() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.between(User::getAge,20,28);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4.6notBetween

@Test
void notBetween() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.notBetween(User::getAge,20,28);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.5模糊查询

@Test
void like() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(User::getName,"J");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void notLike() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.notLike(User::getName,"J");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void likeLeft() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.likeLeft(User::getName,"e");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void likeRight() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.likeRight(User::getName,"J");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.6判空查询

Test
void isNull() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.isNull(User::getDesc);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void isNotNull() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.isNotNull(User::getName);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7包含查询

3.7.1in

@Test
void in() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.in(User::getAge, 18, 20, 21);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void in2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    ArrayList<Integer> list = new ArrayList<>();
    //Collections.addAll(list,18,20,21);
    list.add(18);
    list.add(20);
    list.add(21);
    lambdaQueryWrapper.in(User::getAge, list);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.2notIn

@Test
void notIn() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.notIn(User::getAge, 18, 20, 21);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void notIn2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    ArrayList<Integer> list = new ArrayList<>();
    Collections.addAll(list,18,20,21);
    lambdaQueryWrapper.notIn(User::getAge,list);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.3inSql

@Test
void inSql() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.inSql(User::getAge, "18,20,21");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void inSql2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.inSql(User::getAge, "select age from t_user where age>=20");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.4notInSql

@Test
void notInSql() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.notInSql(User::getAge, "18,20,21");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void notInSql2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.notInSql(User::getAge, "select age from t_user where age>20");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.8分组查询

@Test
void groupBy() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //分组字段
    queryWrapper.groupBy("age");
    //查询字段
    queryWrapper.select("age,count(*) as field_count");
    List<User> users = userMapper.selectList(queryWrapper);
    System.out.println(users);
}

3.9聚合查询

@Test
void having() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //分组字段
    queryWrapper.groupBy("age");
    //查询字段
    queryWrapper.select("age,count(*) as field_count");
    //聚合字段
    queryWrapper.having("field_count>1");
    List<User> users = userMapper.selectList(queryWrapper);
    System.out.println(users);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.10排序查询

@Test
void orderByAsc() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.orderByAsc(User::getAge,User::getId);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void orderByDesc() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.orderByDesc(User::getAge,User::getId);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void orderBy() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    /**
     * oderBy:设置排序字段和排序的方式
     * 参数一:如果排序字段的值为null,是否还要作为排序字段参与排序
     * 参数二:是否升序排序
     * 参数三:排序字段
     */
    lambdaQueryWrapper.orderBy(true, true, User::getAge);
    lambdaQueryWrapper.orderBy(true, false, User::getId);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.11func查询

@Test
    void func() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //可能会根据不同的情况来选择进行拼接不同的查询条件
        /*lambdaQueryWrapper.func(new Consumer<LambdaQueryWrapper<User>>() {
            @Override
            public void accept(LambdaQueryWrapper<User> userLambdaQueryWrapper) {
                if (true){
                    userLambdaQueryWrapper.eq(User::getId,1);
                }else {
                    userLambdaQueryWrapper.ne(User::getId,1);
                }
            }
        });*/
        //使用lambda表达式
        lambdaQueryWrapper.func(i -> {
            if (true) {
                i.eq(User::getId, 1);
            } else {
                i.ne(User::getId, 1);
            }
        });
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.12逻辑查询

3.12.1and

  • 正常拼接默认就是and,例如
@Test
void and() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.gt(User::getAge,20).lt(User::getAge,30);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void and2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(User::getName,"Jone").and(i->
        i.lt(User::getAge,20).or().gt(User::getAge,30)
    );
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.12.2or

@Test
void or() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.lt(User::getAge, 20).or().gt(User::getAge, 30);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void or2() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.likeRight(User::getName,"J").or(i->i.ge(User::getAge,20).le(User::getAge,30));
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.12.3nested

@Test
void nested() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.nested(i->i.eq(User::getName,"Tom").ne(User::getAge,23));
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.13自定义条件查询

@Test
void apply() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.apply("id=2");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.14last查询

@Test
void last() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.last("limit 0,2");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.15exists查询

3.15.1exists

@Test
void exists() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.exists("select id from t_user where age=18");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
  • select id from t_user where age=18语句能查询到结果,执行SELECT id,username AS name,age,email,desc FROM t_user语句,否则不执行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.15.2notExists

@Test
void notExists() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.notExists("select id from t_user where age=18");
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
  • 查询结果与exists相反。

3.16字段查询

@Test
void select() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.select(User::getId, User::getName);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

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

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

相关文章

靓丽出挑,轻盈舒适:南卡OE Pro运动蓝牙耳机体验

随着科技的不断发展&#xff0c;运动蓝牙耳机在市场上备受瞩目。NANK南卡在运动蓝牙耳机领域深耕细作多年&#xff0c;旗下Runner挂耳骨传导耳机系列细分多款&#xff0c;并且因为优秀的品质、不俗的性价有着亮眼的销量与风评反馈。最近南卡在自家OE的基础上推出了升级Pro款&am…

Apipost:让API研发更高效、更协同

在数字化时代&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为数字生态系统中的重要组成部分。API不仅使得不同应用程序能够相互通信&#xff0c;还成为了企业间进行数据交换和业务整合的关键手段。在这个趋势下&#xff0c;API研发工具市场也日益繁荣&#xff0c…

【Linux】Ubuntu20.04版本安装谷歌中文输入法【教程】

【Linux】Ubuntu20.04版本安装谷歌中文输入法【教程】 文章目录 【Linux】Ubuntu20.04版本安装谷歌中文输入法【教程】一、下载fcitx-googlepinyin二、配置Language SupportReference 一、下载fcitx-googlepinyin 使用下面的命令行下载fcitx-googlepinyin sudo apt-get insta…

【TI毫米波雷达笔记】MMwave毫米波雷达API配置及驱动(以IWR6843AOP为例)

【TI毫米波雷达笔记】MMwave毫米波雷达API配置及驱动&#xff08;以IWR6843AOP为例&#xff09; MMWave API&#xff08;位置处于BSS&#xff09;可以被DSS和MSS调用 通过Mailbox进行数据通信 毫米波雷达接口 #include < ti/control/mmwave/mmwave.h> #include <ti/…

Redis基本了解

Redis 基于内存进⾏存储&#xff0c;⽀持 key-value 的存储形式&#xff0c;底层是⽤ C 语⾔编写的。 基于 key-value 形式的数据字典&#xff0c;结构⾮常简单&#xff0c;没有数据表的概念&#xff0c;直接⽤键值对的形式完成数据的管理&#xff0c;Redis ⽀持 5 种数据类型…

运维Shell脚本小试牛刀(六): Shell中的函数|本地变量

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

14.Redis 主从复制

Redis 主从复制 redis 主从复制配置 redis 主从复制启动 redis 主从复制断开 redis 主从复制主从复制构特点主从复制的拓扑结构一主一从⼀主多从树状主从 主从复制原理数据同步psync 运行流程全量复制流程部分复制流程实时复制 关于从节点何时晋升成主节点总结 redis 主从复制 …

iKeyPrime完美解4G信号,可以登录iCloud,有消息通知,支持最新iOS16.6。

iKeyPrime是一款绕过激活锁界面的解锁工具&#xff0c;可以激活所有iPhone苹果手机&#xff0c;二网/三网恢复信号&#xff0c;并且支持插卡接打电话、收发短信、4G流量上网&#xff0c;支持iCloud登录&#xff0c;有消息通知&#xff0c;支持iPhone5S~X的所有型号&#xff0c;…

车规微控制器的ECC机制及EMU外设

车规微控制器的ECC机制及EMU外设 文章目录 车规微控制器的ECC机制及EMU外设引言ECC的基本原理ECC RAM的访问方式ECC RAM的初始化SRAM ECC错误注入及EMU外设Flash ECC校验参考文献 引言 ECC是微控制器系统中&#xff0c;用于保障信息安全的常用机制&#xff0c;主要是避免存储设…

gRPC远程进程调用

gRPC远程进程调用 rpc简介golang实现rpc方法一net/rpc库golang实现rpc方法二jsonrpc库grpc和protobuf在一起第一个grpc应用grpc服务的定义和服务的种类grpc stream实例1-服务端单向流grpc stream实例2-客户端单向流grpc stream实例3-双向流grpc整合gin

转型的每一步都至关重要!大运新能源远勤山谈品牌发展之道

“我们转型新能源乘用车&#xff0c;一开始选择研发生产悦虎和远志M1两款中低价位车型是为了“练练手”。我们用这两款车型探路&#xff0c;去熟悉和了解新能源市场&#xff0c;通过一步一步踏踏实实把产品做好&#xff0c;逐渐获得消费者认可&#xff0c;同时也为今后研发其他…

一周AIGC丨中国境内 151 个算法完成备案,腾讯、百度等 11 家 AI 大模型产品陆续上线...

近日&#xff0c;网信办官网公开发布第二批境内深度合成服务算法备案信息。至此&#xff0c;国内已有 151 个算法通过深度合成服务算法名单的备案。腾讯、百度等 11 家 AI 大模型产品完成备案陆续上线&#xff0c;标志着大模型行业在我国正式进入产品化落地阶段&#xff0c;大模…

链动2+1模式,让你的美妆消费变成收入来源

美妆&#xff0c;是一个与女性息息相关的话题&#xff0c;也是一个巨大的市场。据统计&#xff0c;2022年&#xff0c;中国美妆市场规模达到了1.3万亿元&#xff0c;占全球美妆市场的20%。美妆消费者的需求日益多样化和个性化&#xff0c;对产品的品质、效果、安全性等方面有着…

Nougat 深度剖析

Nougat 深度剖析 项目地址&#xff1a;https://github.com/facebookresearch/nougat 论文地址&#xff1a;Nougat: Neural Optical Understanding for Academic Documents 0 背景 近日&#xff0c;MetaAI又放了大招&#xff0c;他们提出了一种全新的端到端的OCR模型&#x…

spring boot项目上传头像

应用还是验证码使用的原理&#xff1b;但是代码逻辑却有所不同。 逻辑前端传给后端&#xff0c;然后写入本机磁盘去&#xff0c;文件名用uuid避免重复。写完就可以顺带把文件名保存到数据库里。上传就这样子。 怎么取用的&#xff1b;还是通过配置映射的方式&#xff1b;通过sr…

电商企业固定资产怎么管理

电商固定资产管理需要建立标准的固定资产管理制度&#xff0c;从规则上进行约束。同时&#xff0c;引入固定资产管理系统&#xff0c;从流程上起到直接提升效果的方式。电商标准的固定资产管理制度因公司而异&#xff0c;但通常包括以下内容&#xff1a;  固定资产的定义和分…

B2B企业常用的邮件营销推广策略

互联网在经历了十多年的高速增长后&#xff0c;近年来互联网流量逐渐饱和&#xff0c;企业获客成本越发高涨以及拓客增长渐渐缓慢&#xff0c;尤其对于专业门槛高、行业较为垂直的B2B企业而言&#xff0c;网络营销一直是企业获客中非常重要的一环。如何获得更多的客户、降低获客…

【Python爬虫笔记】爬虫代理IP与访问控制

一、前言 在进行网络爬虫的开发过程中&#xff0c;有许多限制因素阻碍着爬虫程序的正常运行&#xff0c;其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站&#xff0c;网站管理者会使用一些方式进行限制。这时候&#xff0c;代理IP就是解决方…

VUE for循环 默认选中第一条数据

for循环渲染列表默认选中第一条数据 点击其他选项切换数据 <div><div class"Subtitle" style"padding: 5px 40px;">项目清单</div><div class"project-manifest"><div v-for"(item, index) in project" :…

三年前端还不会配置Nginx?刷完这篇就够了

什么是Nginx Nginx是一个开源的高性能HTTP和反向代理服务器。它可以用于处理静态资源、负载均衡、反向代理和缓存等任务。Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。它具有低内存消耗、高并发能力和良好的稳定性&#xff0c;因此在互联网领域非常受欢迎。 为…