24.11.25 Mybatis1

news2024/11/26 11:42:50

1.Mybatis介绍

1.封装JDBC 减少重复性代码
2.ORM(实体关系映射框架) 通过框架  实体类 <--> 数据表 自动封装对象
3.半自动的ORM框架 还需要写sql语句    

2.使用mybatis连接数据库(调通一遍 记住需要哪些文件)

1.创建全局配置文件 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">

<!--
* jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://127.0.0.1:3306/mydb
jdbc.driver=com.mysql.cj.jdbc.Driver

-->

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>

        </environment>

    </environments>

    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>
2.创建与数据库表对应的实体类
package com.javasm.entity;

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Long id;
    private String username;
    private String password;
    private Integer age;

}
3.创建与数据库表对应的sql操作文件(sql映射文件)
<?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">
<mapper namespace="aa.bb">
    <select id="getUserById" resultType="com.javasm.entity.User" >
        select * from user where id = 1

    </select>

</mapper>
4.通过mybatis提供的jar包功能 启动mybatis 并调用sql语句
    @Test
    public void getUserByIDTest(){
        //启动mybaitis框架
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //mybatis中 连接 封装在了SqlSession sql会话中
            //在一定程度上简化代码
            SqlSession sqlSession = sqlSessionFactory.openSession();
            User getUserById =(User) sqlSession.selectOne("aa.bb.getUserById");
            System.out.println(getUserById);
            //把连接归还mybatis
            sqlSession.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }




    }

3mybatis-config.xml 配置文件(了解即可)

mybatis核心配置文件 配置mybatis启动运行使用的基本参数

3.1properties

用来引入单独的jdbc配置文件 一般直接放在根下

<!--  <properties resource="编译的根 ">  -->
<properties resource="jdbc.properties">
    <!--    自定义属性    -->
    <!--        <property name="username" value="dev_user"/>-->
    <!--        <property name="password" value="F2Fa3!33TYyg"/>-->
</properties>

3.2 settings

运行参数设置

必须要开的设置

    <settings>
<!--   开启mybatis日志 方便调试     -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
<!--   开启驼峰转换  数据库用下划线 java类用驼峰命名      -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

日期类型需要注意:

    //实体类一般不用date类型
    //如果日期只显示 不做日期计算
    //String   数据库    dateTime
    //如果需要日期计算 毫秒数
    //double   数据库    double
    //long
    private String createTime;
3.3 typeAliases(在settings后面写)
    <typeAliases>
<!--   给类型指定别名 简化类型的编写
       自定义别名
       内置别名  80多种

    -->
        <typeAlias alias="User" type="com.javasm.entity.User"/>
        
    </typeAliases>

语句使用时 可以直接使用别名

内置别名规则:

string    java.lang.String
    
基本数据类型
_int      int

包装类型
int       java.lang.Integer    
    
3.4 environments

        <environment id="development">
<!--   使用jdbc事务控制         -->
            <transactionManager type="JDBC"/>
<!--            使用数据库连接池 -->
            <dataSource type="POOLED">
<!--    如果使用了   <properties resource="jdbc.properties"> 引入jdbc配置文件
        可以通过${key} 读取jdbc配置文件中的数据
          -->
                <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>

提交回滚代码

3.5mappers
<!--  把sql映射文件 注册给mybatis 不然无法使用  -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

4.mybatis启动过程(了解即可)

mybatis启动过程中 会根据mybatis-config.xml 加载各种参数配置

1.根据连接环境 创建数据库连接池

2.读取注册别名(自定义别名 内置别名)

3.读取sql映射文件 加载sql标签 nameSpace+id (全局唯一 不能重复)

4.操作sql语句时 从数据库连接池取到连接对象

从mappedStatements 找到sql标签 传给数据库

5.数据库返回执行结果 mybatis根据 resultType="User" 配置的类型 把结果封装到对象中

需要数据库列 与实体对象一一对应(开启驼峰 应对 下划线对驼峰)

6.使用完mybatis 归还连接给数据库连接池

