JavaWeb02-MyBatis

news2025/1/16 13:40:22

目录

一、MyBatis

1.概述

2.JavaEE三层架构简单介绍

(1)表现层

(2)业务层

(3)持久层

3.框架

4.优势

(1)JDBC的劣势

(2)MyBatis优化

5.使用

(1)快速上手

(2)框架使用部分

(3)编码部分

6.Mapper代理开发

(1)Mapper代理开发的好处

(2)Mapper代理使用步骤

7.Mybatis的配置文件说明

8.查询过程出现的问题

9.xml文件中编写SQL语句没有提示

10.查操作

(1)单条件查询

(2)多条件查询

11.动态查询

(1)多条件动态查询

(2)单条件动态查询(多选一)

12.增操作

(1)主键返回

13.删操作

14.改操作

(1)修改字段数据

(2)修改动态字段数据

15.删操作

(1)单个删除

(2)批量删除

16.Mybatis参数传递

(1)单个参数

(2)多个参数

17.注解方式完成增删改查


一、MyBatis

1.概述

  • MyBatis 是一款优秀的持久层框架,用于简化JDBC 开发

  • MyBatis 本是Apache 的一个开源项目iBatis,2010年这个项目由apache softwarefoundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github

  • 网址:mybatis – MyBatis 3 | 简介

辅助插件:MybatisX

2.JavaEE三层架构简单介绍

(1)表现层

页面展示

(2)业务层

逻辑处理

(3)持久层

负责将数据到保存到数据库的那一层代码

3.框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型

  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

4.优势

(1)JDBC的劣势
  • 硬编码

    • 注册驱动,获取连接

    • SQL语句

  • 操作较繁琐

    • 手动设置参数

    • 手动封装结果集

(2)MyBatis优化

MyBatis 免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作

5.使用

(1)快速上手

框架使用部分:

  • 创建模块,导入坐标

  • 编写核心配置文件

  • 编写SQL映射文件

编码部分:

  • 定义实体类(POJO类)

  • 加载核心配置文件,获取SqlSessionFactory对象

  • 获取SqlSession对象

  • 释放资源

(2)框架使用部分
  • 导入坐标

     
   <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
<!--        mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
​
        <!-- 添加slf4j日志api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.20</version>
        </dependency>
        <!-- 添加logback-classic依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- 添加logback-core依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

  • 核心配置文件,文件名通常:mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///test?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        加载SQL的映射文件-->
        <mapper resource="ProductMapper.xml"/>
    </mappers>
