【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......

news2024/11/28 22:39:08

目录

  • 一、学习内容
  • 二、数据库事务
  • 三、JDBC 的事务管理
  • 四、事务的四大特性
  • 五、MyBatis
  • 六、MyBatis 核心配置文件和基本使用
  • 七、查询 student 表
    • (1) 实体映射文件 mapper
    • (2) 读取核心配置文件, 拿到 SqlSession
  • 八、字段和属性名映射
    • (1) mapUnderscoreToCamelCase
    • (2) 完整的 settings 标签配置
  • 九、SqlSessionFactory 细节
  • 十、参数传递
    • (1) 参数占位符
    • (2) 代码测试
  • 十一、日志打印
  • 十二、多表查询
    • (1) 准备工作
    • (2) 多表查询

一、学习内容

  • SSM(Spring、SpringMVC、MyBatis)
  • Apache Shiro
  • SpringBoot

二、数据库事务

  • 事务:若将 N 个数据库操作(CRUD)放到同一个事务中,则这 N 个数据库操作最终要么全都生效,要么全都不生效

  • 🍀 开启事务【START TRANSACTION

  • 🍀 回滚事务:若事务中的某个数据库操作失败,其他所有数据库操作都需要回滚(恢复到开启事务之前的状态)【ROLLBACK

  • 🍀 提交事务:如果事务中的所有数据库操作都成功被执行,就提交事务(让这些操作正式生效)【COMMIT

在这里插入图片描述

在这里插入图片描述

三、JDBC 的事务管理

🍀 JDBC 中用 Connection 对象来管理事务
🍀 connection.setAutoCommit(false):开启事务(自己管理事务)
🍀 connection.rollback():回滚事务 (若执行某条语句的过程中出现异常,之前执行过的语句恢复到最初状态)
🍀 connection.commit()
提交事务 (若所有语句都被正常执行,没有出现异常,会正常提交事务,让所有语句的修改都生效)

四、事务的四大特性

① 原子性(Atomicity)
🍀 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行

② 一致性(Consistency)
🍀 事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是:数据库中的数据应满足完整性约束

③ 隔离性(Isolation)
🍀 多个事务并发执行时,一个事务的执行不应影响其他事务的执行

④ 持久性(Durability)
🍀 已被提交的事务对数据库的修改应该永久保存在数据库中

五、MyBatis

  • MyBatis 是一款优秀的持久层(Dao层)的框架

在这里插入图片描述

中文官网:https://mybatis.org/mybatis-3/zh/index.html

六、MyBatis 核心配置文件和基本使用

(1) 🍀 添加依赖(MyBatis 依赖喝 MySQL 数据库连接驱动包)

 <dependencies>
     <!-- 引入 JDBC, Java 连接 MySQL 的驱动包 -->
     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.49</version>
     </dependency>

     <!-- MyBatis 依赖 -->
     <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.5.5</version>
     </dependency>
 </dependencies>

(2) 🍀 创建 MyBatis 的核心配置文件(文件名:mybatis-config.xml

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)

官方核心配置文件:https://mybatis.org/mybatis-3/zh/getting-started.html

在这里插入图片描述在这里插入图片描述

<?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>
    <!-- 环境 -->
    <!-- default:使用哪个环境下的数据库配置 -->
    <environments default="development">
        <!-- 开发环境(开发调试阶段)-->
        <environment id="development">
            <!-- 采用 JDBC 的事务管理方法 -->
            <transactionManager type="JDBC"/>
            <!-- POOLED:采取 MyBatis 的连接池管理数据库连接 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/study_mb"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

        <!-- 生产环境(发布阶段)-->
        <environment id="production">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

🍀 transactionManager 的 type 为 JDBC【采用 JDBC 方式来管理事务】
🍀 dataSource 的 type 为 POOLED【采用连接池的方式管理数据库连接】

在这里插入图片描述
在这里插入图片描述


 CREATE TABLE `student` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(22) NOT NULL,
  `money` bigint(20) NOT NULL,
  `create_time` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
public class Student {
    private Long id;
    private String name;
    private Long money;
    private String createTime;

    public String getCreateTime() {
        return createTime;
    }


    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getMoney() {
        return money;
    }

    public void setMoney(Long money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                ", createTime='" + createTime + '\'' +
                '}';
    }
}

