后端之路第三站(Mybatis)——结合案例讲Mybatis怎么操作sql

news2024/12/24 21:15:54

先讲一下准备工作整体流程要做什么

我们要基于一个员工管理系统作为案例,进行员工信息的【增、删、改、查】

原理就是用Mybatis通过java语言来执行sql语句,来达到增、删、改、查】

一、准备工作

1、引入数据库数据

首先我们把一个员工、部门表的数据在数据库里建好先

老弟们我直接把黑马的资源代码放这里了,各位不用再去找、网盘下载,直接拿我下面这个代码放数据库查询控制台执行一下就行

-- 数据准备:

-- 部门管理
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 教研主管',
     entrydate date comment '入职时间',
     dept_id int unsigned comment '部门id, 说明: 1 学工部,2 教研部, 3 咨询部, 4 就业部, 5 人事部',
     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,'2007-01-01',2,now(),now()),
        (17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

2、然后就是之前那些创建springboot工程、引入mybatis等等依赖的配置操作

因为我之前第一篇讲过了就不再演示了,跟着我配置好了的可以不用再创建多余的工程,直接在原先的数据库多加两个表而已,反正还是用原来的spring boot工程项目来连接同一个数据库

配置那一篇的链接:后端之路第三站(Mybatis)——入门配置-CSDN博客

当然如果你非要另开一个数据库来连接的话,那你就重新配置一遍并连接这个数据库吧,不过注意,可以在引入依赖的时候,除了【Mybatis Framework】和【MySQL Driver】还可以直接再勾选【Developer Tools】的【Lombok】依赖,因为这样就不用我们再去【pom.xml文件】那里在手动写代码的形式引入lombok的依赖了

3、然后连接你的数据库

这里我懒得换数据库,还是在原来的数据库建两个表而已,所以我就不演示了,想看的还是看我这一篇:后端之路第三站(Mybatis)——入门配置-CSDN博客

4、然后对应你建的表,在java这创建对应的实体类

别忘了

整型数:int   在java对应   Integer

字符串:varchar( )   在java对应   String

               char( )   在java对应   String

短整型数:tinyint   在java对应   Short

日期:date 在java对应   LocalDate

时间:datetime  在java对应   LocalDateTime

员工表的实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Short gender;
    private String image;
    private Short job;
    private LocalDate entrydate;
    private Integer dept_id;
    private LocalDateTime create_time;
    private LocalDateTime update_time;
}

部门表的实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
    private Integer id;
    private String name;
    private LocalDateTime create_time;
    private LocalDateTime update_time;
}

这里我建议各位自己不要直接拿我代码复制粘贴,最好自己收敲一遍,加深代码流程记忆

6、到mapper目录创建【对应xxx表的SQL语句执行】的接口

二、开始sql语句操作

噢忘了跟各位提一嘴,idea的右边侧边栏是可以连接数据库的

点开这里,点击“+”加号添加数据源,就跟在数据库软件里连接数据库一样的,写个用户名密码啥的,我已经链接了我就不展示了,有手就行

然后每当我们在数据库创建好新的表之后,都要记得去idea这里刷新一下,不然的话idea不知道你多了两表,写代码的时候就没有相关的提示了

1、删除

删除的sql语句是:【 delete from 表 where 条件

