当前位置: 首页 > news >正文

MyBatis入门的详细应用实例

目录

  • MyBatis
    • 第一章:代理Dao方式的CRUD操作
      • 1. 代理Dao方式的增删改查
    • 第二章:MyBatis参数详解
      • 1. parameterType
      • 2. resultType
    • 第三章:SqlMapConfig.xml配置文件
      • 1. 定义properties标签的方式管理数据库的信息
      • 2. 类型别名定义

MyBatis

第一章:代理Dao方式的CRUD操作

1. 代理Dao方式的增删改查

  1. 创建项目

  2. UserMapper接口代码

    findAll 方法用于获取所有用户的信息,将以 List<User> 形式返回。

    findById 是根据用户的唯一标识(userId)查找用户信息,返回单个 User 对象。insert 方法接收一个 User 对象作为参数,将其存储到数据库中。

    update 方法用于更新用户信息,接收一个 User 对象,通过对象的属性值更新数据库中对应记录。

    delete 方法依据用户 ID 删除相应记录,接收一个 Integer 类型的用户 ID。findByName 可根据用户名进行查找,以字符串形式接收用户名,结果以 List<User> 形式返回,适用于模糊查询或精确查询。

    findByCount 方法计算用户的总数,结果以 Integer 类型返回。

    package cn.tx.mapper;import java.util.List;import cn.tx.domain.User;public interface UserMapper {public List<User> findAll();public User findById(Integer userId);public void insert(User user);public void update(User user);public void delete(Integer userId);public List<User> findByName(String username);public Integer findByCount();}
    
  3. UserMapper.xml的配置文件代码

    元素的 namespace 属性绑定到对应的 UserMapper 接口,确保 XML 中的操作与接口方法关联。

    元素中的 findAll 操作,使用 select * from user 语句查询所有用户,结果将映射为 com.qcbyjy.domain.User 类型的对象。

    findById 的 select 操作通过 #{id} 占位符接收 findById 方法传入的用户 ID,查询结果映射为 com.qcbyjy.domain.User 类型,参数为 int 类型。

    insert 操作除了插入数据的 SQL 语句外,使用 元素在插入操作后执行,通过 select last_insert_id() 获取新插入记录的主键值,keyProperty 指明将主键值存储在 User 对象的 id 属性中,order=“AFTER” 表示在插入之后执行,resultType 为 Integer。

    update 操作使用 #{} 占位符接收 update 方法传入的 User 对象的属性,更新用户表中相应记录。

    delete 操作使用 #{id} 接收 delete 方法传入的用户 ID,删除相应记录。

    findByName 操作的 select 语句使用 like ‘%${value}%’ 进行模糊查询,其中 ${value} 接收 findByName 方法传入的用户名,存在 SQL 注入风险,不推荐使用。

    findByCount 操作通过 select count(*) from user 统计用户表中的记录数,结果为 int 类型。

    <?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.qcbyjy.mapper.UserMapper"><select id="findAll" resultType="com.qcbyjy.domain.User">select * from user</select><!-- 通过id查询 SQL语句使用#{占位符的名称,名称可以任意},仅限于基本数据类型和String类型--><select id="findById" resultType="com.qcbyjy.domain.User" parameterType="int">select * from user where id = #{id};</select><!--保存操作--><insert id="insert" parameterType="com.qcbyjy.domain.User">/*keyProperty表示要返回的属性名称order取值AFTER表示插入数据后的行为resultType表示返回值的类型*/<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select last_insert_id();</selectKey>insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})</insert><!-- 修改 --><update id="update" parameterType="com.qcbyjy.domain.User">update user set username = #{username},birthday = #{birthday},sex = #{sex},address=#{address} where id = #{id}</update><!-- 删除 --><delete id="delete" parameterType="Integer">delete from user where id = #{id}</delete><!-- 模糊查询 --><select id="findByName" resultType="com.qcbyjy.domain.User" parameterType="string"><!-- 第一种方式的SQL语句 select * from user where username  like #{username}--><!-- 第二章SQL语句的编写 强调:'%${value}%'不能修改,固定写法(不推荐使用)  -->select * from user where username  like '%${value}%'</select><!-- 具体函数的查询 --><select id="findByCount" resultType="int">select count(*) from user</select></mapper>
    
  4. UserTest的代码

    • init 方法中,首先使用 Resources.getResourceAsStream("SqlMapConfig.xml") 从类路径加载配置文件,然后使用 SqlSessionFactoryBuilder 创建 SqlSessionFactory,进而创建 SqlSession,最终通过 session.getMapper(UserMapper.class) 获取 UserMapper 的代理对象。
    • @Before 注解的 init 方法中进行资源的初始化,在 @After 注解的 destory 方法中关闭输入流和 SqlSession,确保资源的正确管理。
    • testFindAll 测试方法调用 mapper.findAll() 方法查询所有用户,将结果存储在 List<User> 中并遍历打印。
    • testFindById 测试方法调用 mapper.findById(41) 查找 ID 为 41 的用户并打印。
    • testInsert 测试方法创建一个新的 User 对象,设置属性,调用 mapper.insert(user) 插入用户,使用 session.commit() 提交事务,并打印新插入用户的 id
    • testUpdate 测试方法先查找用户,修改用户信息,调用 mapper.update(user) 更新用户信息,再提交事务。
    • testDelete 测试方法调用 mapper.delete(48) 删除 ID 为 48 的用户,提交事务。
    • testFindByName 测试方法有两种方式,第一种传入 %王% 进行模糊查询,第二种只传入 ,根据配置自动添加通配符进行模糊查询,都将结果存储在 List<User> 中并遍历打印。
    • testFindByCount 测试方法调用 mapper.findByCount() 获取用户数量并打印。
    package cn.tx.test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;import cn.tx.domain.User;
    import cn.tx.mapper.UserMapper;public class UserTest {private InputStream in;private SqlSession session;private UserMapper mapper;@Beforepublic void init() throws Exception {// 加载配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");// 创建工厂对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session对象session = factory.openSession();// 获取到代理对象mapper = session.getMapper(UserMapper.class);}@Afterpublic void destory() throws IOException {in.close();session.close();}/*** 测试查询所有的方法* @throws Exception */@Testpublic void testFindAll() throws Exception {List<User> list = mapper.findAll();// 遍历for (User user : list) {System.out.println(user);}in.close();}@Testpublic void testFindById() throws Exception {User user = mapper.findById(41);System.out.println(user);in.close();}@Testpublic void testInsert() throws Exception {User user = new User();user.setUsername("美美");user.setBirthday(new Date());user.setSex("男");user.setAddress("顺义");mapper.insert(user);session.commit();System.out.println(user.getId());}@Testpublic void testUpdate() throws Exception {User user = mapper.findById(41);user.setUsername("小凤");mapper.update(user);session.commit();}@Testpublic void testDelete() throws Exception {mapper.delete(48);session.commit();}// 第一种@Testpublic void testFindByName() throws Exception {List<User> list = mapper.findByName("%王%");for (User user : list) {System.out.println(user);}}// 第二种@Testpublic void testFindByName() throws Exception {List<User> list = mapper.findByName("王");for (User user : list) {System.out.println(user);}}@Testpublic void testFindByCount() throws Exception {Integer count = mapper.findByCount();System.out.println("总记录数:"+count);}}
    
  5. 模糊查询符号使用的区别

    通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。通过$可以将传入的内容拼接在中且不进行类型转换,${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
    

第二章:MyBatis参数详解

1. parameterType

  1. 简单数据类型

    int double类型 String类型 long

    简单的写法:java.lang.Integer --> int integer Int Integer 都可以,框架提供简写的方式。

  2. POJO(JavaBean实体类)对象类型,默认是不能简写,可以配置。

    User对象

  3. POJO包装对象类型

    包含更多的实体类

    package cn.tx.domain;import java.io.Serializable;/*** * * * **/
    public class QueryVo implements Serializable {// 自己属性private String name;// user属性private User user;// role属性private Role role;public String getName() {return name;}public void setName(String name) {this.name = name;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}
    }// 测试包装类查询
    public List<User> findByVo(QueryVo vo);<!--包装类测试查询-->
    <select id="findByVo" parameterType="com.qcbyjy.domain.QueryVo" resultType="com.qcbyjy.domain.User">select * from user where username = #{user.username}
    </select>

2. resultType

  1. 返回简单数据类型

    int double long String

  2. 返回POJO数据类型

    返回User对象类型

  3. resultMap结果类型

    resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

    <!--演示resultMap配置-->
    <select id="findUsers" resultMap="userMap">select id _id,username _username,birthday _birthday,sex _sex,address _address from user
    </select><!--配置resultMap,用来进行数据封装id="唯一的名称,用来被引用的"type="进行封装数据的类型"-->
    <resultMap id="userMap" type="com.qcbyjy.domain.User"><!--property="JavaBean中的属性"column="表中的字段"--><result property="id" column="_id"/><result property="username" column="_username" /><result property="birthday" column="_birthday" /><result property="sex" column="_sex" /><result property="address" column="_address" />
    </resultMap>
    

第三章:SqlMapConfig.xml配置文件

1. 定义properties标签的方式管理数据库的信息

  1. 把数据库的信息定义property标签中的方式,在 properties 元素内直接定义 jdbc 相关属性,如 jdbc.driverjdbc.url 等,这些属性在 dataSource 元素中通过 ${} 占位符使用,实现了配置信息的集中管理。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration><properties><property name="jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="jdbc.url" value="jdbc:mysql:///mybatis_db"/><property name="jdbc.username" value="root"/><property name="jdbc.password" value="root"/></properties><!-- 配置环境们 --><environments default="mysql"><!-- 配置具体的环境 --><environment id="mysql"><!-- 配置事务管理类型 --><transactionManager type="JDBC"/><!-- 配置是否需要使用连接池,POOLED使用,UNPOOLED不使用 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加载映射的配置文件 --><mappers><mapper resource="mappers/UserMapper.xml"/></mappers>
    </configuration>
    
  2. 在项目中定义jdbc.properties属性文件,存储数据库相关的信息,统一管理,在 SqlMapConfig.xml 中通过 <properties resource="jdbc.properties"></properties> 引入,使配置信息更易于维护。

    1. jdbc.properties属性文件

      jdbc.driver=com.mysql.jdbc.Driver
      jdbc.url=jdbc:mysql:///mybatis_db
      jdbc.username=root
      jdbc.password=root
      
    2. SqlMapConfig.xml的配置文件

      在 environments 元素中设置事务管理类型和数据源类型,数据源类型可选择使用连接池(POOLED)或不使用(UNPOOLED)。

      元素加载映射文件,将 UserMapper.xml 引入。

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration><!--  <properties resource="jdbc.properties"></properties>读取外部的配置文件resource="文件的相对路径写法"。例如:jdbc.properties 或者 cn/tx/xxx/jdbc.properties--><properties resource="jdbc.properties"></properties><!-- 配置环境们 --><environments default="mysql"><!-- 配置具体的环境 --><environment id="mysql"><!-- 配置事务管理类型 --><transactionManager type="JDBC"/><!-- 配置是否需要使用连接池,POOLED使用,UNPOOLED不使用 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加载映射的配置文件 --><mappers><mapper resource="mappers/UserMapper.xml"/></mappers>
      </configuration>
      

    2. 类型别名定义

    1. MyBatis自已有类型别名的注册类,咱们编写int或者integer通过注册可以找到java.lang.Integer

    2. 咱们自己也可以进行别名的注册

      1. SqlMapConfig.xml的配置文件

        <!-- 定义别名 -->
        <typeAliases><!-- 把com.qcbyjy.domain.User使用user别名来显示,别名user User USER都可以,默认是忽略大写的 <typeAlias type="com.qcbyjy.domain.User" alias="user"/>--><!-- 针对com.qcbyjy.domain包下的所有的类,都可以使用当前的类名做为别名 --><package name="com.qcbyjy.domain"/>
        </typeAliases>
      2. UserMapper.xml的配置文件使用别名

        <!--  resultType="com.qcbyjy.domain.User" 原来是全路径resultType="user" 现在使用的是别名的方式-->
        <select id="findAll" resultType="user">select * from user
        </select>
        

相关文章:

MyBatis入门的详细应用实例

目录 MyBatis第一章&#xff1a;代理Dao方式的CRUD操作1. 代理Dao方式的增删改查 第二章&#xff1a;MyBatis参数详解1. parameterType2. resultType 第三章&#xff1a;SqlMapConfig.xml配置文件1. 定义properties标签的方式管理数据库的信息2. 类型别名定义 MyBatis 第一章&…...

23 go语言(golang) - gin框架安装及使用(四)

五、跨域资源共享 跨域资源共享&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;是一种机制&#xff0c;它允许来自不同源的请求访问资源。默认情况下&#xff0c;浏览器出于安全原因会阻止跨域 HTTP 请求。Gin 框架本身没有内置的 CORS 支持&#xff…...

信息安全概论

文章目录 预测题重要考点1.遇到什么威胁有什么漏洞怎么缓解分析题2.网络安全现状分析 2.网络安全亮点 时间信息安全概论期末简答题软件学院实验室服务器安全风险分析与PDRR策略 1.1 信息时代的特点1.2 信息安全威胁1.3信息安全趋势1.4 研究网络与信息安全的意义2.1安全风险分析…...

深度学习的DataLoader是什么数据类型,为什么不可用来索引

在 Python 中&#xff0c;DataLoader是torch.utils.data.DataLoader类的实例对象&#xff0c;用于加载数据&#xff0c;它本身不是一种基本数据类型&#xff0c;而是一种特殊的迭代器类型&#xff0c;主要用于按批次加载数据&#xff0c;以下是其通常不可索引的原因&#xff1a…...

2024最新qrcode.min.js生成二维码Demo

找了一堆代码一堆GPT&#xff0c;终于给写对了&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

python elasticsearch 8.x通过代理发起请求方法

由于python elasticsearch v8 engine的源码包中并未开放对于请求添加proxies的支持&#xff0c;导致在某些环境下无法连通外网的es服务。目前网上暂无相关的修改内容&#xff0c;我这边提供下自己修改的动态运行时替换elasticsearch包的源码方法demo import gzip import ssl i…...

android opencv导入进行编译

1、直接新建module进行导入&#xff0c;选择opencv的sdk 导入module模式&#xff0c;选择下载好的sdk&#xff0c;修改module name为OpenCV490。 有报错直接解决报错&#xff0c;没报错直接运行成功。 2、解决错误&#xff0c;同步成功 一般报错是gradle版本问题较多。我的报…...

Group FLUX - User Usage Survey Report

文章目录 User Feedback Summary: Software Advantages and FeaturesUser Feedback Issues and Suggested Improvements1. Security Concerns:Improvement Measures: 2. System Performance and Loading Speed:Improvement Measures: 3. Data Display Issues:Improvement Measu…...

门店全域推广,线下商家营销布局的增量新高地

门店是商业中最古老的经营业态之一。很早就有行商坐贾的说法&#xff0c;坐贾指的就是门店商家&#xff0c;与经常做商品流通的「行商」相对应。 现在的门店经营&#xff0c;早已不是坐等客来&#xff0c;依靠自然流量吸引顾客上门&#xff0c;大部分的门店经营与推广都已经开…...

【DevOps工具篇】Jenkins的Pipeline(流水线)和Shared Library(共通库)

【DevOps工具篇】Jenkins的Pipeline(流水线)和Shared Library(共通库) 文章目录 【DevOps工具篇】Jenkins的Pipeline(流水线)和Shared Library(共通库)Pipeline流水线[](#pipeline流水线)让我们在多分支上创建流水线[](#让我们在多分支上创建流水线)单分支与多分支流水线对…...

V900新功能-电脑不在旁边,通过手机给PLC远程调试网关配置WIFI联网

您使用BDZL-V900时&#xff0c;是否遇到过以下这种问题&#xff1f; 去现场配置WIFI发现没带电脑&#xff0c;无法联网❌ 首次配置WIFI时需使用网线连电脑&#xff0c;不够快捷❌ 而博达智联为解决该类问题&#xff0c;专研了一款网关配网工具&#xff0c;实现用户现场使用手机…...

网络安全:基线检查---自动化脚本检测.

基线定义 基线通常指配置和管理系统的详细描述&#xff0c;或者说是最低的安全要求&#xff0c;它包括服务和应用程序设置、操作系统组件的配置、权限和权利分配、管理规则等。 基线检查内容 主要包括账号配置安全、口令配置安全、授权配置、日志配置、IP通信配置等方面内容&…...

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…...

JMeter配置原件-计数器

一、面临的问题&#xff1a; 由于本人的【函数助手对话框】中counter计数器每次加2&#xff0c;且只显示偶数(如下图所示)&#xff0c;因此借助【配置原件-计数器】来实现计数功能。 如果有大佬知道解决方式&#xff0c;麻烦评论区解答一下&#xff0c;谢谢。 二、配置原件-c…...

JS子页面调用父页面函数,监听刷新事件

目录 1.子页面调用父页面的函数 2.监听刷新事件 1.子页面调用父页面的方法 我们先来说说什么是子页面&#xff0c;在我这里子页面就是域名一样&#xff0c;然后使用iframe引入的页面就是我所说的子页面&#xff0c;为什么需要用到这个功能&#xff0c;是为了实现跨页面交互与…...

计算机视觉(为天地立心,为生民立命)

4. 逻辑回归中&#xff0c;对数损失函数怎么来表示的&#xff1f; 5. relu激活函数它的一些特点&#xff1f; ReLU的数学表达式为&#xff1a;f(x)max(0,x) 特点&#xff1a; 1.简单高效&#xff1a;ReLU 的计算非常简单&#xff0c;直接将输入小于 0 的部分置为 0&#xff…...

三格电子——新品IE103转ModbusTCP网关

型号&#xff1a;SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103&#xff0c;是三格电子推出的工业级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于IEC103数据采集、DLT645-1997/2007数据采集&#xff0c;IEC103支持遥测和遥信&#xff0c;可…...

金碟中间件-AAS-V10.0安装

金蝶中间件AAS-V10.0 AAS-V10.0安装 1.解压AAS-v10.0安装包 unzip AAS-V10.zip2.更新license.xml cd /root/ApusicAS/aas# 这里要将license复制到该路径 [rootvdb1 aas]# ls bin docs jmods lib modules templates config domains …...

最新D音滑块JS纯算法还原(含完整源码)

文章目录 1. 写在前面2. 接口分析2. 源码实现【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推荐】:对爬…...

接口绑定有几种实现方式

在 MyBatis 中&#xff0c;接口绑定是指通过 Java 接口与 SQL 映射文件&#xff08;XML&#xff09;进行绑定&#xff0c;允许你以面向对象的方式操作数据库。MyBatis 提供了几种不同的实现方式来实现接口绑定。 MyBatis 接口绑定的几种实现方式 基于 XML 映射的实现方式 这是…...

Oracle JDK需登录下载解决

JDK下载地址 地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 登录账号获取 访问&#xff1a;https://bugmenot.com/view/oracle.com 直接复制账号密码登录下载...

LabVIEW与PLC点位控制及OPC通讯

在工业自动化中&#xff0c;PLC通过标准协议&#xff08;如Modbus、Ethernet/IP等&#xff09;与OPC Server进行数据交换&#xff0c;LabVIEW作为上位机通过OPC客户端读取PLC的数据并进行监控、控制与处理。通过这种方式&#xff0c;LabVIEW能够实现与PLC的实时通信&#xff0c…...

VM16+解压版CentOS7安装和环境配置教程(2024年12月20日)

VM16解压版CentOS7安装和环境配置教程-2024年12月20日 一、下载安装包二、vm安装三、解压版CentOS7安装四、CentOS设置静态IP 因为很多同学觉得配置CentOS7好麻烦&#xff0c;我特地提供了一个已经配置好的现成镜像&#xff0c;来简化操作本篇来记录过程。 如果你在看到这篇文章…...

SQL中的约束

约束&#xff08;CONSTRAINT&#xff09; 对表中字段的限制 非空约束&#xff1a;NOT NULL 只能声明在每个字段的后面 CREATE TABLE test( id INT NOT NULL, last_name VARCHAR(15), phone VARCHAR(20) NOT NULL );唯一性约束&#xff1a;UNIQUE 说明&#xff1a; ① 可以声明…...

【Lua热更新】上篇

Lua 热更新 - 上篇 下篇链接&#xff1a;【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…...

数据压缩比 38.65%,TDengine 重塑 3H1 的存储与性能

小T导读&#xff1a;这篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的三等奖作品之一。作者通过自身实践&#xff0c;详细分享了 TDengine 在高端装备运维服务平台中的应用&#xff0c;涵盖架构改造、性能测试、功能实现等多个方面。从压缩效率到查询性能&#x…...

Linux shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式后,并添加文本水印

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp并添加文本水印 在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c;其中最常用的是通过命令行工具进行。 ImageMagick是一个非常强大的图像处理工…...

DeepFaceLab技术浅析(六):后处理过程

DeepFaceLab 是一款流行的深度学习工具&#xff0c;用于面部替换&#xff08;DeepFake&#xff09;&#xff0c;其核心功能是将源人物的面部替换到目标视频中的目标人物身上。尽管面部替换的核心在于模型的训练&#xff0c;但后处理过程同样至关重要&#xff0c;它决定了最终生…...

怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法

怎么将pdf中的某一个提取出来&#xff1f;传统上&#xff0c;我们可能通过手动截取屏幕或使用PDF阅读器的复制功能来提取信息&#xff0c;但这种方法往往不够精确&#xff0c;且无法保留原文档的排版和格式。此外&#xff0c;很多时候我们需要提取的内容可能涉及多个页面、多个…...

imu相机EKF

ethzasl_sensor_fusion/Tutorials/Introductory Tutorial for Multi-Sensor Fusion Framework - ROS Wiki https://github.com/ethz-asl/ethzasl_msf/wiki...

CSDN数据大屏可视化【开源】

项目简介 本次基于版本3 开源 版本3开源地址&#xff1a;https://github.com/nangongchengfeng/CsdnBlogBoard.git 版本1开源地址&#xff1a;https://github.com/nangongchengfeng/CSDash.git 这是一个基于 Python 的 CSDN 博客数据可视化看板项目&#xff0c;通过爬虫采…...

C# 从控制台应用程序入门

总目录 前言 从创建并运行第一个控制台应用程序&#xff0c;快速入门C#。 一、新建一个控制台应用程序 控制台应用程序是C# 入门时&#xff0c;学习基础语法的最佳应用程序。 打开VS2022&#xff0c;选择【创建新项目】 搜索【控制台】&#xff0c;选择控制台应用(.NET Framew…...

什么是 DevSecOps 框架?如何提升移动应用安全性?

在如今数字化发展的时代&#xff0c;安全性已成为移动应用开发不可或缺的一部分。传统的开发模式通常将安全作为一个独立的部门&#xff0c;专门负责保护组织的整体系统&#xff0c;而 DevSecOps 框架则将安全融入到 DevOps 的每一个环节中&#xff0c;确保应用的开发、测试、发…...

数字后端项目Floorplan常见问题系列专题

今天给大家分享下数字IC后端设计实现floorplan阶段常见问题系列专题。这些问题都是来自于咱们社区IC后端训练营学员提问的问题库。目前这部分问题库已经积累了4年了&#xff0c;后面会陆续分享这方面的问题。希望对大家的数字后端学习和工作有所帮助。 数字IC后端设计实现floo…...

【C++读写.xlsx文件】OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-17 …...

Qt设置部件的阴影效果

QT中的比如QWidget,QLabel,QPushbutton&#xff0c;QCheckBox都可以设置阴影效果&#xff0c;就像这样&#xff1a; 以QWidget为例&#xff0c;开始尝试使用样式表的形式添加阴影&#xff0c;但没有效果&#xff0c;写法如下&#xff1a; QWidget#widget1::shadow{color: rgb…...

【iOS安全】NSTaggedPointerString和__NSCFString

概述 简而言之 &#xff1a; NSTaggedPointerString和__NSCFString都是NSString类型。NSTaggedPointerString善于存短字符串&#xff0c;__NSCFString善于存一般或长字符串在iOS运行时&#xff0c;系统会根据字符串长度自动在NSTaggedPointerString和__NSCFString之间进行转换…...

docker(wsl)命令 帮助文档

WSL wsl使用教程 wsl -l -v 列出所有已安装的 Linux 发行版 wsl -t Ubuntu-22.04 --shutdown 关闭所有正在运行的WSL发行版。如果你只想关闭特定的发行版 wsl -d Ubuntu-22.04 登录到Ubuntu环境 wsl --list --running 查看正在wsl中运行的linux发行版 wsl --unregister (系统名…...

nginx模块ngx-fancyindex 隐藏标题中的 / 和遇到的坑

首先下载nginx源码&#xff0c;编译时加上 --add-module/usr/local/src/ngx-fancyindex/ 例如 &#xff1a; ./configure --prefix/usr/local/nginx --with-select_module --with-poll_module --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module…...

Edge Scdn防御网站怎么样?

酷盾安全Edge Scdn&#xff0c;即边缘式高防御内容分发网络&#xff0c;主要是通过分布在不同地理位置的多个节点&#xff0c;使用户能够更快地访问网站内容。同时&#xff0c;Edge Scdn通过先进的技术手段&#xff0c;提高了网上内容传输的安全性&#xff0c;防止各种网络攻击…...

音频接口:PDM TDM128 TDM256

一、 PDM接口 在麦克风&#xff08;Mic&#xff09;接口中&#xff0c;PDM&#xff08;Pulse Density Modulation&#xff0c;脉冲密度调制&#xff09;和I2S&#xff08;Inter-IC Sound&#xff0c;集成电路内置音频总线&#xff09;是两种常见的数字输出接口。 1、工作原理…...

半连接转内连接规则的原理与代码解析 |OceanBase查询优化

背景 在查询语句中&#xff0c;若涉及半连接&#xff08;semi join&#xff09;操作&#xff0c;由于半连接不满足交换律的规则&#xff0c;连接操作必须遵循语句中定义的顺序执行&#xff0c;从而限制了优化器根据参与连接的表的实际数据量来灵活选择优化策略的能力。为此&am…...

虚拟机VMware的安装问题ip错误,虚拟网卡

要么没有虚拟网卡、有网卡远程连不上等 一般出现在win11 家庭版 1、是否IP错误 ip addr 2、 重置虚拟网卡 3、查看是否有虚拟网卡 4、如果以上检查都解决不了问题 如果你之前有vmware 后来卸载了&#xff0c;又重新安装&#xff0c;一般都会有问题 卸载重装vmware: 第一…...

2024159读书笔记|《南山册页:齐白石果蔬册鱼虫册》节选

2024159读书笔记|《南山册页&#xff1a;齐白石果蔬册&鱼虫册》节选 1. 《南山册页&#xff1a;齐白石鱼虫册》2. 《南山册页&#xff1a;齐白石果蔬册》 1. 《南山册页&#xff1a;齐白石鱼虫册》 《南山册页&#xff1a;齐白石鱼虫册》南山书画&#xff0c;大家之作&…...

校园社交圈子系统APP开发校园社交圈子系统校园社交圈子系统平台校园社交圈子系统论坛开发校园社交圈子系统圈子APP

关于校园社交圈子系统APP及平台的开发&#xff0c;以下是从需求分析、系统设计、技术选型、功能实现等多个方面进行的详细阐述&#xff1a; 点击可获得前后端完整演示查看 一、需求分析 校园社交圈子系统的开发需求主要来源于大学生的社交需求。通过问卷调查、用户需求收集等…...

【Leetcode 热题 100】437. 路径总和 III

问题背景 给定一个二叉树的根节点 r o o t root root&#xff0c;和一个整数 t a r g e t S u m targetSum targetSum&#xff0c;求该二叉树里节点值之和等于 t a r g e t S u m targetSum targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子…...

Solidity中的事件(Event)的结构与用法

Solidity中的事件&#xff08;Event&#xff09;的结构与用法 event的简单例子被索引的参数&#xff08;Indexed Parameters&#xff09;没有被索引的参数&#xff08;Non-indexed Parameters&#xff09; event扩展event 更多举例无参数的event有什么用 event的简单例子 在So…...

基于STM32的房间湿度控制系统设计与实现(论文+源码)

1.系统总体设计 根据系统的实际应用需求&#xff0c;从硬件电路以及软件程序两个方面展开房间湿度控制系统设计。如图所示为系统的整体架构图。系统采用单片机作为控制器&#xff0c;在传感器检测模块中包括DHT11温湿度检测、有害气体浓度检测&#xff0c;在系统执行模块包括加…...

docker 使用 xz save 镜像

适用场景 如果docker save -o xxx > xxx 镜像体积过大,可以使用 xz 命令压缩。 命令 例如 save busybox:1.31.1 镜像,其中 -T 是使用多核心压缩,可以加快压缩。 docker save busybox:1.31.1 |xz -T 8 > /tmp/busybox:1.31.1安装 xz Ubuntu/Debian sudo apt upda…...

Dockerfile文件编写

目录 Dockerfile文件编写 1.什么是Dockerfile 2. Dockerfile作用 3.dockerfile 的基本结构&#xff1a; 4.dockerfile指令&#xff1a; FROM 指定基础镜像&#xff0c;dockerfile构建镜像的第一个指令 LABEL 指定镜像维护人信息 ADD/COPY 复制本地文件/目录到镜像中 …...