七、查询 student 表

(1) 实体映射文件 mapper

  • 实体映射文件
    ① 用于做实体类之间的映射
    ② 在 mapper 文件夹下创建
    在这里插入图片描述

  • 把映射文件的路径配置到核心配置文件(mybatis-config.xml)中
    ① 在核心配置文件中可通过 <mappers></mappers> 标签配置多个实体映射文件路径
    ② 在 <mappers></mappers> 标签中可配置多个 <mapper/> 标签(每个 <mapper /> 标签对应一个实体映射文件)
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

<?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="student">
    <!-- id="list":后面可通过 list 对应该条 SQL 语句并执行该条 SQL 语句 -->
    <!-- resultType: 该条 SQL 语句的结果对应的 Java Bean -->
    <!-- 会自动将结果集映射为 List<Student> -->
    <select id="list" resultType="com.pojo.po.Student">
        SELECT * FROM student
    </select>
</mapper>

(2) 读取核心配置文件, 拿到 SqlSession

public class TestStudent {
    @Test
    public void testSelect() throws Exception {
        // 读取 MyBatis 的核心配置文件
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        // 创建工厂构建器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 创建工厂
        SqlSessionFactory factory = builder.build(reader);
        // 创建 SqlSession
        SqlSession sqlSession = factory.openSession();

        // 通过 sqlSession 执行 SQL 语句
        // 参数是 <mapper> 标签中的 namespace 和 <select> 标签的 id
        List<Student> studentList = sqlSession.selectList("student.list");

        for (Student student : studentList) {
            System.out.println("student = " + student);
        }
        
        // 关闭 session
        sqlSession.close();
    }
}

八、字段和属性名映射

(1) mapUnderscoreToCamelCase

在这里插入图片描述

是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn

若不配置,数据库表中以下划线方式命名的字段查询出的结果是 null

在这里插入图片描述

<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

🍀 假如不设置驼峰下划线自动映射,也可在实体映射文件中通过 <resultMap> 进行 Java Bean 和表字段的映射

<?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="student">
    <!-- id="list":后面可通过 list 对应该条 SQL 语句并执行该条 SQL 语句 -->
    <!-- resultType: 该条 SQL 语句的结果对应的 Java Bean -->
    <!-- 会自动将结果集映射为 List<Student> -->
    <!--    <select id="list" resultType="com.pojo.po.Student">-->
    <!--        SELECT * FROM student-->
    <!--    </select>-->

    <resultMap id="resultMapStudent" type="com.pojo.po.Student">
        <!-- 属性名和字段名完全一样可不进行设置 -->
        <id property="id" column="id"/>
        <!--        <result property="id" column="id"/>-->
        <!--        <result property="name" column="name"/>-->
        <!--        <result property="money" column="money"/>-->
        <result property="createTime" column="create_time"/>
    </resultMap>

    <select id="list" resultMap="resultMapStudent">
        SELECT * FROM student
    </select>
</mapper>

(2) 完整的 settings 标签配置

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="safeResultHandlerEnabled" value="true"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
  <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
  <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
  <setting name="callSettersOnNulls" value="false"/>
  <setting name="returnInstanceForEmptyRow" value="false"/>
  <setting name="logPrefix" value="exampleLogPreFix_"/>
  <setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/>
  <setting name="proxyFactory" value="CGLIB | JAVASSIST"/>
  <setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/>
  <setting name="useActualParamName" value="true"/>
  <setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/>
</settings>

九、SqlSessionFactory 细节

🍀 SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式

在这里插入图片描述

在这里插入图片描述

/**
 * @author Larry Meadors
 */
public class SqlSessionManager implements SqlSessionFactory, SqlSession { 
    private final SqlSessionFactory sqlSessionFactory;

    // 构造方法私有化
    private SqlSessionManager(SqlSessionFactory sqlSessionFactory) {
         
    }

    public static SqlSessionManager newInstance(Reader reader) {
        return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, null, null));
    }

    public static SqlSessionManager newInstance(Reader reader, String environment) {
        return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, environment, null));
    } 

    public static SqlSessionManager newInstance(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionManager(sqlSessionFactory);
    }

}