import com.javasm.entity.User;
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.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisTest {

    @Test
    public void getUserByIDTest(){
        //启动mybaitis框架
        //从编译的根查找配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            //Resources 加载配置文件 读取到数据流
            inputStream = Resources.getResourceAsStream(resource);
            // 使用了构建器的模式(构建大对象) mybatis核心配置 configuration 配置mybaits的所有信息
            // new SqlSessionFactoryBuilder().build(inputStream);
            // SqlSessionFactory 核心对象(配置参数中的各种数据 别名 启动setting设置 注册的sql语句 数据库连接池 )
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //工厂模式
            //按照模板创建指定对象
            //从数据库连接池取一个可用连接 配置上mybatis需要的参数
            //SqlSession  连接会话 (包含了connection 连接对象 被数据库连接池维护的对象)

            //数据库连接池
            /*
            * 池化技术(复用对象)
            * 线程池   代码执行器  线程对象是通用的  开多线程 会更多消耗cpu和内存
            *         为了满足长时间大量使用 会预先创建好对象 使用时不需要再创建和销毁
            * 数据库连接池  复用数据库连接 TCP连接  三次握手 4次挥手
            *             预先创建好连接对象
            *             传输数据的通道
            *             每次创建多少 占满之后如何处理
            *             根据实际数据量选择
            *
            *             druid
            * */

            //mybatis中 连接 封装在了SqlSession sql会话中
            //在一定程度上简化代码
            //sqlSessionFactory.openSession(true); 自动提交 不要用
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //找到注册的语句  nameSpace+id
            User getUserById =(User) sqlSession.selectOne("aa.bb.getUserById");
            System.out.println(getUserById);
            //String getUserById2 =(String) sqlSession.selectOne("aa.bb.getUserById2");
            //System.out.println(getUserById2);
//            sqlSession.commit();
//            sqlSession.rollback();
            //把连接归还mybatis
            sqlSession.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

5.sql映射标签(***)

5.1select标签

用于标记查询语句 通常需要搭配动态参数使用

<select id="getUserById" resultType="User" >
    select * from user where id = 1

</select>
  selectOne()   查单条
  selectList()  查多条

  select标签
  id         语句标签的唯一标记 当前文件中 id不能重复 全局namespace+id不能重复
  resultType 返回数据的类型(单条数据类型)(根据查询语句使用的格式不同 返回不同的数据类型)
             1返回对象(实际数据对应)  (多列数据)
             2单个字段(某个字段)      (单列数据)
             3map格式(某些字段)      (少用)
5.2insert标签

用于插入数据 通常需要搭配动态参数使用

    <insert id="addUser"  >
        insert into user(id,username,`password`,age)
                                VALUES (#{id},#{username},#{password},#{age})
    </insert>

主键自增例子:

语句中不要指定id 根据jdbc的GeneratedKeys得到自增编号

    <insert id="addUser2" useGeneratedKeys="true" keyProperty="id">
        insert into user(username,`password`,age)
        VALUES (#{username},#{password},#{age})
    </insert>

insert 标签
    id   语句的唯一标记
    parameterType 可以省略不写
    不需要标记返回值类型 返回的是执行成功的记录数

    如果需要使用主键自增的编号
    useGeneratedKeys="true"  激活jdbc获取自增主键
    keyProperty="id"         获取的自增主键 设置给插入对象的哪个属性


 注意:如果设置自动提交false 需要手动提交
 sqlSession.commit();

    @Test
    public void addUserTest(){
        //启动mybaitis框架
        //从编译的根查找配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            //Resources 加载配置文件 读取到数据流
            inputStream = Resources.getResourceAsStream(resource);
            // 使用了构建器的模式(构建大对象) mybatis核心配置 configuration 配置mybaits的所有信息
            // new SqlSessionFactoryBuilder().build(inputStream);
            // SqlSessionFactory 核心对象(配置参数中的各种数据 别名 启动setting设置 注册的sql语句 数据库连接池 )
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            SqlSession sqlSession = sqlSessionFactory.openSession();
//            User user = new User(6l,"66","66",16,"");
            User user = new User("67","67",17);
//            int resNum = sqlSession.insert("aa.bb.addUser",user);
            int resNum = sqlSession.insert("aa.bb.addUser2",user);
            System.out.println(resNum);
            System.out.println(user);
            sqlSession.commit();

            //把连接归还mybatis
            sqlSession.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }




    }

5.3update标签

用于修改数据

<update id="editUser">
    update user set username=#{username}, `password` = #{password} where id = #{id}

</update>
update 修改标签
    id  语句唯一标记
    parameterType 可以省略不写
    不需要标记返回值类型 返回的是执行成功的记录数

   @Test
    public void updateUserTest(){
        //启动mybaitis框架
        //从编译的根查找配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            //Resources 加载配置文件 读取到数据流
            inputStream = Resources.getResourceAsStream(resource);
            // 使用了构建器的模式(构建大对象) mybatis核心配置 configuration 配置mybaits的所有信息
            // new SqlSessionFactoryBuilder().build(inputStream);
            // SqlSessionFactory 核心对象(配置参数中的各种数据 别名 启动setting设置 注册的sql语句 数据库连接池 )
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            SqlSession sqlSession = sqlSessionFactory.openSession();
            User user = new User();
            user.setId(3l);
            user.setUsername("aaa");
            user.setPassword("aaa");

            int resNum = sqlSession.update("aa.bb.editUser",user);


            System.out.println(resNum);
            System.out.println(user);
            sqlSession.commit();

            //把连接归还mybatis
            sqlSession.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

5.4delete标签

用于删除数据

    <delete id="deleteUser">
        delete from user where id = #{id}
    </delete>

    <!--
    delete 修改标签
        id  语句唯一标记
        parameterType 可以省略不写
        不需要标记返回值类型 返回的是执行成功的记录数

    -->

   @Test
    public void deleteUserTest(){
        //启动mybaitis框架
        //从编译的根查找配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            //Resources 加载配置文件 读取到数据流
            inputStream = Resources.getResourceAsStream(resource);
            // 使用了构建器的模式(构建大对象) mybatis核心配置 configuration 配置mybaits的所有信息
            // new SqlSessionFactoryBuilder().build(inputStream);
            // SqlSessionFactory 核心对象(配置参数中的各种数据 别名 启动setting设置 注册的sql语句 数据库连接池 )
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            SqlSession sqlSession = sqlSessionFactory.openSession();

            int resNum = sqlSession.delete("aa.bb.deleteUser",6);
            System.out.println(resNum);
            sqlSession.commit();

            //把连接归还mybatis
            sqlSession.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

5.5动态参数

mybatis传参时 需要使用动态参数标记 传入参数

所以传入参数时 不同的参数对象类型 要对应不同的取值方式

  动态参数
  #{}  preparestatement 使用占位符 传参
  ${}                   没使用占位符 sql硬拼接 (少用)

    传参时 mybatis只接受一个参数
动态传参的几种对应方式
1.只有一个参数时 key可以任意定义 但是最好使用成查询的字段属性(可读性)

​ java代码

 List<Object> objects = sqlSession.selectList("aa.bb.listUserById",1);   

xml映射文件

    <select id="listUserById" resultType="com.javasm.entity.User" >
        select * from user where age = #{xxxx}
    </select>

2.多个参数时 a.实体对象 使用实体对象的属性名 注意多检查属性名

java代码

User inputUser = new User();
inputUser.setUsername("gxy");
inputUser.setPassword("abc123");
List<Object> objects = sqlSession.selectList("aa.bb.listUserByNameAndPwd",inputUser);

xml代码

    <select id="listUserByNameAndPwd" resultType="com.javasm.entity.User" >
          select * from user where 
                          username = #{username} and `password` = #{username}
    </select>
2.多个参数时 b.通过map封装自定义对象 与mapkey对应 多检查key key不存在不报错 值是null
java代码
            Map<String,Object> paramap = new HashMap<>();
            paramap.put("myName","jack");
            paramap.put("myPWD","abc123");
List<Object> objects = sqlSession.selectList("aa.bb.listUserByNameAndPwd",paramap);

xml代码

select * from user where username = #{myName1} and `password` = #{myPWD}
2.多个参数时 c.通过list封装参数结合 与list索引对应 (知道即可 可读性较差 使用不便)

java代码

            List<Object> paramList = new ArrayList<>();
            paramList.add("jack");
            paramList.add("abc123");
List<Object> objects = sqlSession.selectList("aa.bb.listUserByNameAndPwd",paramList);

xml代码

select * from user where username = #{list[0]} and `password` = #{list[1]}
2.多个参数时 d.组合使用 多个实体对象 map中嵌套实体对象 先与mapkey对应 再跟当前对象的属性名对应

Java代码

            Map<String,Object> paramap = new HashMap<>();
            paramap.put("user1",new User(1l,"jack","abc123",15,""));
            paramap.put("user2",new User(2l,"rose","aaaaa",17,""));
List<Object> objects = sqlSession.selectList("aa.bb.listUserByNameAndPwd",paramap);

xml代码

 select * from user where username = #{user1.username} and `password` = #{user2.password}

6.mybatis接口映射(主要掌握)

通过mybatis框架 运行时自动生成dao实现类的代码(dao层代码不需要写 通过配置配置文件

指定给mybatis生成)

1.写dao接口
package com.dao;

import com.javasm.entity.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;


public interface UserDao {

    //添加用户的接口
    int addUser(User inputUser);

    //查询用户信息列表
    List<User> listUser();

    //查询用户信息列表
    User getUserById(Long id);

    //查询用户信息
    User getUserByNameAndPwd(User inputUser);
    //@Param 把参数存入一个map 可以传递多参数
    User getUserByNameAndPwd2(@Param("myname") String username,@Param("mypwd") String password);

    User getUserByNameAndPwd3(@Param("user1")User user1,@Param("user2") User user2);


}
2.配置接口映射(xml文件 关联dao文件)

<?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">
<mapper namespace="com.dao.UserDao">
<!-- 可以自动生成dao代码   -->
    <insert id="addUser" parameterType="com.javasm.entity.User">
        insert into user(id,username,`password`,age)
        VALUES (#{id},#{username},#{password},#{age})
    </insert>

    <select id="listUser">
        select * from user
    </select>

    <select id="getUserById" >
        select * from user where id = #{id2}
    </select>

    <select id="getUserByNameAndPwd" >
        select * from user where username = #{username} and `password` = #{password}
    </select>

    <select id="getUserByNameAndPwd2" >
        select * from user where username = #{myname} and `password` = #{mypwd}
    </select>

    <select id="getUserByNameAndPwd3" >
        select * from user where username = #{user1.username} and `password` = #{user2.password}
    </select>

</mapper>

注意 mybatis基于的还是

selectOne

selectList

insert

update

delete

这些方法

参数类型上默认不支持多参数

多参数时 是封装为了map传参

3.获取接口实现类 执行方法
            SqlSession sqlSession = sqlSessionFactory.openSession();

            UserDao userDaoImpl = sqlSession.getMapper(UserDao.class);
            List<User> users = userDaoImpl.listUser();

            System.out.println(users);
            sqlSession.commit();
            //把连接归还mybatis
            sqlSession.close();

查询不需要提交

添加 修改 删除 需要提交

7mybaits插件

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

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

相关文章

【Python爬虫五十个小案例】爬取猫眼电影Top100

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1f40d;引言 猫眼电影是国内知名的电影票务与资讯平台&#xff0c;其中Top100榜单是影迷和电影产业观察者关注的重点。通过爬取猫眼电影Top10…

Oh-My-ZSH安装教程

1. 安装zsh sudo apt-get install zsh2.安装on-my-zsh wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh上面方式很大可能因为网络连接问题而失败&#xff0c;可以通过以下方式&#xff1a; git clone gitgithub.com:ohmyzsh/ohmyzsh…

三六零[601360]行情数据接口

1、三六零&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker601360获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…

用 OceanBase 4.3.3,搭建《黑神话:悟空》的专属游戏AI助手

本文分享了如何基于 OceanBase 4.3.3 bp1 社区版的向量检索能力&#xff0c;通过几条简单的命令&#xff0c;快速搭建一个定制化的专属游戏助手的过程。 背景 在 OceanBase 最新推出 V 4.3.3 免费试用的同时&#xff0c;也同时发布了几个基于OB Cloud 的向量能力&#xff0c;搭…

tableau练习-制作30个图表

一、导入数据 1、导入数据 -添加-添加连接-到文件-excel格式用第一个excel导入&#xff0c;csv格式用第二个文本格式导入 2、连接数据 -从旁边这里直接拖到中间 标头连接 -日期若不一致需调节日期格式 3、保存数据 点击数据提取-再保存数据&#xff0c;保存为twbx格式 二、设计…

QT QHorizontalSpacer控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

第六届智能控制、测量与信号处理国际学术会议 (ICMSP 2024)

重要信息 2024年11月29日-12月1日 中国陕西西安石油大学雁塔校区 大会官网&#xff1a;www.icmsp.net 大会简介 第六届智能控制、测量与信号处理国际学术会议&#xff08;ICMSP 2024&#xff09;由西安石油大学、中海油田服务股份有限公司、浙江水利水电学院与中国石油装备…

Qt中2D绘制系统

目录 一、Qt绘制系统 1.1Qt绘制基本概念 1.2 绘制代码举例 1.3画家 1.3.1 QPainter的工作原理&#xff1a; 1.3.2 自定义绘制饼状图&#xff1a; 1.4画笔和画刷 1.4.1画笔 1.4.2 画刷填充样式 1.5 反走样和渐变 1.6绘制设备 1.7坐标变换 1.8QPainterPath 1.9绘制文…

Linux——Uboot命令使用

什么是Uboot&#xff1f; 1&#xff09;Uboot是一个裸机程序&#xff0c;比较复杂。类似我们PC机的BIOS程序。 2&#xff09;Uboot就是一个bootloader&#xff0c;作用就是用于启动Linux或者其他系统&#xff0c;Uboot最主要的工作是初始化DDR&#xff0c;因为Linux的运行是运行…

2024智能机器人与自动控制国际学术会议 (IRAC 2024)

主办&#xff0c;承办&#xff0c;支持单位 会议官网 www.icirac.org 大会时间&#xff1a;2024年11月29-12月1日 大会简介 2024智能机器人与自动控制国际学术会议 &#xff08;IRAC 2024&#xff09;由华南理工大学主办&#xff0c;会议将于2024年11月29日-12月1日在中国广…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题&#xff0c;NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍

文章目录 前言一、Zachman架构二、ToGAF架构三、FEA架构四、DoDAF 前言 企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是指企业在信息技术和业务流程方面的整体设计和规划。 最近接触到“企业架构”这个概念&#xff0c;转念一想必定和我们软件架构…

亚信安全发布《2024年第三季度网络安全威胁报告》

《亚信安全2024年第三季度网络安全威胁报告》的发布旨在从一个全面的视角解析当前的网络安全威胁环境。此报告通过详尽梳理和总结2024年第三季度的网络攻击威胁&#xff0c;目的是提供一个准确和直观的终端威胁感知。帮助用户更好地识别网络安全风险&#xff0c;并采取有效的防…

【c++】模板详解(2)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、非类型模板参数 二、模板的特化 1. 概念 2. 场景举例 3. 函数模板的特化 4. 类模板的特化 全特化 偏特化 1. 部分特化 2. 对参数的…

红队笔记--W1R3S、JARBAS、SickOS、Prime打靶练习记录

W1R3S(思路为主) 信息收集 首先使用nmap探测主机&#xff0c;得到192.168.190.147 接下来扫描端口&#xff0c;可以看到ports文件保存了三种格式 其中.nmap和屏幕输出的一样&#xff1b;xml这种的适合机器 nmap -sT --min-rate 10000 -p- 192.168.190.147 -oA nmapscan/ports…

Qt/C++基于重力模拟的像素点水平堆叠效果

本文将深入解析一个基于 Qt/C 的像素点模拟程序。程序通过 重力作用&#xff0c;将随机分布的像素点下落并水平堆叠&#xff0c;同时支持窗口动态拉伸后重新计算像素点分布。 程序功能概述 随机生成像素点&#xff1a;程序在初始化时随机生成一定数量的像素点&#xff0c;每个…

十一月二十五

双向循环链表 class Node:#显性定义出构造函数def __init__(self,data):self.data data #普通节点的数据域self.next None #保存下一个节点的链接域self.prior None #保存前一个节点饿链接域 class DoubleLinkLoop:def __init__(self, node Node):self.head nodeself.siz…

Python + 深度学习从 0 到 1(00 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 什么是深度学习&#xff1f; 人工智能、机器学习与…

UG NX二次开发(C++)-UIStyler-指定平面的对象和参数获取

文章目录 1、前言2、在UG NX中创建平面和一个长方体,3、在UI Styler中创建一个UI界面4、在VS中创建一个工程4.1 创建并添加工程文件4.2 在Update_cb方法中添加选择平面的代码4.3 编译完成并测试效果1、前言 在采用NXOpen C++进行二次开发时,采用Menu/UIStyler是一种很常见的…

C# 命令行运行包

环境&#xff1a;net6 nuget包&#xff1a;Cliwrap 3.6.7 program&#xff1a; 相当于cmd运行命令&#xff1a;nuget search json static async Task Main(string[] args) {var cmd Cli.Wrap("D:\\软件\\Nuget\\nuget.exe").WithArguments(args >args.Add("…