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

MyBatis SQL 映射文件的作用和结构

MyBatis SQL 映射文件定义了 SQL 语句以及如何将 SQL 语句的参数和结果映射到 Java 对象。
一、 作用 (Purpose)

MyBatis SQL 映射文件(通常命名为 XXXMapper.xml)的主要作用是:

  1. 定义 SQL 语句: 在 XML 映射文件中编写 SQL 语句,包括 SELECT, INSERT, UPDATE, DELETE 等各种类型的 SQL 语句。
  2. 参数映射 (Parameter Mapping): 定义如何将 Java 方法的参数映射到 SQL 语句中的参数。 可以使用 #$ 占位符,并指定参数类型、jdbcType 等信息。
  3. 结果映射 (Result Mapping): 定义如何将 SQL 语句的查询结果映射到 Java 对象。 可以使用 resultTyperesultMap,并定义一对一、一对多等关系映射。
  4. 动态 SQL (Dynamic SQL): 使用 MyBatis 提供的动态 SQL 元素 (例如 <if>, <choose>, <when>, <otherwise>, <where>, <set>, <foreach>),根据不同的条件动态生成 SQL 语句。
  5. 缓存配置 (Cache Configuration): 配置 SQL 语句的缓存行为,提高查询性能。
  6. 与 Mapper 接口关联: 将 SQL 映射文件与 Java Mapper 接口关联起来,使得可以通过调用 Mapper 接口的方法来执行 SQL 语句。

总而言之,SQL 映射文件是 MyBatis 将 SQL 语句与 Java 代码解耦的关键,它允许开发者专注于 SQL 语句的编写和优化,而无需关心 JDBC 的细节。

二、 结构 (Structure)

MyBatis SQL 映射文件的根元素是 <mapper>,它包含多个子元素,用于定义 SQL 语句、参数映射、结果映射等信息。 以下是一个典型的 SQL 映射文件结构:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!-- 1. cache (缓存) --><cacheeviction="LRU"flushInterval="60000"readOnly="true"size="512"/><!-- 2. resultMap (结果映射) --><resultMap id="UserResultMap" type="com.example.model.User"><id property="id" column="id"/><result property="username" column="username"/><result property="email" column="email"/><!-- association (一对一) --><association property="address" column="address_id" javaType="com.example.model.Address"select="com.example.mapper.AddressMapper.selectAddressById"/><!-- collection (一对多) --><collection property="orders" column="id" ofType="com.example.model.Order"select="com.example.mapper.OrderMapper.selectOrdersByUserId"/></resultMap><!-- 3. select (查询) --><select id="selectUserById" parameterType="int" resultMap="UserResultMap" useCache="true">SELECT * FROM user WHERE id = #{id}</select><!-- 4. insert (插入) --><insert id="insertUser" parameterType="com.example.model.User" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (username, email) VALUES (#{username}, #{email})</insert><!-- 5. update (更新) --><update id="updateUser" parameterType="com.example.model.User">UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}</update><!-- 6. delete (删除) --><delete id="deleteUserById" parameterType="int">DELETE FROM user WHERE id = #{id}</delete><!-- 7. sql (SQL 片段) --><sql id="userColumns">id, username, email</sql></mapper>