public class MyBatisUtil {
    // 保留一份即可
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try (Reader reader = Resources.getResourceAsReader("mybatis-config.xml")) {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 返回一个 SqlSession
     *
     * @param autoCommit 是否自动提交事务
     */
    public static SqlSession openSession(boolean autoCommit) {
        return sqlSessionFactory.openSession(autoCommit);
    }
}

静态代码块只会在类加载时被执行一次,与对象无关。静态代码块使用 static 修饰,与对象无关

十、参数传递

(1) 参数占位符

${}:直接文本替换
#{}:预编译传值,可防止 SQL 注入

(2) 代码测试

🍃 传递单个参数

    /**
     * 传递单个参数
     */
    @Test
    public void testParam0() {
        try (SqlSession sqlSession = MyBatisUtil.openSession(true)) {
            Student studentById = sqlSession.selectOne("student.getById", 3);
            System.out.println("testParam0 studentById = " + studentById);
        }
    }
<?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="student"> 
    <select id="getById" resultType="com.pojo.po.Student">
        <!-- #{}: 参数占位符 -->
        SELECT * FROM student WHERE id = #{id}
    </select>
</mapper>

🍃 多个参数的传递

public class TestStudent {

    /**
     * 传递多个参数
     */
    @Test
    public void testParam1() {
        try (SqlSession sqlSession = MyBatisUtil.openSession(true)) {
            Map<String, String> paramMap = new HashMap<>();
            paramMap.put("id", "3");
            paramMap.put("money", "7009900");

            List<Student> studentList = sqlSession.selectList("student.listByIdAndMoney", paramMap);
            for (Student student : studentList) {
                System.out.println("testParam1 student = " + student);
            }
        }
    }

    @Test
    public void testParam2() {
        try (SqlSession sqlSession = MyBatisUtil.openSession(true)) {
            Student studentParams = new Student();
            studentParams.setId(3L);
            studentParams.setMoney(7009900L);

            List<Student> studentList = sqlSession.selectList("student.listByIdAndMoney", studentParams);
            for (Student student : studentList) {
                System.out.println("testParam2 student = " + student);
            }
        }
    }
    
}
<?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="student">

    <select id="listByIdAndMoney" resultType="com.pojo.po.Student">
        <!-- &lt;【表示小于符号】 -->
        SELECT * FROM student WHERE id &lt; #{id} OR money >= #{money}
    </select>
    
</mapper>

在这里插入图片描述


模糊查询

public class TestStudent {

    @Test
    public void testParam3() {
        try (SqlSession sqlSession = MyBatisUtil.openSession(true)) {

            List<Student> studentList = sqlSession.selectList("student.getByName", "%张%");
            for (Student student : studentList) {
                System.out.println("testParam3 student = " + student);
            }
        }
    }
    
}
<?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="student">
    <select id="getByName" resultType="com.pojo.po.Student">
        SELECT * FROM student WHERE name LIKE #{name}
    </select>
</mapper>

假如中文模糊查询没有结果,需要配置数据库的字符编码

在这里插入图片描述

十一、日志打印

🍀 (1) 在核心配置文件中配置打印日志

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

    <settings>
        <!-- 打印日志信息 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
</configuration>

🍀 (2) 第三方日志打印库

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
  <scope>test</scope>
</dependency>

使用该第三方库的话需要取消核心配置文件中的配置
在这里插入图片描述

十二、多表查询

(1) 准备工作

--- 公司表
CREATE TABLE `company` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `intro` varchar(1000) DEFAULT NULL,
  `create_time` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

--- 工作经验表
CREATE TABLE `experience` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `job` varchar(20) NOT NULL,
  `intro` varchar(1000) DEFAULT NULL,
  `company_id` int(11) NOT NULL,
  `create_time` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `company_id` (`company_id`),
  CONSTRAINT `experience_ibfk_1` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
public class Company {
    private Long id;
    private String name;
    private String intro;
    private String createTime;
 
    @Override
    public String toString() {
        return "Company{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", intro='" + intro + '\'' +
                '}';
    }
}
public class Experience {
    private Long id;
    private String job;
    private String intro;
    private Company company;
    private String createTime;

    @Override
    public String toString() {
        return "Experience{" +
                "id=" + id +
                ", job='" + job + '\'' +
                ", intro='" + intro + '\'' +
                ", company=" + company +
                ", createTime='" + createTime + '\'' +
                '}';
    }
}

(2) 多表查询

查询 experience 表,同时查询出对应的 company 信息

写法1:

<?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="experience">