</configuration>

  • 编写SQL映射文件,名称:要操作的表名+Mapper(ProductMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    namespace:名称空间
​
-->
<mapper namespace="product">
<!--
    id:sql语句的唯一标识
    resultType:返回结果类型
-->
    <select id="selectAll" resultType="pojo.Product">
        select * from Product;
    </select>
</mapper>

如果映射文件SQL语句中表名爆红,只是警告,并不影响实际操作

产生原因:ldea和数据库没有建立连接,不识别表信息

解决方法:用IDEA与数据库建立连接即可

(3)编码部分
  • 定义实体类

要与数据库中的数据类型对应

  • 使用

public class MybatisDemo {
    public static void main(String[] args) throws IOException {
//        1.加载核心配置文件,直接从官网粘过来就行了,获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
​
//        2.获取sqlSession对象
        final SqlSession sqlSession = sqlSessionFactory.openSession();
​
//        3.执行SQL
        final List<Product> list = sqlSession.selectList("product.selectAll");
​
        System.out.println(list);
//        4.释放资源
        sqlSession.close();
​
    }
}

6.Mapper代理开发

(1)Mapper代理开发的好处
  • 解决原生方式中的硬编码(更安全)

  • 简化后期执行SQL

(2)Mapper代理使用步骤
  • 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

检查方式:编译项目

在文件夹中打开

如下图即为成功

  • 设置SQL映射文件的namespace属性为Mapper接口全限定名

  • 在Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

如果Mapper接口名称和SQL映射文件名称相同,并且在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载,如下图

  • 编码

    • 通过 SqlSession的 getMapper方法获取 Mapper接口的代理对象

    • 调用对应方法完成sql的执行

//        3.执行SQL
//        3-1.获取接口的代理对象
        final ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        final List<Product> products = mapper.selectAll();
        products.forEach(product -> System.out.println(product));

7.Mybatis的配置文件说明

可访问网址查看,后续再补

8.查询过程出现的问题

如以下情况

原因:实体类属性名称与数据库字段名称不一致,导致不能自动封装数据

解决方法一:

  • 为数据库字段起别名,让其和实体类属性名称一致(麻烦,不推荐)

方法一的优化方案:

  • 写一个SQL语句块,不灵活,还是不推荐~

解决方法二:

  • 结果映射,resultMap【有两个子标签,一个result,一个id,其中id子标签用来完成主键字段的映射,result用来映射普通字段的映射,使用方法与result一致】

  • type支持别名

再次运行

9.xml文件中编写SQL语句没有提示

在xml文件中按alt+enter

往下拉,根据安装的数据库选择合适的即可

10.查操作

(1)单条件查询
<!--
    参数占位符:
    1.#{}:将其替换为?,为了防止SQL注入。      使用场景:参数传递
    2.${}:拼SQL,存在SQL注入问题。           使用场景:表名或列名不固定的情况,但要注意SQL注入问题
​
    参数类型:parameterType,可以省略
​
    特殊字符处理:
    1.转义字符:适合少量
    2.CDATA区:适合大量,CD回车即可
-->
    <select id="selectById"  resultMap="resultMap_Employee">
        select * from employees where emp_no = #{id}
    </select>
​
    <resultMap id="resultMap_Employee" type="employee">
<!--        将不一样的属性名写一下即可-->
        <result column="emp_no" property="empNo"/>
        <result column="birth_date" property="birthDate"/>
        <result column="first_name" property="firstName"/>
        <result column="last_name" property="lastName"/>
        <result column="hire_date" property="hireDate"/>
​
    </resultMap>

(2)多条件查询

Mybatis提供了三种方式:

mapper.xml:

<select id="selectByCondition01" resultMap="resultMap_Employee">
    select *
    from employees
    where emp_no > #{empNo}
    and gender = #{gender}
</select>
​
<select id="selectByCondition02" resultMap="resultMap_Employee">
    select *
    from employees
    where emp_no > #{empNo}
      and gender = #{gender}
</select>
​
<select id="selectByCondition03" resultMap="resultMap_Employee">
    select *
    from employees
    where emp_no > #{empNo}
      and gender = #{gender}
</select>
​
    <resultMap id="resultMap_Employee" type="employee">
<!--        将不一样的属性名写一下即可-->
        <result column="emp_no" property="empNo"/>
        <result column="birth_date" property="birthDate"/>
        <result column="first_name" property="firstName"/>
        <result column="last_name" property="lastName"/>
        <result column="hire_date" property="hireDate"/>
​
    </resultMap>

pojo实体类:

public class Employee {
    private Integer empNo;
    private Date birthDate;
    private String firstName;
    private String lastName;
    private Character gender;
    private Date hireDate;
​
    public Employee() {
    }
​
    public Employee(Integer empNo, Character gender) {
        this.empNo = empNo;
        this.gender = gender;
    }
​
    public Employee(Integer empNo, Date birthDate, String firstName, String lastName, Character gender, Date hireDate) {
        this.empNo = empNo;
        this.birthDate = birthDate;
        this.firstName = firstName;
        this.lastName = lastName;
        this.gender = gender;
        this.hireDate = hireDate;
    }
​
    public Integer getEmpNo() {
        return empNo;
    }
​
    public void setEmpNo(Integer empNo) {
        this.empNo = empNo;
    }
​
    public Date getBirthDate() {
        return birthDate;
    }
​
    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
​
    public String getFirstName() {
        return firstName;
    }
​
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
​
    public String getLastName() {
        return lastName;
    }
​
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
​
    public Character getGender() {
        return gender;
    }
​
    public void setGender(Character gender) {
        this.gender = gender;
    }
​
    public Date getHireDate() {
        return hireDate;
    }
​
    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }
​
    @Override
    public String toString() {
        return "Employee{" +
                "empNo=" + empNo +
                ", birthDate=" + birthDate +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", gender=" + gender +
                ", hireDate=" + hireDate +
                '}';
    }
}