三、各个元素详解

  1. <mapper> (根元素):

    • namespace 属性:指定 Mapper 接口的完全限定名。 MyBatis 会根据这个命名空间来查找 SQL 映射文件,并将 SQL 语句与 Mapper 接口的方法关联起来。 这是将 SQL 映射文件与 Java 代码关联的关键。
      例如:<mapper namespace="com.example.mapper.UserMapper"> 对应着 UserMapper.java 接口文件
  2. <cache> (缓存):

    • 配置该 Mapper 对应的二级缓存。
    • eviction 属性:指定缓存的淘汰策略 (LRU, FIFO, SOFT, WEAK)。
    • flushInterval 属性:指定缓存的刷新间隔 (毫秒)。
    • size 属性:指定缓存的最大容量。
    • readOnly 属性:指定缓存是否只读 (truefalse)。
    • <cache type="org.mybatis.cache.impl.PerpetualCache"/> 使用自定义缓存
  3. <cache-ref> (缓存引用):

    • 引用其他 Mapper 的缓存配置。
    • namespace 属性:指定要引用的 Mapper 的命名空间。
  4. <resultMap> (结果映射):

    • 作用: 定义如何将 SQL 语句的查询结果映射到 Java 对象。

    • id 属性:指定 resultMap 的唯一标识。

    • type 属性:指定要映射的 Java 类型。

    • 子元素:

      • <id>:定义主键映射。
        • property 属性:指定 Java 对象的属性名。
        • column 属性:指定数据库表中的列名。
      • <result>:定义普通属性映射。
        • property 属性:指定 Java 对象的属性名。
        • column 属性:指定数据库表中的列名。
      • <association>:定义一对一关系映射。
        • property 属性:指定 Java 对象的属性名。
        • column 属性:指定数据库表中的列名。
        • javaType 属性:指定关联对象的 Java 类型。
        • select 属性:指定用于查询关联对象的 SQL 语句的 ID。
      • <collection>:定义一对多关系映射。
        • property 属性:指定 Java 对象的属性名。
        • column 属性:指定数据库表中的列名。
        • ofType 属性:指定集合中元素的 Java 类型。
        • select 属性:指定用于查询集合元素的 SQL 语句的 ID。
      • <discriminator>:定义鉴别器,根据不同的条件选择不同的映射规则。
        • column 属性:指定用于鉴别的列名。
        • <case> 元素:定义不同的映射规则。
          • value 属性:指定鉴别值。
          • resultMap 属性:指定要使用的 resultMap
    • 示例:

      <resultMap id="UserResultMap" type="com.example.model.User"><id property="id" column="id"/><result property="username" column="username"/><result property="email" column="email"/><association property="address" column="address_id" javaType="com.example.model.Address"select="com.example.mapper.AddressMapper.selectAddressById"/><collection property="orders" column="id" ofType="com.example.model.Order"select="com.example.mapper.OrderMapper.selectOrdersByUserId"/>
      </resultMap>
      
  5. <select> (查询):

    • 作用: 定义 SELECT 语句,用于查询数据。

    • id 属性:指定 SQL 语句的唯一标识。 与 Mapper 接口中的方法名对应。

    • parameterType 属性:指定参数类型。

    • resultType 属性:指定结果类型(如果使用简单类型映射)。

    • resultMap 属性:指定结果映射 (如果使用 <resultMap> 元素)。

    • parameterMap 属性: (已经过时, 不建议使用)

    • flushCache 属性: 如果设置为 true,则每次执行该语句都会刷新缓存。

    • useCache 属性:如果设置为 true,则该语句的结果会被缓存。

    • timeout 属性:设置超时时间(秒)。

    • fetchSize 属性:设置每次从数据库获取的记录数量。

    • statementType 属性: 指Statement类型, 可选值为 STATEMENT、PREPARED 和 CALLABLE。

      • STATEMENT, 默认值, 使用Statement
      • PREPARED, 使用PreparedStatement, 可以防止SQL注入, 性能更好。
      • CALLABLE, 主要用于执行存储过程
    • 示例:

      <select id="selectUserById" parameterType="int" resultMap="UserResultMap" useCache="true">SELECT * FROM user WHERE id = #{id}
      </select>
      
  6. <insert> (插入):

    • 作用: 定义 INSERT 语句,用于插入数据。

    • id 属性:指定 SQL 语句的唯一标识。

    • parameterType 属性:指定参数类型。

    • useGeneratedKeys 属性:是否允许 MyBatis 使用 JDBC 的 getGeneratedKeys 方法获取自增主键值。

    • keyProperty 属性:指定 Java 对象的哪个属性用于接收自增主键值。

    • keyColumn属性:指定数据库表的主键列名.

    • 示例:

      <insert id="insertUser" parameterType="com.example.model.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">INSERT INTO user (username, email) VALUES (#{username}, #{email})
      </insert>
      
  7. <update> (更新):

    • 作用: 定义 UPDATE 语句,用于更新数据。

    • id 属性:指定 SQL 语句的唯一标识。

    • parameterType 属性:指定参数类型。

    • 示例:

      <update id="updateUser" parameterType="com.example.model.User">UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}
      </update>
      
  8. <delete> (删除):

    • 作用: 定义 DELETE 语句,用于删除数据。

    • id 属性:指定 SQL 语句的唯一标识。

    • parameterType 属性:指定参数类型。

    • 示例:

      <delete id="deleteUserById" parameterType="int">DELETE FROM user WHERE id = #{id}
      </delete>
      
  9. <sql> (SQL 片段):

    • 作用: 定义可以重复使用的 SQL 代码片段。

    • id 属性:指定 SQL 片段的唯一标识。

    • 示例:

      <sql id="userColumns">id, username, email
      </sql>
      