删除的Mybatis注解是:【 @Delete( "delete from 表 where 条件" 

那么在MySQL里我们是这么写

在Mybatis就是

哪有的人就会问:你这where id = 17不就写死了吗?那如果我想动态的删除员工,而不是固定死只删除id为17的员工,怎么办?还有你下面那个public void delete();又是什么玩意?

比如我要实现管理系统里动态删除,点那个就删哪个

@XXX是注解,对于执行sql语句的注解,你要是想执行的话不能单单靠一个注解就执行啊,你必须得带一个方法,让外部调用你这个方法,才能执行你这个@注解来操作数据库啊 

那么好,这里我们就应该在下面写一个方法,首先考虑我们这个sql语句不是查询语句,不需要返回!!!所以直接类型为void无返回

然后加参数!在外面调用这个接口的这个方法时会动态地传入参数,这里我们考虑根据id来删,那么比如在管理系统里,我点击第2个人的“删除”,就传入一个【id=2】的参数

现在我们有了参数还剩最后一步,改@Delete这个注解里的sql代码了,很简单【#{ 变量 }】这样就可以动态绑定变量了!!是不是很像前端的【`${ 变量 }`】?

完整代码

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;

@Mapper
public interface EmpMapper {
    //@Sql的注解( "要执行的sql语句" )
    @Delete("delete from emp where id = #{id}")
    //对应这个sql语句执行的一些相关方法
    public void delete(Integer id);
}

ok,然后现在测试就行了,老步骤:

1、test的...ApplicationTests.java文件

2、在类里面@Autowired注解,然后创建EmpMapper的对象变量使用

3、然后@Test注解直接跟上要运行的方法,在方法里调用EmpMapper的delete方法并传入实参

运行搞定

总结

#{ 变量 } ${ 变量 }

在application.properties文件配置好这个下面这个代码,以后就可以在控制台看到具体的日志(也就是直观的mybatis执行sql语句的过程)

不用记,直接复制

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

那么为什么我们where id = #{ 变量 } 在控制台日志里会变成 where id =

原理是:

#{ 变量 } 的语法会生成【预编译语句】

${ 变量 } 的语法不会生成【预编译语句】,而是像前端的${ 变量 } 一样直接把变量直接拼接到字符串

至于有什么用?预编译的 #{ } ${ } 有什么优劣?

简单的例子,不用深究了解

如果用 ${ } 直接字符串拼接的形式,就会

根据一整个语句,字符串里的【or、and、=】这些字符会被当成【判断逻辑符号】用,如果条件永远为真,那就算这个密码错的也可以登录

然而 #{ } 的是预编译,字符串以一整个参数形式传入,【or、and、=】这些字符还是当成普通字符串来判断

2、新增

新增的sql语句是:

(表里所有字段都传值时) —>【 insert into 表 values (对应的所有字段值1),(对应的所有字段值2)...... 】

(表里指定部分字段传值时) —>【 insert into 表(字段1,字段2...) values (对应的字段的值1),(对应的字段的值2)...... 】

新增的Mybatis注解是:

(表里所有字段都传值时) —>【 @Insert( "insert into 表 values (对应的所有字段值1),(对应的所有字段值2)...... "  】

(表里指定部分字段传值时) —>【 @Insert( "insert into 表(字段1,字段2...) values (对应的字段的值1),(对应的字段的值2)......

现在我们想要完成一个新增员工的这么一个功能

在数据库里sql语句是

(不会的先去学MySQL的知识,这里就是根据“用户名、姓名、性别、图像、职位、入职日期、归属部门、这个信息创建时间、这个信息的更新时间”来执行sql的新增信息,【这个信息创建时间、这个信息的更新时间】这两是一般更新新增信息固定带有的信息)

那么在Mybatis就这么写

还是那个问题,这是死数据,我需要动态传值,那就把value里写成 #{ } 参数

然后public void insert( )里定义参数,好让外部调用时传入实参

注意:

@注解里的sql语句】的参数名、表名要跟数据库的一样;因为它接收对应数据库的值

@注解里的values】的的参数是要跟java里的实体类的参数名一样!!!因为它接收java的值

​​​​​​​

方法里】的参数是要跟java里的实体类的参数名、类名一样!!!因为它接收java的值

然后因为新增操作涉及大量参数,所以在java里传多个值可以直接用【对象】!!所以【方法里】直接传【对象】即可,然后@注解里的values】的 #{ 变量 } 会自动解析出对象里的对应的变量的属性

那么就到最后一步,在外部ApplicationTest方法里调用方法

但是下面注意:这样就错了!!我们在接口定义的参数是一整个对象,不是这么零散的参数

那就要先构建一个实体类的对象,把这些参数作为对象的成员变量装进去,然后整个对象给回Mapper接口

@Test
public void testInsert(){
     //这样就错了!!我们在接口定义的参数是一整个对象,不是这么零散的参数
     //empMapper.insert("CZM","岑梓铭",(short)1,"1.jpg",(short)3, LocalDate.of(2024,1,1),1, LocalDateTime.now(),LocalDateTime.now());

     //得先构建一个对象,然后把对应的值调用setter方法设置
     //对象里没用的成员变量就不用设置,不设置的变量就是默认值,也不会报错也不会有影响
     Emp emp1 = new Emp();
     emp1.setJob((short)3);
     emp1.setGender((short)1);
     emp1.setUsername("CZM");
     emp1.setName("岑梓铭");
     emp1.setImage("1.jpg");
     emp1.setEntrydate(LocalDate.of(2024,1,1));
     emp1.setDept_id(1);
     emp1.setCreate_time(LocalDateTime.now());
     emp1.setUpdate_time(LocalDateTime.now());
     empMapper.insert(emp1);
}

能看到又报错了,很明显我们#{ }的地方有写错java里对应的变量

改一下就成功了

3、主键返回

上一个新增操作,我们因为在数据库设置了id字段是自增的主键,那么即使我们不给id传值,它也会自动在数据库增加id的值,这时数据库的基础知识

那么既然有值,我们能不能在java拿到数据库返回的id这个主键的值呢?不行

因为默认普通的插入是不会有返回值的,那要有返回值咋办?

加一个注解

@Option(useGeneratedKeys = true, keyProperty = "主键那个字段")

现在再执行一下

成功

4、更新

更新的sql语句是:

update set  表  字段1=新值1,字段2=值2......  where  条件 】

新增的Mybatis注解是:

@Update( "update set  表  字段1=新值1,字段2=值2......  where  条件 "  】

现在要实现这么个功能,点击编辑可以更改员工信息

那么根据图片的需求信息总结,需要更新的字段值是:username 、name、gender、image、job 、entrydate 、dept_id、还有一个【update_time】(新增的时候要有“新建时间” 和 “更新时间”,那更新就要有 “更新时间”)

sql里就应该这么写

那么现在Mybatis就应该这么写:(我就直接写成动态传参的了,不示范死数据格式了)

成功更新

5、查询

查询的sql语句是:

select  *  from  表  where  条件 】

查询的Mybatis注解是:

@Select( "select  *  from  表  where  条件"  】

sql语句是这样

Mybatis就应该这么写

成功

查询中的一些数据封装问题:

用我这篇文章里的代码的朋友们在刚刚的查询操作中应该不会有什么问题,因为我的代码里的【Java的实体类Emp里的成员变量的名】和【数据库的emp表的字段名】是一样的,所以查询时会对应映射、封装数据

但是有些跟着黑马程序员视频的朋友或者自己有自己的代码书写风格的人,可能在【数据库表的字段名】用的是xxx_xxx,然后在【Java的实体类的成员变量的名】用的是xxxXxx,然后因为二者名字不一样而导致数据没有对应封装

解决办法:

1、(个人首选推荐):在application.properties配置里加下面的代码

它会自动把【xxx_xxx】转换映射成【xxXxx】,很方便(前提必须严格按要求:数据库起名是xx_xxx、java这边起名是驼峰形xxXxx)

#开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case = true

2、(个人次推荐):咱就老老实实跟数据库表里的字段名都一样不就完事了嘛.......

3、(略麻烦):通过Results、Result注解手动映射封装

4、(巨麻烦):sql里的起别名的方法,在sql语句里把 * 换成写出所有字段名,然后名字不同的那几个在后面空格、再跟上别名,别名就是【Java的实体类的成员变量的名】

6、略复杂的查询

现在实现这么一个功能,根据姓名、性别、入职时间范围来组合条件查询

要求是:

        名字里含有什么字啥?

        性别是啥?

        入职时间在(时间范围)之间

        并要求按 “员工信息的更新时间” 来倒序排序显示

例子:

        名字里含有“张”字

        性别是男(1)

        入职时间在(2010年1月1日 — 2020年1月1日)之间

        并要求按 “员工信息的更新时间” 来倒序排序显示

那么在数据库sql是这样写

然后注意一下,这里sql里模糊查询条件like后面必须跟“字符串”,然后要想动态传值就得#{变量}

但是!!!#{变量}产生的预编译语句的“?”不能被包在字符串里!!!

那么有的教程就会教你用另一个“${变量}”,因为“${变量}”是直接拼接字符串嘛

但是要注意,单纯像下图这么写的话,老子试了半个小时越试越特么烦,浑身刺挠,

因为黑马程序员这个老毕登瞎钩八讲,在视频最后才提到说如果要传递多个参数,说什么springBoot 1.x版本要用【@Param(“变量”)】这个注解来指定#{ 变量 }的变量是下面函数里的参数

放他娘狗屁!早又不说非要老子查他妈半年bug,然后说的还是错的

记住了!!!不管你是哪个版本,哪怕是昨天spring公司开更新的最新版,只要Mapper接口的方法要传递多个参数时,都给我加上【@Param(“变量”)】在每一个参数前面!!!!!

ok,那现在还有一个问题,不是说${ }容易被攻击吗?想用#{ }?也可以

直接用这个方法:sql里用 【concat()方法】 可以拼接字符串!!!!

那么Mybatis这边这样写

成功

案例中完整的Mybatis代码如下

Mapper目录下EmpMapper的所有执行sql的操作接口代码

//这块别复制,你们自己有自己的路径
//package com.czm.mybatis01.mapper;

//这块别复制,你们自己有自己定义的类的位置
//import com.czm.mybatis01.table.Emp;

import org.apache.ibatis.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;

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

@Mapper
public interface EmpMapper {
    //@Sql的注解( "要执行的sql语句" )
    @Delete("delete from emp where id = ${id}")
    //对应这个sql语句执行的一些相关方法
    public void delete(Integer id);

    @Options( useGeneratedKeys = true, keyProperty = "id" )
    @Insert( "insert into emp(username,name,gender,image,job,entrydate,dept_id,create_time,update_time)"
                    +
                    " values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{dept_id},#{create_time},#{update_time})" )
    public void insert(Emp emp);

    @Options( useGeneratedKeys = true, keyProperty = "id")
    @Update(" update emp set username = #{username}, name = #{name}, gender = #{gender}, image = #{image}," +
            "job = #{job}, entrydate = #{entrydate}, dept_id = #{dept_id}, update_time = #{update_time} where id = #{id}; ")
    public void Update(Emp emp);

    //批量查询所有信息
    @Select( "select * from emp" )
    public List<Emp> selectAll();

    //根据id查询员工信息
    @Select( "select * from emp where id = #{id}" )
    public Emp select(Integer id);

    //复杂查询员工
//    @Select( "select * from emp where" +
//            " name like '%${name}%' " +
//            " and gender = #{gender}" +
//            " and entrydate between #{begin} and #{end}" +
//            " order by update_time desc" )
    @Select( "select * from emp where" +
                    " name like concat('%',#{name},'%') " +
                    " and gender = #{gender}" +
                    " and entrydate between #{begin} and #{end}" +
                    " order by update_time desc" )
    public List<Emp> DifficultSelect(@Param("name") String name, @Param("gender") Short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);

}

test目录下的ApplicationTest测试文件的代码:

//这块别复制,你们自己有自己的路径
//package com.czm.mybatis01;

//这块别复制,你们自己有自己定义的接口的位置
//import com.czm.mybatis01.mapper.EmpMapper;
//import com.czm.mybatis01.mapper.UsrMapper;
//import com.czm.mybatis01.table.Emp;
//import com.czm.mybatis01.table.User;

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

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

@SpringBootTest //springboot整合单元测试的注解
class Mybatis01ApplicationTests {
    //使用@Autowired注解可以【依赖注入】,直接创建UserMapper接口的实例化对象
    //可以理解为跳过了【创建实现接口类】这一步,spring boot帮我们创建好了一个
    @Autowired
    private EmpMapper empMapper;

    @Test
    public void testDelete(){
        //我这里为了简单测试,就当是前端已经把id传过来了,就是17,直接把实际参数传进去
        empMapper.delete(17);
    }

    @Test
    public void testInsert(){
        //这样就错了!!我们在接口定义的参数是一整个对象,不是这么零散的参数
        //empMapper.insert("CZM","岑梓铭",(short)1,"1.jpg",(short)3, LocalDate.of(2024,1,1),1, LocalDateTime.now(),LocalDateTime.now());

        //得先构建一个对象,然后把对应的值调用setter方法设置
        //对象里没用的成员变量就不用设置,不设置的变量就是默认值,也不会报错也不会有影响
        Emp emp1 = new Emp();
        emp1.setJob((short)3);
        emp1.setGender((short)2);
        emp1.setUsername("CYH");
        emp1.setName("蔡勇豪");
        emp1.setImage("19.jpg");
        emp1.setEntrydate(LocalDate.of(2024,1,1));
        emp1.setDept_id(1);
        emp1.setCreate_time(LocalDateTime.now());
        emp1.setUpdate_time(LocalDateTime.now());
        empMapper.insert(emp1);

        System.out.println(emp1.getId());
    }

    @Test
    public void testUpdate(){
        Emp emp2 = new Emp();
        emp2.setId(1);
        emp2.setName("王大陆");
        emp2.setUsername("WDL");
        emp2.setGender((short)1);
        emp2.setImage("19.jpg");
        emp2.setJob((short)2);
        emp2.setEntrydate(LocalDate.of(2024,1,3));
        emp2.setDept_id(2);
        emp2.setUpdate_time(LocalDateTime.now());

        empMapper.Update(emp2);
    }

    @Test
    public void testSelect(){
        empMapper.selectAll();
        empMapper.select(8);
    }

    @Test
    public void TestDifficultSelect(){
        List<Emp> list = empMapper.DifficultSelect("张", (short)1, LocalDate.of(2010,1,1), LocalDate.of(2020,1,1));
        System.out.println(list);
    }
}

基础操作就到此,下一篇:XML映射文件

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

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

相关文章

Transformers是SSMs:通过结构化状态空间对偶性的广义模型和高效算法(二)

文章目录 6、针对SSD模型的硬件高效算法6.1、对角块6.2、低秩块6.3、计算成本 7、Mamba-2 架构7.1、块设计7.2、序列变换的多头模式7.3、线性注意力驱动的SSD扩展8、系统优化对于SSMs8.1、张量并行8.2、序列并行性8.3、可变长度 9、实证验证9.1、合成任务&#xff1a;联想记忆9…

Springcloud-消息总线-Bus

1.消息总线在微服务中的应用 BUS- 消息总线-将消息变更发送给所有的服务节点。 在微服务架构的系统中&#xff0c;通常我们会使用消息代理来构建一个Topic&#xff0c;让所有 服务节点监听这个主题&#xff0c;当生产者向topic中发送变更时&#xff0c;这个主题产生的消息会被…

【产品经理】订单处理9-台账库存管理

在订单处理过程中&#xff0c;台账库存的具体设计怎么做&#xff1f; 在订单处理过程中&#xff0c;分配仓库成功后要扣除仓库库存并计算商品缺货情况&#xff0c;仓库库存就是台账库存。 1&#xff0c;台账库存是针对某个仓库的库存&#xff0c;且台账库存只计算此商品SKU的库…

随州职业技术学院2024年成人高等继续教育招生简章

随州职业技术学院&#xff0c;这所历史悠久、声誉卓著的学府&#xff0c;如今正以其独特的魅力与实力&#xff0c;向广大成人学习者敞开怀抱&#xff0c;宣布启动2024年成人高等继续教育的招生工作。 在这片知识的沃土上&#xff0c;学院以其严谨的教学态度&#xff0c;为无数…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-20填充与步幅

20填充与步幅 import torch from torch import nn# 此函数初始化卷积层权重&#xff0c;并对输入和输出提高和缩减相应的维数 def comp_conv2d(conv2d, X):# 这里的&#xff08;1&#xff0c;1&#xff09;表示批量大小和通道数都是1#将输入张量 X 的形状调整为 (1, 1, height,…

最佳学习率和Batch Size缩放中的激增现象

前言 《Surge Phenomenon in Optimal Learning Rate and Batch Size Scaling》原文地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文&#xff0c;并对其进行了中文翻译。还有部分最佳示例教程。如果有帮助到大家&a…

llm学习-1(包含如何使用github的codespace):

本文学习参考&#xff1a;datawhalechina/llm-universe: 本项目是一个面向小白开发者的大模型应用开发教程&#xff0c;在线阅读地址&#xff1a;https://datawhalechina.github.io/llm-universe/ 一些可使用的大模型地址&#xff1a; Claude 使用地址 PaLM 官方地址 Gemini…

24年hvv前夕,微步也要收费了,情报共享会在今年结束么?

一个人走的很快&#xff0c;但一群人才能走的更远。吉祥同学学安全https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247483727&idx1&sndb05d8c1115a4539716eddd9fde4e5c9&scene21#wechat_redirect这个星球&#x1f517;里面已经沉淀了&#xff1a; 《Ja…

机械拆装-基于Unity-总体设计

前言 在工业设计和制造领域&#xff0c;零部件的拆装技术是一个重要的应用场景&#xff0c;比如我们在工程训练课程中经历的摩托车发动机拆装课程&#xff0c;是机械类学生的必修课程。虚拟拆装系统模拟和仿真了模型的拆装过程&#xff0c;虽然SolidWorks等机械设计软件能够解决…

apipost的安装和测试添加接口能否正常使用

1.进入官网&#xff0c;点击免费使用&#xff08;我是windows 64位&#xff0c;选合适自己的配置&#xff09; 2.开始安装 选仅为我安装——下一步 选择自己的安装目录——点安装 等待 运行——完成 3.apipost一些基本操作——实现添加内容 &#xff08;1&#xff09;新建接口…

【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;http…

5_Clark变换Simulink仿真详细步骤

一、Clark变换的计算过程 根据投影定理: Iα由Ia、Ib、Ic共同投影决定&#xff0c;根据几何原理&#xff0c;IαIa-cos(60&#xff09;*Ib-cos(60&#xff09;*Ic,即是IαIa-0.5*Ib-0.5*Ic Iβ由Ib、Ic共同投影决定&#xff0c;根据几何原理&#xff0c;Iβsin&#xff08;60&a…

下一代的JDK - GraalVM

GraalVM是最近几年Java相关的新技术领域不多的亮点之一&#xff0c; 被称之为革命性的下一代JDK&#xff0c;那么它究竟有什么神奇之处&#xff0c;又为当前的Java开发带来了一些什么样的改变呢&#xff0c;让我们来详细了解下 下一代的JDK 官网对GraalVM的介绍是 “GraalVM 是…

【Python机器学习】模型评估与改进——交叉验证

交叉验证是一种评估泛化性能的统计学方法&#xff0c;它比单次划分训练集和测试集的方法更稳定、前面。在交叉验证中&#xff0c;数据被多次划分&#xff0c;并且需要训练多个模型。最常用的交叉验证是k折交叉验证&#xff0c;其中k是由用户指定的数字&#xff0c;通常取5或10,…

MySQL高级-InnoDB引擎-事务日志- redo log(事务持久性的保证)

文章目录 1、redo log1.1、重做日志缓冲&#xff08;redo log buffer&#xff09;1.2、重做日志文件&#xff08;redo log file&#xff09; 2、如果没有redo log&#xff0c;可能会存在什么问题的&#xff1f;2.2、我们一起来分析一下。 2.2、那么&#xff0c;如何解决上述的问…

240629_昇思学习打卡-Day11-Vision Transformer中的self-Attention

240629_昇思学习打卡-Day11-Transformer中的self-Attention 根据昇思课程顺序来看呢&#xff0c;今儿应该看Vision Transformer图像分类这里了&#xff0c;但是大概看了一下官方api&#xff0c;发现我还是太笨了&#xff0c;看不太明白。正巧昨天学SSD的时候不是参考了太阳花的…

Databend db-archiver 数据归档压测报告

Databend db-archiver 数据归档压测报告 背景准备工作Create target databend table启动 small warehouse准备北京区阿里云 ECSdb-archiver 的配置文件准备一亿条源表数据开始压测 背景 本次压测目标为使用 db-archiver 从 MySQL 归档数据到 Databend Cloud&#xff0c; 归档的…

qt 开发笔记 动态链接库应用

1.概要 1.1 需求 库有两种&#xff0c;动态库和静态库&#xff0c;这里说的是动态库&#xff1b;动态库的加载方式有两种&#xff0c;一直是静态的一种是动态的&#xff0c;这里的静态加载是指静态加载动态&#xff0c;是一种加载动态库的方式。也有一种动态加载的方式&#…

衣服、帽子、鞋子相关深度学习数据集大合集(1)

最近收集了一大波关于衣物深度学习数据集&#xff0c;主要有衣服、帽子、鞋子、短裤、短袖、T恤等。 1、运动裤、短裤图片数据集 数据格式&#xff1a;图片 是否标注&#xff1a;已标注 标注格式&#xff1a;yolov8 图片数量&#xff1a;915张 查看地址&#xff1a;https…

# Sharding-JDBC从入门到精通(2)- Sharding-JDBC 介绍

Sharding-JDBC从入门到精通&#xff08;2&#xff09;- Sharding-JDBC 介绍 一、概述-分库分表所带来的问题 1、分库分表带来的问题 分库分表能有效的缓解了单机和单库带来的性能瓶颈和压力&#xff0c;突破网络 IO、硬件资源、连接数的瓶颈&#xff0c;同时也带来了一些问题…