mapper.EmployeeMapper

/**
 * 条件查询01
 * 查询员工工号>?且性别为?的所有员工信息
 * *参数接收方式
 * 1.散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符名称”)
 * @param empNo 员工工号
 * @param character 性别
 * @return Employee对象集合
 */
List<Employee> selectByCondition01(@Param("empNo")int empNo,@Param("gender")Character character);
​
/**
 * 条件查询02:实体类封装参数
 * @param employee 员工对象,注意对象的属性名称要和SQL参数占位符名称一致
 * @return 员工对象集合
 */
List<Employee> selectByCondition02(Employee employee);
​
/**
 * 条件查询03:map集合
 * @param map map集合,要保证SQL中的参数占位符名称和map集合的键名称一致
 * @return 员工对象集合
 */
List<Employee> selectByCondition03(Map map);

测试:

@Test
public void selectByCondition01() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
​
    final SqlSession sqlSession = sqlSessionFactory.openSession();
​
    final List<Employee> employees = sqlSession.getMapper(EmployeeMapper.class).selectByCondition01(10001, 'F');
    employees.forEach(employee -> System.out.println(employee));
    sqlSession.close();
}
    @Test
    public void selectByCondition022() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
​
        final SqlSession sqlSession = sqlSessionFactory.openSession();
​
//        final List<Employee> employees = sqlSession.getMapper(EmployeeMapper.class).selectByCondition02(new Employee(10001,'F'));
        Employee employee = new Employee();
        employee.setEmpNo(10001);
        employee.setGender('F');
        final List<Employee> employees = sqlSession.getMapper(EmployeeMapper.class).selectByCondition02(employee);
        employees.forEach(e -> System.out.println(e));
        sqlSession.close();
    }
@Test
public void selectByCondition03() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
​
    final SqlSession sqlSession = sqlSessionFactory.openSession();
    
    Map map = new HashMap();
    Integer empNo = 10001;
    Character gender = 'F';
    map.put("empNo",empNo);
    map.put("gender",gender);
​
    final List<Employee> employees = sqlSession.getMapper(EmployeeMapper.class).selectByCondition03(map);
    employees.forEach(e -> System.out.println(e));
    sqlSession.close();
}

11.动态查询

SQL语句会随着用户的输入或外部条件的变化而变化,我们称为 动态SQL

mybatis对动态SQL用很大的支撑

  • if:条件判断

    • test:逻辑判断

  • choose(when,otherwise)

  • trim(where,set)

  • foreach

更具体的可查阅官网,动态SQL

(1)多条件动态查询

修改一下:

<select id="selectByCondition03" resultMap="resultMap_Employee">
    select *
    from employees
    where
        <if test="empNo != null and empNo != ''">
            emp_no > #{empNo}
        </if>
        <if test="gender !=null ">
            and gender = #{gender}
        </if>
​
</select>

测试时会发现如果没有第一个参数后面会报错

解决方法:

  • 第一种方法:统一格式,第一个条件为一个恒等式

            where
#             恒等式
            <if test="empNo != null and empNo != ''">
                and emp_no > #{empNo}
            </if>
            <if test="gender !=null ">
                and gender = #{gender}
            </if>
  • 第二种方法:使用< where >标签替换where关键字