四、 动态 SQL 元素 (Dynamic SQL Elements)

MyBatis 提供了以下动态 SQL 元素,可以根据不同的条件动态生成 SQL 语句:

  1. <if>

    • 作用: 根据条件判断是否包含某段 SQL 代码。

    • test 属性:指定判断条件,使用 OGNL 表达式。

    • 示例:

      <select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">SELECT * FROM user<where><if test="username != null and username != ''">AND username = #{username}</if><if test="email != null and email != ''">AND email = #{email}</if></where>
      </select>
      
  2. <choose>, <when>, <otherwise>

    • 作用: 类似于 Java 中的 switch-case 语句,用于选择其中一个条件分支。

    • <choose> 元素:包含多个 <when> 元素和一个 <otherwise> 元素。

    • <when> 元素:指定条件和对应的 SQL 代码。

    • <otherwise> 元素:指定默认的 SQL 代码(当所有 <when> 条件都不满足时执行)。

    • test 属性:指定 <when> 元素的判断条件,使用 OGNL 表达式。

    • 示例:

      <select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">SELECT * FROM user<where><choose><when test="username != null and username != ''">AND username = #{username}</when><when test="email != null and email != ''">AND email = #{email}</when><otherwise>AND 1 = 1</otherwise></choose></where>
      </select>
      
  3. <where>

    • 作用: 动态生成 WHERE 子句,并自动处理 ANDOR 关键字。

    • 如果 <where> 元素内部有任何内容,它会自动添加 WHERE 关键字。

    • 如果 <where> 元素内部的内容以 ANDOR 开头,它会自动移除这些关键字。

    • 示例:

      <select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">SELECT * FROM user<where><if test="username != null and username != ''">AND username = #{username}</if><if test="email != null and email != ''">AND email = #{email}</if></where>
      </select>
      
  4. <set>

    • 作用: 动态生成 SET 子句,用于 UPDATE 语句,并自动处理逗号 ,

    • 如果 <set> 元素内部有任何内容,它会自动添加 SET 关键字。

    • 如果 <set> 元素内部的内容以逗号 , 开头,它会自动移除这个逗号。

    • 示例:

      <update id="updateUserSelective" parameterType="com.example.model.User">UPDATE user<set><if test="username != null">username = #{username},</if><if test="email != null">email = #{email},</if></set>WHERE id = #{id}
      </update>
      
  5. <trim>

    • 作用: 更通用的动态 SQL 元素,可以自定义前缀、后缀、以及前缀和后缀要移除的内容。

    • prefix 属性:指定前缀。

    • suffix 属性:指定后缀。

    • prefixOverrides 属性:指定要移除的前缀。

    • suffixOverrides 属性:指定要移除的后缀。

    • 示例:

      <select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">SELECT * FROM user<trim prefix="WHERE" prefixOverrides="AND |OR"><if test="username != null and username != ''">AND username = #{username}</if><if test="email != null and email != ''">AND email = #{email}</if></trim>
      </select><update id="updateUserSelective" parameterType="com.example.model.User">UPDATE user<trim prefix="SET" suffixOverrides=","><if test="username != null">username = #{username},</if><if test="email != null">email = #{email},</if></trim>WHERE id = #{id}
      </update>
      
  6. <foreach>

    • 作用: 用于遍历集合,生成重复的 SQL 代码。

    • collection 属性:指定要遍历的集合。

    • item 属性:指定集合中元素的别名。

    • index 属性:指定当前元素的索引的别名。

    • open 属性:指定循环开始时的字符串。

    • close 属性:指定循环结束时的字符串。

    • separator 属性:指定元素之间的分隔符。

    • 示例:

      <select id="selectUsersByIds" parameterType="list" resultMap="UserResultMap">SELECT * FROM userWHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach>
      </select><insert id="insertUsers" parameterType="list">INSERT INTO user (username, email) VALUES<foreach item="user" collection="list" separator="," >(#{user.username}, #{user.email})</foreach>
      </insert>
      
  7. <bind>

    • 作用: 创建一个变量,并将其绑定到 OGNL 表达式的结果。
    • name 属性: 指定变量名
    • value 属性: 指定 OGNL 表达式
    • 示例:
      <select id="selectUsersBySearchTerm" parameterType="string" resultMap="UserResultMap"><bind name="pattern" value="'%' + searchTerm + '%'" />SELECT * FROM userWHERE username LIKE #{pattern} OR email LIKE #{pattern}
      </select>
      

五、 DOCTYPE (Document Type Definition)

MyBatis SQL 映射文件需要遵循特定的 DTD 约束.

  • DTD 声明:

    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
  • DTD 文件:

    • mybatis-3-mapper.dtd 文件定义了 MyBatis SQL 映射文件的结构。可以在 MyBatis 的官方网站上找到该文件。
    • 开发中通常不需要我们手动修改 DTD 文件,只需要在 XML 配置文件中声明 DTD 即可。

六、总结

MyBatis SQL 映射文件是 MyBatis 框架的核心,它定义了 SQL 语句以及如何将 SQL 语句的参数和结果映射到 Java 对象。

相关文章:

MyBatis SQL 映射文件的作用和结构

MyBatis SQL 映射文件定义了 SQL 语句以及如何将 SQL 语句的参数和结果映射到 Java 对象。 一、 作用 (Purpose) MyBatis SQL 映射文件&#xff08;通常命名为 XXXMapper.xml&#xff09;的主要作用是&#xff1a; 定义 SQL 语句&#xff1a; 在 XML 映射文件中编写 SQL 语句…...

MYSQL之创建数据库和表

创建数据库db_ck &#xff08;下面的创建是最好的创建方法&#xff0c;如果数据库存在也不会报错&#xff0c;并且指定使用utf8mb4&#xff09; show databases命令可以查看所有的数据库名&#xff0c;可以找到刚刚创建的db_ck数据库 使用该数据库时&#xff0c;发现里面没有…...

react+ts+eslint+prettier 配置教程

1.创建项目 npx create-react-app my-app --template typescript 2.安装依赖 eslint&#xff1a;核心代码质量工具。 prettier&#xff1a;代码格式化工具。 eslint-plugin-prettier&#xff1a;将 Prettier 的规则集成到 ESLint 中。 eslint-config-prettier&#xff1a;…...

ArduPilot开源代码之AP_OSD

ArduPilot开源代码之AP_OSD 1. 源由2. 简介3. 补丁4. 框架设计4.1 启动代码 (AP_OSD::init)4.2 任务代码 (AP_OSD::osd_thread)4.3 实例初始化 (AP_OSD::init_backend) 5. 重要例程5.1 AP_OSD::update_stats5.2 AP_OSD::update_current_screen5.3 AP_OSD::update_osd 6. 总结7.…...

sysbench手动测试OceanBase v4.2.4集群

环境&#xff1a; 1、ocp&#xff08;sysbench节点&#xff09; 192.192.103.128 2、ob集群1-1-1 observer 192.192.103.125、192.192.103.126、192.192.103.127&#xff0c;primary_zone:random haproxy 192.192.103.125、192.192.103.126、192.192.103.127 一、安装sysben…...

腾讯元宝:AI 时代的快速论文阅读助手

1. 背景与需求 在 AI 研究领域&#xff0c;每天都会涌现大量学术论文。如何高效阅读并提取关键信息成为研究者的一大难题。腾讯元宝是腾讯推出的一款大模型&#xff0c;结合了**大语言模型&#xff08;LLM&#xff09;和自然语言处理&#xff08;NLP&#xff09;**技术&#x…...

重构谷粒商城09:人人开源框架的快速入门

谷粒商城09——人人开源框架的快速入门 前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶…...

AAA 技术详解:认证、授权与计费的原理、应用与配置实践

AAA&#xff08;Authentication, Authorization, Accounting&#xff0c;即认证、授权和计费&#xff09;是网络安全的“身份管理员”&#xff0c;负责验证用户身份、分配访问权限并记录行为轨迹。它如同网络世界中的“物业管理系统”&#xff0c;通过三重机制确保接入安全、权…...

OneM2M:全球性的物联网标准-可应用于物联网中

OneM2M 是一个全球性的物联网(IoT)标准,旨在为物联网设备和服务提供统一的框架和接口,以实现设备之间的互操作性、数据共享和服务集成。OneM2M 由多个国际标准化组织(如 ETSI、TIA、TTC、ARIB 等)共同制定,目标是解决物联网领域的碎片化问题,提供一个通用的标准,支持跨…...

redis数据迁移教程(使用RedisShake实现不停机迁移十分便捷)

1.我的场景 需要把本地的redis数据上传到阿里云服务器上面,服务器上redis并没有开aof持久化,但是将rdb文件上传至服务器后每次重启redis,rdb文件会被覆盖导致无法同同步数据,最终决定使用RedisShake 2.RedisShake介绍 什么是 RedisShake​ RedisShake 是一个用于处理和迁移…...

Linux基本操作指令3

1、wget: 这是一个用于从网络上下载文件的命令行工具。它支持 HTTP、HTTPS 和 FTP 协议。 wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run 2、下载完成后&#xff0c;你可以通过以下命令使文件可执行并运行安装程序&#xff1a; ch…...

2025年2月平价旗舰手机性能对比

1、荣耀Magic7 点评&#xff1a;缺席潜望式长焦&#xff0c;3X直立长焦体验还行。兼顾性能、游戏、屏幕、影像、续航、快充等诸多方面&#xff0c;且外围配置比较齐全。 2、vivo x200 点评&#xff1a;潜望式长焦相机&#xff0c;拍照效果好&#xff0c;30W无线充电着实鸡肋&a…...

Python SQLite3 保姆级教程:从零开始学数据库操作

Python SQLite3 保姆级教程&#xff1a;从零开始学数据库操作 本文适合纯新手&#xff01;无需任何数据库基础&#xff0c;跟着步骤操作即可掌握 SQLite3 的核心用法。 目标&#xff1a;让你像用记事本一样轻松操作数据库&#xff01; 目录 什么是 SQLite3&#xff1f;环境准…...

第七步:简单爬虫与网页测试

Puppeteer 官方文档&#xff1a;https://puppeteer.bootcss.com/ 1、安装 puppeteer是一个node插件安装命令&#xff1a;npm i puppeteer 2、概念 无头浏览器&#xff1a;就是不打开浏览器的页面&#xff0c;直接进行浏览器后台操作 3、入门 引入&#xff1a;import pup…...

4.桥接模式

概况 桥接模式&#xff1a;将抽象部分与实现部分分离&#xff0c;使它们可以独立变化&#xff0c;通过组合而非继承的方式实现解耦。 业务场景 场景描述&#xff1a;开发一个跨平台的图形绘制系统&#xff0c;支持不同形状&#xff08;如圆形、矩形&#xff09;和不同渲染方式…...

Golang学习笔记_44——命令模式

Golang学习笔记_41——观察者模式 Golang学习笔记_42——迭代器模式 Golang学习笔记_43——责任链模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 事务管理系统2. 多媒体遥控器3. 操作审计系统 四、Go语言实现示例五、高级应用…...

算法中的背包问题详解:部分背包与0-1背包

1. 背包问题概述 背包问题是组合优化中的经典问题&#xff0c;其核心目标是&#xff1a;在给定容量的背包中装入一组物品&#xff0c;使得物品的总价值最大化。根据物品是否可分割或重复选择&#xff0c;背包问题分为多个变种&#xff0c;其中最常见的两种是&#xff1a; 部分…...

【单片机通信技术】STM32 HAL库 SPI主从机通过串口发送数据

一、说明 使用STM32F103C8T6最小系统板&#xff0c;让板载SPI1与SPI2通信&#xff0c;通过串口收发数据。本文章说明了在配置与编写时遇到的一些问题&#xff0c;以及详细说明如何使用cubeMAX进行代码编写。 二、CubeMAX配置 1.时钟配置选择外部高速时钟 2.系统模式与时钟配…...

laravel中 添加公共/通用 方法/函数

一&#xff0c;现在app 下面创建Common目录&#xff0c;然后在创建Common.php 文件 二&#xff0c;修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…...

Jetpack Compose — 入门实践

一、项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose。 开发工具: Android Studio 1.1 创建支持 Compose 新应用 新版 Android Studio 默认创建新项目即为 Compose 项目。 注意:在 Language 下拉菜单中,Kotlin 是唯一可…...

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 or Set--lower_bound()的解法!!!

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 并查集解析代码【并查集解】 Set 解法解析lower_bound代码 题目 并查集解析 首先先让所有的f&#xff08;i&#xff09;i&#xff0c;即每个人最开始的祖先都是自己&#xff0c;然后就每一次都让轮到那个数的父亲1&#xff08…...

应用案例 | 精准控制,高效运行—宏集智能控制系统助力SCARA机器人极致性能

概述 随着工业4.0的深入推进&#xff0c;制造业对自动化和智能化的需求日益增长。传统生产线面临空间不足、效率低下、灵活性差等问题&#xff0c;尤其在现有工厂改造项目中&#xff0c;如何在有限空间内实现高效自动化成为一大挑战。 此次项目的客户需要在现有工厂基础上进行…...

Greenplum6.19集群搭建

一&#xff0c;安装说明 1.1环境说明 1、首先确定部署的环境&#xff0c;确定下服务器的端口&#xff0c;一般默认是22的端口&#xff1b; 2、当前这份文档是服务器处于10022端口下部署的&#xff08;现场生产环境要求&#xff0c;22端口在生产环境存在安全隐患&#xff09;&…...

sqlserver中的锁模式 | SQL SERVER如何开启MVCC(使用row-versioning)【启用行版本控制减少锁争用】

文章目录 引言锁和隔离级别的关系锁模式之间兼容性I 隔离级别SQLServer默认的隔离级别为:“read commited” (已提交读)在SQLServer2005引入了基于行版本控制的隔离级别。SQL SERVER如何开启MVCC(使用row-versioning)sqlserver开启MVCC后的锁II sqlserver中的锁模式**1、共享…...

胜软科技冲刺北交所一年多转港股:由盈转亏,毛利率大幅下滑

《港湾商业观察》施子夫 近期&#xff0c;山东胜软科技股份有限公司&#xff08;以下简称&#xff0c;胜软科技&#xff09;递表港交所获受理&#xff0c;独家保荐机构为广发证券&#xff08;香港&#xff09;。 在赴港上市之前&#xff0c;胜软科技还曾谋求过A股上市&#x…...

Java零基础入门笔记:多线程

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章…...

Django 中,Form 和 ModelForm的用法和区别

在 Django 中,Form 和 ModelForm 是用于处理表单数据的两种主要方式。它们的主要区别在于是否与模型(Model)直接关联。以下是它们的用法、区别以及高级用法的详细说明: 一、Form 的使用 1. 基本用法 Form 是一个独立的表单类,不与任何模型直接关联。适用于需要手动定义字…...

tcp udp区别

TCP&#xff08;传输控制协议&#xff09; 和 UDP&#xff08;用户数据报协议&#xff09; 是两种常用的传输层协议&#xff0c;它们在数据传输方式、可靠性和应用场景等方面有显著区别。以下是它们的主要区别&#xff1a; 1. 连接方式 TCP&#xff1a;面向连接的协议。通信前需…...

数据类设计_图片类设计之1_矩阵类设计(前端架构基础)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 图形在底层是怎么表示的,用C来表示 认识图片 图片是个风景,动物,还是其他内容,人是可以看出来的.那么计算机是怎么看懂的呢?在有自主意识的人工智能被设计出来…...

C++:入门详解(关于C与C++基本差别)

目录 一.C的第一个程序 二.命名空间&#xff08;namespace&#xff09; 1.命名空间的定义与使用&#xff1a; &#xff08;1&#xff09;命名空间里可以定义变量&#xff0c;函数&#xff0c;结构体等多种类型 &#xff08;2&#xff09;命名空间调用&#xff08;&#xf…...