    <resultMap id="rmExp" type="com.pojo.po.Experience">
        <!-- c_id 会和 Experience 的 company 属性的 id 属性进行映射 -->
        <!-- c_name 会和 Experience 的 company 属性的 name 属性进行映射 -->
        <result property="company.id" column="c_id"/>
        <result property="company.name" column="c_name"/>
    </resultMap>
    <select id="list" resultMap="rmExp">
        SELECT
        e.*,
        c.id c_id,
        c.NAME c_name
        FROM
        experience e
        JOIN company c ON c.id = e.company_id
    </select>

</mapper>

写法2

<?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="experience">

    <select id="list" resultType="com.pojo.po.Experience">
        SELECT
        e.*,
        c.id `company.id`,
        c.NAME `company.name`,
        c.intro `company.intro`
        FROM
        experience e
        JOIN company c ON c.id = e.company_id
    </select>

</mapper>

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

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

相关文章

【Linux】基本开发工具包使用

目录 一&#xff0c; yum ——linux软件包管理器 1. 软件包是啥子&#xff1f; 2. yum基本使用 1. 步骤&#xff1a; 2. 开发工具推荐&#xff08;centos 7.6&#xff09; 二&#xff0c;vim —— linux文本编辑器 1. Normal mode —— 命令模式(记不住没关系&#x…

C#,码海拾贝(33)——约化“一般实矩阵”为“赫申伯格矩阵”的“初等相似变换法”之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

2023CISCN初赛

两天时间题量还挺大的&#xff0c;简单记录 文章目录 misc签到卡pyshell国粹被加密的生产流量网络安全人才实战能力评价 webunzipdumpitBackendService reversebabyRE pwnfuncanary烧烤摊儿 crypto基于国密SM2算法的密文分发可信度量Sign_in_passwd misc 签到卡 就是做了个p…

CoreDX DDS应用开发指南(2)安装和应用开发

2 CoreDX DDS安装 2.1 系统支持 2.1.1 支持的CPU架构和操作系统 2.1.2 支持的语言和编译器

Linux 实操篇-进程管理(重点)

Linux 实操篇-进程管理(重点) 基本介绍 在LINUX 中&#xff0c;每个执行的程序都称为一个进程。每一个进程都分配一个ID 号(pid,进程号)。>windows > linux每个进程都可能以两种方式存在的。前台与后台&#xff0c;所谓前台进程就是用户目前的屏幕上可以进行操作的。后…

[BJDCTF 2020]easy_md5

TL;DR php弱类型比较md5碰撞绕过&#xff0c;强类型比较传数组绕过ffifdyop md5后的值字符串值为’or’6<乱码>&#xff0c;可用于构造sql注入的bypass没思路了看看网页源代码、看看响应头 过程 拿到题目链接&#xff0c;放到burp里&#xff0c;发现响应头中的提示&am…

JavaScript实现100以内奇数和的代码

以下为实现100以内奇数和的程序代码和运行截图 目录 前言 一、100以内奇数和 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题目要求实现相关使用功能…

软件工程导论(三)系统概要设计

一、系统设计概述 1.1系统设计概述 设计和抽象 系统行为驱动完成设计面向对象设计系统数据驱动完成设计 面向操作的设计 面向数据的设计 设计主要分为三个步骤&#xff1a; 概要设计&#xff1a;接收需求的文档&#xff0c;完成模块的分解 详细设计&#xff1a;根据分解…

Linux 实操篇-网络配置

Linux 实操篇-网络配置 Linux 网络配置原理图 查看网络IP 和网关 查看虚拟网络编辑器和修改IP 地址 查看网关 查看windows 环境的中VMnet8 网络配置(ipconfig 指令) 查看linux 的网络配置ifconfig ping 测试主机之间网络连通性 基本语法 ping 目的主机&#xff08;功能描述…

CXGRid实现拖动鼠标多选

要实现在CXGrid中拖动鼠标多选&#xff0c;您可以按住鼠标左键并拖动鼠标&#xff0c;直到选择了要选择的单元格或行。您可以在拖动过程中按住Shift键来限制选择范围。拖动选择的单元格或行时&#xff0c;您可以按住Ctrl键来添加或删除单元格或行的选择。当您完成选择时&#x…

ChatGPT最全问答,你想知道的都在这里!

导读&#xff1a;ChatGPT最全问答&#xff0c;你想知道的都在这里&#xff01;本文为你详细解答了ChatGPT是什么、有哪些应用场景、如何更好地向ChatGPT提问以及ChatGPT的进阶技巧&#xff0c;让你轻松成为ChatGPT专家&#xff01; ChatGPT是什么&#xff1f; ChatGPT是一种自然…

简单Demo实现Javaweb的搭建在Tomcat

文章目录 环境准备程序编写 环境准备 本机&#xff1a;MacBook Pro 系统&#xff1a;MacOS 13.4 Tomcat 下载&#xff1a;Apache Tomcat - Welcome! 这里我下载的是9.0.75版本 启动Tomcat容器碰到Bug:Tomcat started.但是就是没法访问到相关页面&#xff0c;同时jps也没有相关…

Java数据驱动:CData JDBC Drivers 2022 Crack

JDBC 驱动程序 易于使用的 JDBC 驱动程序&#xff0c;具有强大的企业级功能 无与伦比的性能和可扩展性。 对实时数据的简单 JDBC/SQL 访问。 从流行的 BI 工具访问实时数据。 集成到流行的 IDE 中。 CData JDBC Drivers Software 是领先的数据访问和连接解决方​​案提供商。我…

附录4-微信开发者工具

目录 1.安装 2 微信开发者工具常用操作 2.1 创建项目 2.2 预览效果 2.3 查看小程序信息 2.4 自定义编译 2.4.1 创建编译模式 2.4.2 使用创建好的编译模式 2.4.3 删除编译模式 1.安装 【微信开发者工具下载】2023年最新官方正式版微信开发者工具免费下载 - 腾…

【企业化部署】Nginx之Rewrite与location的用法

文章目录 前言一、正则表达式1. Nginx 的正则表达式2. 正则表达的优势3. Nginx 使用正则的作用 二、location 的概念1. location 和 rewrite 区别2. location 匹配的分类3. location 常用的匹配规则3.1 location 匹配优先级3.2 location 匹配的实例3.3 实际网站规则定义第一个必…

Netty之EventLoop 解读

是什么 EventLoop &#xff08;事件循环对象&#xff09;本质是一个单线程执行器&#xff08;同时维护了一个 Selector&#xff09;&#xff0c;里面有 run 方法处理 Channel 上源源不断的 io 事件。 它的继承关系比较复杂 一条线是继承自 j.u.c.ScheduledExecutorService 因…

CenterSpace.NMath.Standard.Windows.X64 7.4 Crack

适用于所有 .NET 语言&#xff0c;包括 C#、Visual Basic 和 F#。 CenterSpace Software的NMath TM .NET 数学和统计库为.NET平台上的金融、工程和科学应用程序提供数值组件。 基础 .NET 数学和统计库NMath包括复数类、一般向量和矩阵类、结构化稀疏矩阵类和因式分解、一般稀疏…

华为OD机试真题 Java 实现【找出通过车辆最多颜色】【2023Q1 100分】

一、题目描述 在一个狭小的路口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出n秒内经过的最多颜色的车辆数量。 三种颜色编号为0、1、2。 二、输入描述 第一行输入的是通过的车辆颜色信息 [0 1 1 2] 代表4秒钟通过的车辆颜色分别是0 1…

Rust每日一练(Leetday0020) 最后单词的长度、螺旋矩阵II、排列序列

目录 58. 最后一个单词的长度 Length of Last Word &#x1f31f; 59. 螺旋矩阵 II Spiral Matrix II &#x1f31f;&#x1f31f; 60. 排列序列 Permutation Sequence &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日…

Java企业级信息系统开发学习笔记14 Spring Boot(使用Spring Initializr方式构建Spring Boot项目)

文章目录 一、使用Spring Initializr方式构建Spring Boot项目&#xff08;一&#xff09;创建Spring Boot项目&#xff08;二&#xff09;创建控制器&#xff08;三&#xff09;运行入口类&#xff08;四&#xff09;访问Web页面&#xff08;五&#xff09;修改访问映射路径 一…