<where>
    <if test="empNo != null and empNo != ''">
        and emp_no > #{empNo}
    </if>
    <if test="gender !=null ">
        and gender = #{gender}
    </if>
</where>

测试:

(2)单条件动态查询(多选一)
<select id="selectByConditionSingle" resultMap="resultMap_Employee">
        select * from employees
    where
        <choose>
            <when test="empNo != null">
                emp_no > #{empNo}
            </when>
            <when test="gender !=null">
                gender = #{gender}
            </when>
            <when test="lastName != null">
                last_name like #{lastName}
            </when>
            <otherwise>
<!--                相当于java switch中的default,写个恒等式即可-->
                
                1 = 1
            </otherwise>
        </choose>
    </select>

或者

<where>
    <choose>
        <when test="empNo != null">
            emp_no > #{empNo}
        </when>
        <when test="gender !=null">
            gender = #{gender}
        </when>
        <when test="lastName != null">
            last_name like #{lastName}
        </when>
    </choose>
</where>

12.增操作

<insert id="add">
    insert into employees
        (first_name,last_name,gender,birth_date,hire_date)
    VALUES
        (#{firstName},#{lastName},#{gender},#{birthDate},#{hireDate})
</insert>

测试的时候会发现代码运行成功但并没有数据!

打开日志,会发现roll back了

观察日志就会发现 -Setting autocommit to false on JDBC Connection

所以在增操作后,需要使用commit()手动提交一次事务!

再次运行,数据添加成功

如果不想手动提交,可在openSession()传递布尔值以开启是否自动提交

  • mybatis默认是开启事务的

(1)主键返回

目的:添加完数据后,获取该数据的id值

<insert id="add" useGeneratedKeys="true" keyProperty="empNo">
    insert into employees
        (first_name,last_name,gender,birth_date,hire_date)
    VALUES
        (#{firstName},#{lastName},#{gender},#{birthDate},#{hireDate})
</insert>

13.删操作

同增

14.改操作

(1)修改字段数据
void update(Employee employee);
<update id="update">
    update employees
    set
        first_name = #{firstName},
        last_name = #{lastName},
        gender = #{gender}
    where emp_no = #{empNo}
</update>

(2)修改动态字段数据
<update id="update02">
    update employees
    <set>
        <if test="firstName != null and firstName != ''">
            first_name = #{firstName},
        </if>
        <if test="lastName != null and lastName != ''">
            last_name = #{lastName}
        </if>
    </set>
    where emp_no = #{empNo}
​
</update>

15.删操作

(1)单个删除
void deleteById(Integer empNo);
<delete id="deleteById">
    delete
    from employees
    where emp_no = #{empNo}
</delete>
(2)批量删除
/**
 * 批量删除
 * @param empNos id数组
 */
void deleteByIds(@Param("empNos") Integer[] empNos);
<!--    mybatis会将数组参数封装为一个map集合
        默认 key = array
            value = 对应数组
        可以使用@Param改变map集合的默认key名称
        foreach属性:separator分隔符
            -->
<delete id="deleteByIds">
    delete from employees
    where emp_no in
    <foreach collection="empNos" item="empNo" separator="," open="(" close=")">
        #{empNo}
    </foreach>
    ;
</delete>

/**
 * 批量删除02
 * @param empNos id数组
 */
void deleteByIds02(Integer[] empNos);
<delete id="deleteByIds02">
    delete from employees
    where emp_no in (
    <foreach collection="array" item="empNo" separator=",">
        #{empNo}
    </foreach>
    );
​
</delete>

测试

Integer[] integers = {10023,10024,10025,10026,10027,10018,10019,10020,10021,10022};
try {
    sqlSession.getMapper(EmployeeMapper.class).deleteByIds(integers);
    sqlSession.commit();
} catch (Exception e) {
    System.out.println("删除失败");
    e.printStackTrace();
}

16.Mybatis参数传递

(1)单个参数
  • pojo实体类:直接使用,属性名和参数占位符名称一致即可

  • Map集合:直接使用,键名和参数占位符名称一致即可

  • Collection:封装为map

  • List:封装为map

  • Array:封装为map

  • 其他:直接使用

(2)多个参数
  • 会将参数列表封装为map集合,由于默认可读性太差,可以使用@Param替换Map集合中默认的arg键名

  • map.put(”arg0“,参数值1)

  • map.put(”param1“ ,参数值1)

  • map.put(”param2“,参数值2)

  • map.put(”arg1“,参数值2)

MyBatis提供了 ParamNameResolver 类来进行参数封装

封装方法为getNamedParams

  1. 在IDEA中,按住ctrl+shift+a打开action

  2. 将 ParamNameResolver粘进搜索框,选择Classes

  3. 搜索出来第一个就是,点进去

  4. 之后ctrl f。在搜索框输入getNamedParams

17.注解方式完成增删改查

使用注解方式会比配置文件开发更加高效

  • 查询:@Select

  • 添加;@Insert

  • 修改:@Update

  • 删除:@Delete

/**
 * 根据id查询
 * @param empNo id
 * @return Employee对象
 */
@Select("select * from employees where emp_no = #{empNo}")
Employee selectById(int empNo);

注意:

  • 注解完成简单功能

  • 配置文件完成复杂功能,(动态SQL)

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

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

相关文章

Golang的for循环变量和goroutine的陷阱,1.22版本的更新

先来看一段golang 1.22版本之前的for循环的代码 package mainimport "fmt"func main() {done : make(chan bool)values : []string{"chen", "hai", "feng"}for _, v : range values {fmt.Println("start")go func() {fmt.P…

Gemini 下一章节即将拉开帷幕

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

树与二叉树---数据结构

树作为一种逻辑结构&#xff0c;同时也是一种分层结构&#xff0c;具有以下两个特点&#xff1a; 1&#xff09;树的根结点没有前驱&#xff0c;除根结点外的所有结点有 且只有一个前驱。 2&#xff09;树中所有结点可以有零个或多个后继。 树结点数据结构 满二叉树和完全二…

洛谷使用指南

详细看——洛谷的规则 1.注册账号 1.打开洛谷首页 这样就对了&#xff01;&#xff01;&#xff01; 2.点击注册 当显示以上页面时表示进入了注册页面。 3.登录 当注册好后就可以登陆了。 当显示以上页面时表示进入了登录页面。 2.题库使用 当单击题库后&#xff0c;会出…

算法练习-二叉搜索树中的搜索(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

二、OpenAI开发者快速入门

启动并运行OpenAI API OpenAI API 为开发者提供一个简单的接口&#xff0c;使其能够在他们的应用中创建一个智能层&#xff0c;由OpenAI最先进的模型提供支持。聊天补全端点为ChatGPT提示支持&#xff0c;一种简单的方法是&#xff1a;输入文本&#xff0c;使用GPT-4模型输出。…

在JSP中实现JAVABEAN

在JSP中实现JAVABEAN 问题陈述 创建Web应用程序以连接数据库并检索作者名、地址、城市、州及邮政编码等与作者的详细信息。JavaBean组件应接受作者ID、驱动程序名及URL作为参数。信息要从authors表中检索。 解决方案 要解决上述问题,需要执行以下任务: 创建Web应用程序。创…

macbookair怎么清理内存 ?如何利用 CleanMyMac X 进行系统清理

macbookair怎么清理内存 清理MacBook Air的内存可以通过以下几种方法&#xff1a; 优化储存空间。在MacBook Air上&#xff0c;可以通过“优化储存空间”来释放空间。这包括将文件储存在iCloud中&#xff0c;如桌面、文稿和iCloud信息&#xff0c;以及自动移除在iCloud中观看…

Lombok 高级说明

优质博文&#xff1a;IT-BLOG-CN 一、痛点 【1】代码臃肿&#xff1a;POJO中的getter/setter/equals/hashcode/toString等&#xff1b; 【2】样板式代码&#xff1a;I/O流的关闭操作等&#xff1b; Lombok是一个可以通过注解简化Java代码开发的工具&#xff0c;能够在我们编…

2.8日学习打卡----初学RabbitMQ(三)

2.8日学习打卡 一.springboot整合RabbitMQ 之前我们使用原生JAVA操作RabbitMQ较为繁琐&#xff0c;接下来我们使用 SpringBoot整合RabbitMQ&#xff0c;简化代码编写 创建SpringBoot项目&#xff0c;引入RabbitMQ起步依赖 <!-- RabbitMQ起步依赖 --> <dependency&g…

关节点检测

https://www.bilibili.com/video/BV19g4y1777q/?p2&spm_id_frompageDriver 关节点检测全流程 YOLO:单阶段&#xff0c;快&#xff1b; MMPose&#xff1a;双阶段&#xff0c;准&#xff1b; 标注工具Labelme 用Labelme标注样本数据集

利用Pybind11封装Python版的WiringPi!

原版的WiringPi是一个用于树莓派的GPIO库&#xff0c;用C语言开发&#xff0c;仓库地址&#xff1a;https://github.com/WiringPi/WiringPi。该库允许用户以编程方式访问和控制树莓派的GPIO引脚。而随着Python在嵌入式设备上的快速发展&#xff0c;其对底层引脚的操作也变得越来…

OpenAI给DALL-E 3来了个新动作,加入了全新水印技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

老胡的周刊(第128期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 coze-discord-proxy[2] 代理 Discord-Bot 对…

018 Linux

文章目录 操作系统定义分类Linux系统构成 Linux文件系统Linux常用命令基础操作命令文件操作压缩解压权限管理显示展示命令其他命令 vi编译器操作使用 添加用户基本概念用户管理命令 ubuntu软件安装ssh服务终端启动Python服务 操作系统 定义 操作系统是管理计算机硬件与软件资…

【超高效!保护隐私的新方法】针对图像到图像(l2l)生成模型遗忘学习:超高效且不需要重新训练就能从生成模型中移除特定数据

针对图像到图像生成模型遗忘学习&#xff1a;超高效且不需要重新训练就能从生成模型中移除特定数据 提出背景如何在不重训练模型的情况下从I2I生成模型中移除特定数据&#xff1f; 超高效的机器遗忘方法子问题1: 如何在图像到图像&#xff08;I2I&#xff09;生成模型中进行高效…

archlinux 使用 electron-ssr 代理 socks5

提前下载好 pacman 包 https://github.com/shadowsocksrr/electron-ssr/releases/download/v0.2.7/electron-ssr-0.2.7.pacman 首先要有 yay 和 aur 源&#xff0c;这个可以参考我之前的博客 虚拟机内使用 archinstall 安装 arch linux 2024.01.01 安装依赖 yay 安装的&#…

堆排序----C语言数据结构

目录 引言 堆排序的实现**堆的向下调整算法** 对排序的时间复杂度建堆的时间复杂度&#xff1a;排序过程的时间复杂度&#xff1a;总体时间复杂度&#xff1a; 引言 堆排序&#xff08;Heap Sort&#xff09;是一种基于比较的排序算法&#xff0c;利用堆的数据结构来实现。它的…

数据湖的整体思路

湖本质上是一个集中化&#xff0c;中心化的&#xff0c;一体化的存储技术&#xff0c;并且在其之上追求技术架构的统一化&#xff0c;如流批一体&#xff0c;服务分析一体化。 当数据湖成为中心&#xff0c;那么就可以围湖而建“数据服务环”&#xff0c;环上的服务包括了数仓、…

基于tomcat运行jenkins常见的报错处理

目录 1.jenkins.util.SystemProperties$Listener错误 升级jdk11可能遇到的坑 2.java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 3.There were errors checking the update sites: UnknownHostException:updates.jenkins.i…