2万字实操入门案例之在Springboot框架下用Mybatis简化JDBC开发实现基础的操作MySQL之预编译SQL主键返回增删改查

news2025/1/21 12:09:13

环境准备

准备数据库表

use mybatis;

-- 部门管理
create table dept(
                     id int unsigned primary key auto_increment comment '主键ID',
                     name varchar(10) not null unique comment '部门名称',
                     create_time datetime not null comment '创建时间',
                     update_time datetime not null comment '修改时间'
) comment '部门表';

insert into dept (id, name, create_time, update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()), (4,'就业部',now(),now()),(5,'人事部',now(),now());



-- 员工管理
create table emp (
                     id int unsigned primary key auto_increment comment 'ID',
                     username varchar(20) not null unique comment '用户名',
                     password varchar(32) default '123456' comment '密码',
                     name varchar(10) not null comment '姓名',
                     gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
                     image varchar(300) comment '图像',
                     job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
                     entrydate date comment '入职时间',
                     dept_id int unsigned comment '部门ID',
                     create_time datetime not null comment '创建时间',
                     update_time datetime not null comment '修改时间'
) comment '员工表';

INSERT INTO emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
                                                                                                    (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
                                                                                                    (2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
                                                                                                    (3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
                                                                                                    (4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
                                                                                                    (5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
                                                                                                    (6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
                                                                                                    (7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
                                                                                                    (8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
                                                                                                    (9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
                                                                                                    (10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
                                                                                                    (11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
                                                                                                    (12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
                                                                                                    (13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
                                                                                                    (14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
                                                                                                    (15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
                                                                                                    (16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),
                                                                                                    (17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

创建Springboot工程 引入对应的依赖

<?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>

    <!--所有项目的父工程 指定了springboot工程的版本-->
    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>3.2.5</version>
       <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!-- Generated by https://start.springboot.io -->
    <!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
    <groupId>com.bigdate</groupId>
    <artifactId>Mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Mybatis</name>
    <description>Mybatis</description>
    <properties>
       <java.version>17</java.version>
    </properties>
    <dependencies>

       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

       <!--mybatis起步依赖-->
       <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>3.0.3</version>
       </dependency>

       <!--MySQL驱动包-->
       <dependency>
          <groupId>com.mysql</groupId>
          <artifactId>mysql-connector-j</artifactId>
          <scope>runtime</scope>
       </dependency>

       <!--Springboot单元测试所需要的依赖-->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
       </dependency>

       <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter-test</artifactId>
          <version>3.0.3</version>
          <scope>test</scope>
       </dependency>

       <!-- druid连接池 -->
       <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid-spring-boot-starter</artifactId>
          <version>1.2.8</version>
       </dependency>

       <!-- lombok -->
       <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
       </dependency>

    </dependencies>

    <build>
       <plugins>
          <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
       </plugins>
    </build>

</project>

引入数据库的连接信息

spring.application.name=Mybatis

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

创建实体类并用lombok工具 通过注释简化书写

package com.bigdate.mybatis.pojo;

import lombok.*;

import java.time.LocalDate;
import java.time.LocalDateTime;

//@Getter
//@Setter
//@ToString
//@EqualsAndHashCode

@Data
@NoArgsConstructor  //无参构造
@AllArgsConstructor //带参构造

public class User {
    //ID
    private Integer id;
    //用户名
    private String username;
    //密码
    private String password;
    //姓名
    private String name;
    //性别
    private Short gender;
    //图像
    private String image;
    //职位
    private Short job;
    //入职时间
    private LocalDate entrydate;
    //部门ID
    private Integer deptID;
    //创建时间
    private LocalDateTime creatTime;
    //修改时间
    private LocalDateTime updateTime;

}

准备好Mapper接口 将数据库中拿到的实体类对象交给ioc容器

package com.bigdate.mybatis.mapper;


import com.bigdate.mybatis.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {

   

}

基础工程

删除操作

删除数据库表中的数据

package org.example.mybatis.mapper;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;

@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {

    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")

    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);


}
package org.example.mybatis;



import org.example.mybatis.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {

	@Autowired
	//声明接口类型的对象 将此对象注入进来
	private UserMapper userMapper;

	@Test
	public void testDelete(){

		int ans=userMapper.delete(14);
		//拿到返回值 并且输出到控制台
		System.out.println(userMapper.delete(ans));

	}

}

一般来说返回值是不需要的

返回值类型都设置为void

预编译SQL

我们不知道Java底层执行了什么样子的SQL语句

所以我们要打开日志

在配置文件中配置

指定输出到控制台

spring.application.name=Mybatis

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#数据库连接url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

#连接数据库的用户名
spring.datasource.username=root

#连接数据库的密码
spring.datasource.password=123456

#换数据库连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#配置mybatis的日志 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

这样就能输出执行的SQL语句

这个语句叫预编译SQL语句

?是预编译过程中的数据占位符

采用这种预编译的方式 性能更高 而且更安全

#和 {} 最后会被 ?替换

SQL具有缓存机制

小结

新增操作

往员工表中插入数据

实际前端页面是一个表单提交数据

基本信息录入完毕后

就能将数据提交到服务端

然后服务端将数据写入数据库

用实体类封装参数

注意字段要一一对应

如果字段名对应不上就难以通过测试

这边改了半个小时

先定义接口方法

再获取接口 写测试类

package org.example.mybatis.mapper;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.example.mybatis.pojo.User;

@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {

    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")

    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);

    //新增数据
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);


}
package org.example.mybatis;



import org.example.mybatis.mapper.UserMapper;
import org.example.mybatis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {

    @Autowired
    //声明接口类型的对象 将此对象注入进来
    private UserMapper userMapper;

    @Test
    public void testDelete(){

       int ans=userMapper.delete(14);
       //拿到返回值
       System.out.println(userMapper.delete(ans));

    }

    @Test
    public void testInsert(){

       User user=new User();
       
       //-- 插入数据
       //insert into emp(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
       //values (133,'Dduo',1234,'多多','1','100.jpg','1',now(),1,now(),now());

       user.setId(1332);
       user.setUsername("Dduo");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());

       //执行新增员工信息的操作
       userMapper.insert(user);

    }


}

写在Mapper接口里的方法

写在测试类里面的启动测试案例

主键返回

在数据添加成功后

需要获取插入数据库数据的主键

例如在添加套餐数据时 还需要维护套餐菜品关系表的数据

我们需要怎么去做呢

代码演示

package org.example.mybatis.mapper;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.example.mybatis.pojo.User;

@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {

    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")

    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);

    //新增数据
    @Options(useGeneratedKeys = true , keyProperty = "id")
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);


}

更新修改操作

点击操作的编辑按钮时

就会根据当前数据的主键ID

来查找这条数据并将数据回填

我们直接修改

然后提交表单到服务端去完成数据库表结构中数据的修改

写在Mapper接口里的

写在测试类里面

package org.example.mybatis.mapper;

import org.apache.ibatis.annotations.*;
import org.example.mybatis.pojo.User;

@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {

    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")

    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);

    //新增数据
    @Options(useGeneratedKeys = true , keyProperty = "id")
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);


    //更新数据
    @Update("update emp set username=#{username},password=#{password},name=#{gender}," +
            "gender=#{gender},image=#{image},job=#{job}," +
            "entrydate=#{entryDate},dept_id=#{deptID},create_time=#{creatTime} ,update_time=#{updateTime} " +
            "where id=#{id}")
    public void update(User user);


}
package org.example.mybatis;



import org.example.mybatis.mapper.UserMapper;
import org.example.mybatis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {

    @Autowired
    //声明接口类型的对象 将此对象注入进来
    private UserMapper userMapper;

    @Test
    public void testDelete(){

       int ans=userMapper.delete(14);
       //拿到返回值
       System.out.println(userMapper.delete(ans));

    }

    @Test
    public void testInsert(){

       User user=new User();
       
       //-- 插入数据
       //insert into emp(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
       //values (133,'Dduo',1234,'多多','1','100.jpg','1',now(),1,now(),now());

       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());

       //执行新增员工信息的操作
       userMapper.insert(user);

    }

    @Test
    public void testUpdata(){

       User user=new User();

       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());

       //执行新增员工信息的操作
       userMapper.update(user);

    }


}

查看日志 更新的数据为一条

根据ID查询

写在Mapper接口里

写在测试类里面

package org.example.mybatis;



import org.example.mybatis.mapper.UserMapper;
import org.example.mybatis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {

    @Autowired
    //声明接口类型的对象 将此对象注入进来
    private UserMapper userMapper;

    @Test
    public void testDelete(){

       int ans=userMapper.delete(14);
       //拿到返回值
       System.out.println(userMapper.delete(ans));

    }

    @Test
    public void testInsert(){

       User user=new User();

       //-- 插入数据
       //insert into emp(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
       //values (133,'Dduo',1234,'多多','1','100.jpg','1',now(),1,now(),now());

       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());

       //执行新增员工信息的操作
       userMapper.insert(user);

    }

    @Test
    public void testUpdata(){

       User user=new User();

       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());

       //执行新增员工信息的操作
       userMapper.update(user);
    }

    @Test
    public void testGetById(){
       User user=userMapper.getById(2);
       System.out.println(user);
    }

}

控制台进行反馈

但是在控制台中 字段值没有全部封装

而日期类的数据没有封装

在我们进行单元测试的时候我们会发现有些字段没有封装到实体类对象里面

处理方案

但是这种方案比较繁琐 不使用

我们应该打开Mybatis 自动映射开关

驼峰命名自动映射的开关

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

这样在Mapper接口中既不用手动封装也不用去取别名了

直接把原代码放开

package org.example.mybatis.mapper;

import org.apache.ibatis.annotations.*;
import org.example.mybatis.pojo.User;

@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {

    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")

    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);

    //新增数据
    @Options(useGeneratedKeys = true , keyProperty = "id")
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);


    //更新数据
    @Update("update emp set username=#{username},password=#{password},name=#{gender}," +
            "gender=#{gender},image=#{image},job=#{job}," +
            "entrydate=#{entryDate},dept_id=#{deptID},create_time=#{creatTime} ,update_time=#{updateTime} " +
            "where id=#{id}")
    public void update(User user);


    //查询数据
    @Select("select * from emp where id=#{id}")
    public User getById(Integer id);

    //方案1 给字段起别名 让别名与实体类的属性一致
//    @Select("select id, username, password, name, gender, image, job, " +
//            "entrydate entryDate, dept_id  deptID, create_time creatTime, update_time updateTime" +
//            " from emp where id=#{id}")
//    public User getById1(Integer id);


    //方案2 通过@Results @Result注解手动映射封装
//    @Results({
//            @Result(column = "entrydate",property = "entryDate"),
//            @Result(column = "dept_id",property = "deptID"),
//            @Result(column = "create_time",property = "creatTime"),
//            @Result(column = "update_time",property = "updateTime")
//    })
//    @Select("select * from emp where id=#{id}")
//    public User getById2(Integer id);

}

小结

条件查询

完成根据ID查询员工信息后

我们该学习员工列表信息查询

​​​​​​​

在上面填入搜索条件后 点击查询

提交给服务端查找

select *
from emp
where name like '%张%'
  and gender = 1
  and entrydate between '2010-01-01' and '2020-01-01'
order by update_time;

写在Mapper接口里的接口方法

写在测试类里的测试方法

启动测试 我们已经开启驼峰自动映射 自动封装字段名

使用$符号增强了代码的灵活性

但就不是预编译SQL

性能低而且不安全

存在SQL注入的问题

改进方法

select *
from emp
where name like '%张%'
  and gender = 1
  and entrydate between '2010-01-01' and '2020-01-01'
order by update_time;



select concat('hello' , 'mysql' ,'world');

# 改写
select *
from emp
where name like concat('%','张','%')
  and gender = 1
  and entrydate between '2010-01-01' and '2020-01-01'
order by update_time;

同理

现在生成的SQL语句就是预编译SQL

早期的springboot要在先前版本中额外的加上注解

这是因为先前编译的时候不会保留形参的名称

对应不起来

现在的Springboot内置插件 会自动将形参保存下来

但是以后在实际开发中遇到@Param注解要能明白是什么意思

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

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

相关文章

微信小程序之九宫格抽奖

1.实现效果 2. 实现步骤 话不多说&#xff0c;直接上代码 /**index.wxml*/ <view class"table-list flex fcc fwrap"><block wx:for"{{tableList}}" wx:key"id"><view class"table-item btn fcc {{isTurnOver?:grayscale…

使用API有效率地管理Dynadot域名,默认将域名隐形转发至其他界面

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

[通俗易懂]《动手学强化学习》学习笔记3-第5-13章

文章目录 前言小总结&#xff08;前文回顾&#xff09;问题1&#xff1a;问题2&#xff1a;问题3&#xff1a;补充一点 0.26.2版本gym环境问题 前言 参考&#xff1a; 《动手学强化学习》作者&#xff1a;张伟楠&#xff0c;沈键&#xff0c;俞勇 动手学强化学习 网页版 动手学…

思科期末大作业

计算机网络&#xff0c;可代写网络作业&#xff0c; 思科cisco模拟器&#xff0c;eve&#xff0c;制作校园局域网、企业局域网&#xff0c;实现路由交换、单臂路由、冗余、ACL、Nat、PAT、DHCP,RIP,OSPF,pppoe等技术&#xff0c;价格合理&#xff0c;详细私聊

Minio 对象存储 OSS概述

系列文章目录 第五章 Minio 对象存储 OSS概述 Minio 对象存储 OSS概述 系列文章目录对象存储 OSS基本概念存储空间&#xff08;Bucket&#xff09;对象&#xff08;Object&#xff09;ObjectKeyRegion&#xff08;地域&#xff09;Endpoint&#xff08;访问域名&#xff09;Ac…

Qt自定义QpushButton分别在c++/python中实现

//.h文件#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter> #include<QMouseEvent> #include<QPropertyAnimation> #include<QResizeEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; }class Widget : public QWi…

MATLAB图形绘制

文章目录 图形绘制二维图形绘制plotfplot 坐标轴设置函数/同一窗口分区subplotaxis添加标注 单对数坐标图三维图形绘制mesh 图形绘制 图形绘制的基本步骤&#xff1a; 数据准备&#xff1a;主要工作是产生出自变量采样向量&#xff0c;计算相应的函数值向量选定图形窗口及子图…

【全开源】云界旅游微信小程序(源码搭建/上线/运营/售后/维护更新)

开启您的云端旅行新体验 一、引言 在快节奏的现代生活中&#xff0c;旅行成为了人们放松身心、探索世界的重要方式。让您的旅行更加便捷、高效&#xff0c;打造了云界旅游小程序&#xff0c;带您领略云端旅行的无限魅力。 二、小程序功能概览 云界旅游小程序集成了丰富的旅游…

Electron学习指导

Electron学习指导 一、开始上手 1.1介绍 Electron Chromium Node.js Native APIs 官方说&#xff1a; Electron 是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创…

FENDI CLUB啤酒,为何女生喜欢?

精酿啤酒已经成了女生喜欢的饮品&#xff0c;在日剧《无法成为野兽的我们》里&#xff0c;主人公小晶永远保持标准笑容&#xff0c;完美完成所有的工作。只有一个人的时候&#xff0c;她才会放下习惯性的微笑&#xff0c;显露自己的疲惫。小晶缓解疲惫&#xff0c;就是下班后去…

【C语言深度解剖】:(11)函数指针、函数指针数组、指向函数指针数组的指针、回调函数

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》《精通C指针》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏…

Django Celery 的配置及使用---最详细教程

Django Celery 的配置及使用 Redis提供队列消息功能 一、安装redis 系统版本&#xff1a;Ubuntu 20.041、获取最新软件包 sudo apt update sudo apt install redis-server2、安装完成后&#xff0c;Redis服务器会自动启动。查看redis是否启动成功 sudo systemctl status …

JVM运行时内存:虚拟机栈

文章目录 1. 概述2. 栈针3. 栈针内部结构3.1 局部变量表3.2 操作数栈3.3 动态链接3.4 方法返回地址3.5 一些附加信息 运行时内存整体结构如下图所示: 1. 概述 如何理解栈管运行&#xff0c;堆管存储&#xff1f; 角度一&#xff1a;GC;OOM角度二&#xff1a;栈、堆执行效率角…

信息管理系统升级改造项目:需求分析工具与实践

关键词&#xff1a;出入境信息管理系统、升级改造项目、需求分析实践、逆向工程、PowerDesigner、Axure Pro、信息系统优化策略 文章重点&#xff1a;本文以出入境信息管理系统的升级改造项目为背景&#xff0c;详细阐述了信息系统需求分析的实践过程&#xff0c;特别是如何通过…

Python实现缓存机制库之cachetools使用详解

概要 在数据密集型应用中,缓存是优化性能和响应速度的关键技术之一。Python的cachetools库提供了一套灵活且强大的工具,用于在Python项目中实现缓存机制。本文将全面介绍cachetools的安装、特性、基本与高级功能,并结合实际应用场景,展示其在项目中的应用。 安装 安装cac…

文字游侠AI丨简直是写作神器,头条爆文一键生成稳定赚米!附渠道和详细教程(只需四步)!

在数字时代的浪潮中&#xff0c;人们不断寻求网络空间中的商机&#xff0c;期望在互联网的浩瀚海洋里捕捉到稳定的财富。随着人工智能技术的突飞猛进&#xff0c;越来越多的AI工具被融入到各行各业&#xff0c;开辟了新天地&#xff0c;带来了创新的盈利模式。 其中&#xff0c…

PCB供电夹子DIY

在刷小红书的时候&#xff0c;看到了清华卓晴教授【https://zhuoqing.blog.csdn.net/】DIY的供电夹子&#xff0c;感觉对于自己DIY PCB的时候供电会比较方便&#xff0c;物料也比较简单&#xff0c;打算复刻一下。 使用物料 1、小夹子&#xff0c;文具店都有卖&#xff0c;选…

【Transformer-BEV编码(9)】Sparse4D v2 v3源代码分析。稀疏感知方向新的baseline,相机参数泛化能力差的问题。

前言&#xff1a; 基于BEV的稠密融合算法或许并不是最优的多摄融合感知框架。同时特征级的多摄融合也并不等价于BEV。这两年&#xff0c;PETR系列(PETR, PETR-v2, StreamPETR) 也取得了卓越的性能&#xff0c;并且其输出空间是稀疏的。在PETR系列方法中&#xff0c;对于每个in…

这10款安卓APP,简直好用到爆!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频http://AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频 1.追书——追书神器 追书神器是小说追新大神&#xff0c;全网实…

Online RL + IL :Policy Improvement via Imitation of Multiple Oracles

NIPS 2020 paper code 如何利用多个次优专家策略来引导智能体在线学习&#xff0c;后续有多个文章研究该设定下的RL。 Intro 论文探讨了在强化学习&#xff08;RL&#xff09;中&#xff0c;如何通过模仿多个次优策略&#xff08;称为oracle&#xff09;来提升策略性能的问题…