Mybatis简单练习注解sql和配置文件sql+注解形式加载+配置文件加载

项目结构

d:\test\runjar\data\static\data\mybatis_helloworld\Mybatis\
├── lib\
│   ├── asm-3.3.1.jar
│   ├── c3p0-0.9.1.2.jar
│   ├── cglib-2.2.2.jar
│   ├── commons-logging-1.1.1.jar
│   ├── ehcache-core-2.6.8.jar
│   ├── javassist-3.17.1-GA.jar
│   ├── log4j-1.2.17.jar
│   ├── log4j-api-2.0.2.jar
│   ├── log4j-core-2.0.2.jar
│   ├── mybatis-3.2.8.jar
│   ├── mybatis-ehcache-1.0.3.jar
│   ├── mysql-connector-j-8.0.33.jar
│   ├── mysql-connector-java-5.1.7-bin.jar
│   ├── slf4j-api-1.7.5.jar
│   └── slf4j-log4j12-1.7.5.jar
├── src\
│   ├── com\
│   │   └── atguigu\
│   │       └── mybatis\
│   │           ├── entity\
│   │           │   ├── Monster.java
│   │           │   └── Monster2.java
│   │           ├── mapper\
│   │           │   ├── MonsterAnnotation.java
│   │           │   ├── MonsterMapper.java
│   │           │   ├── MonsterMapper.xml
│   │           │   ├── MonsterMapper2.java
│   │           │   └── MonsterMapper2.xml
│   │           └── test\
│   │               ├── Bridge.java
│   │               ├── Facade.cld
│   │               ├── Facade.java
│   │               └── newfile.cld
│   ├── jdbc.properties
│   ├── log4j.xml
│   └── mybatis-config.xml
└── srclib\├── mybatis-3-mybatis-3.3.0.zip└── mysql-connector-java-5.1.37.zip

demo核心功能

  1. MyBatis 框架入门 :展示如何配置和使用 MyBatis 进行数据库操作
  2. 多种映射方式 :
    • 注解式映射:通过 MonsterAnnotation.java 演示
    • XML 配置式映射:通过 MonsterMapper.xmlMonsterMapper2.xml 演示
  3. 数据库操作 :实现了基本的 CRUD (创建、读取、更新、删除) 操作
  4. 高级查询 :展示了多种查询方式
    • 条件查询
    • 模糊查询
    • HashMap 参数查询
    • 动态 SQL 查询
  5. 结果映射 :演示了如何使用 resultMap 解决表字段名与实体类属性名不一致的问题

项目结构

  • 实体类 : Monster.javaMonster2.java 表示数据库表对应的 Java 对象
  • 映射器接口 :定义了数据库操作的方法
  • 配置文件 :
    • mybatis-config.xml :MyBatis 核心配置文件
    • jdbc.properties :数据库连接配置
    • log4j.xml :日志配置
  • 测试类 : Bridge.javaFacade.java 用于测试 MyBatis 功能

演示目的

  • 展示 MyBatis 如何简化数据库操作
  • 对比不同的映射方式 (注解 vs XML)
  • 演示 MyBatis 的高级特性 (动态 SQL、结果映射等)
  • 提供一个可运行的 MyBatis 入门示例

如何运行

  1. 确保已创建数据库表 (mybatis_monster_ 和 mybatis_monster2)
  2. 配置正确的数据库连接信息 (在 jdbc.properties 中)
  3. 运行 Bridge.java 或 Facade.java 中的 main 方法
    这个项目是学习 MyBatis 的良好入门示例,涵盖了框架的核心概念和常用功能。

表结构


CREATE TABLE mybatis_monster2 (monster_id INT PRIMARY KEY AUTO_INCREMENT,user_name VARCHAR(255),user_email VARCHAR(255)
);CREATE TABLE mybatis_monster_ (monster_id INT PRIMARY KEY AUTO_INCREMENT,age INT,birthday DATE,email VARCHAR(255),gender INT,name VARCHAR(255),salary DOUBLE
);INSERT INTO mybatis_monster_ (age, birthday, email, gender, name, salary) VALUES
(25, '1998-01-15', 'monster1@example.com', 1, 'Monster1', 5000.0),
(30, '1993-05-20', 'monster2@example.com', 0, 'Monster2', 6000.0);

实体类

//就是一个普通的Pojo类
//因为 使用原生态的sql语句查询结果还是要封装成对象
//所以我们要求大家这里的实体类属性名和表名字段保持一致。
// 忽略get set
public class Monster {private Integer monster_id;private Integer age;private String name;private String email;private Date birthday;private double salary;private Integer gender;
}// 忽略get set
public class Monster2 {private Integer monster_id;private String username;private String useremail;
}

注解式映射


package com.atguigu.mybatis.mapper;import java.util.List;import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import com.atguigu.mybatis.entity.Monster;public interface MonsterAnnotation {//添加方法,将我们的sql语句直接写在@Insert注解即可@Insert("INSERT INTO mybatis_monster_ (age,birthday,email,gender,name,salary) "+ "VALUES(#{age},#{birthday},#{email},#{gender},#{name},#{salary})")public void addMonster(Monster monster);//根据id删除一个Monster@Delete("DELETE FROM mybatis_monster_  "+ "WHERE monster_id=#{monster_id}")public void	delMonster(Integer monster_id);//修改Monster@Update("UPDATE mybatis_monster_ SET age=#{age}, birthday=#{birthday}, "+ "email = #{email},gender= #{gender}, "+ "name=#{name}, salary=#{salary} "+ "WHERE monster_id=#{monster_id}")public void updateMonster(Monster monster);//查询-根据id@Select("SELECT * FROM mybatis_monster_ WHERE "+ "monster_id = #{monster_id}")public Monster getMonsterById(Integer monster_id);//查询所有的Monster@Select("SELECT * FROM mybatis_monster_ ")public List<Monster> findAllMonster();
}

XML 配置式映射

mybatis-config.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><!-- 这里就是引入jdbc.properties文件 --><properties resource="jdbc.properties"></properties><typeAliases><!-- 如果一个包下有很多的类,我们可以直接给包取别名,这样该包下面的所有类名,就可以直接使用--><package name="com.atguigu.mybatis.entity"/><!-- <typeAlias type="com.itbull.mybatis.entity.Monster" alias="Monster"/> --></typeAliases><environments default="development"><!-- 配置我们mybatis的环境 --><environment id="development"><!-- mybatis使用事务管理器是jdbc直连方式 --><transactionManager type="JDBC" /><!-- 配置我们的数据源  --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.user}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments><mappers><!-- 这里会引入(注册)我们的 Mapper.xml文件 --><!-- <mapper resource="com/itbull/mybatis/mapper/MonsterMapper.xml"/> --><!-- 当一个包下有很多的Mapper.xml文件和基于注解实现的接口时,为了方便,我们可以以包方式进行注册将下面的所有xml文件和注解接口 都进行注册--><package name="com.atguigu.mybatis.mapper"/><!-- 如果我们有直接通过注解来实现的接口,可以这样注册到mybatsi框架中 -->
<!--		 <mapper class="com.atguigu.mybatis.mapper.MonsterAnnotation"/> --></mappers>
</configuration>
jdbc.properies
jdbc.user=root
jdbc.password=1234
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.driver=com.mysql.cj.jdbc.Driver
mapper.java
package com.atguigu.mybatis.mapper;import java.util.List;
import java.util.Map;import org.apache.ibatis.annotations.Param;import com.atguigu.mybatis.entity.Monster;
import com.atguigu.mybatis.entity.Monster2;public interface MonsterMapper {//添加方法void addMonster(Monster monster);//根据id删除一个Monstervoid	delMonster(Integer monster_id);//修改Monstervoid updateMonster(Monster monster);//查询-根据idMonster getMonsterById(Integer monster_id);//查询所有的MonsterList<Monster> findAllMonster();//通过id 或者名字查询List<Monster> findMonsterByNameORId(Monster monster);//查询名字中含义'牛魔王'妖怪List<Monster> findMonsterByName(String name);//查询 id > 10 并且 salary 大于 40, 要求传入的参数是HashMapList<Monster> findMonsterByIdAndSalary_PrameterHashMap(Map<String,Object> map);//查询 id > 10 并且 salary 大于 40, 要求传入的参数是HashMapList<Map<String,Object>> findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map<String,Object> map);//根据age查询结果List<Monster>  findMonsterByAge(@Param("age") Integer age);//根据id和名字来查询结果List<Monster> findMonsterByIdAndName(Monster monster);}package com.atguigu.mybatis.mapper;import java.util.List;import com.atguigu.mybatis.entity.Monster2;public interface MonsterMapper2 {//添加方法public void addMonster(Monster2 monster);//查询所有的Monsterpublic List<Monster2> findAllMonster();}
mapper.xml
<?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:表示一个映射器1. namespace="com.atguigu.mybatis.mapper.MonsterMapper"说明本mapper.xml文件是用来 映射管理 MonsterMapper接口,主要是去实现MonsterMapper接口声明方法2. select: 实现一个查询操作  insert:表示一个添加操作3. id="addMonster" 表示 MonsterMapper接口 的方法名4. resultType="xx" 返回的结果类型,如果没有就不需要写5. parameterType="com.atguigu.mybatis.entity.Monster" 表示该方法输入的参数类型6. (age,birthday,email,gender,name,salary) 表的字段名7. #{age},#{birthday},#{email},#{gender},#{name},#{salary} 是实体类Monster的属性名-->
<mapper namespace="com.atguigu.mybatis.mapper.MonsterMapper"><!-- 配置我们的添加方法,获取到刚刚加入的monster对象的id 1. useGeneratedKeys="true" 表示要返回刚刚添加的对象的主键值2. keyProperty="monster_id" 表示返回的刚刚添加的对象的主键值,set到monster_id 属性--><insert id="addMonster" parameterType="Monster"useGeneratedKeys="true" keyProperty="monster_id">INSERT INTO mybatis_monster_ (age,birthday,email,gender,name,salary) VALUES(#{age},#{birthday},#{email},#{gender},#{name},#{salary})</insert><!-- 实现delMonster方法 注意 parameterType="Integer" 如果是Java本身的数据类型直接写类名即可--><delete id="delMonster" parameterType="Integer">DELETE FROM mybatis_monster_  WHERE monster_id=#{monster_id}</delete><!-- 实现updateMonster方法 --><update id="updateMonster" parameterType="Monster">UPDATE mybatis_monster_ SET age=#{age}, birthday=#{birthday}, email = #{email},gender= #{gender}, name=#{name}, salary=#{salary} WHERE monster_id=#{monster_id}</update><!-- 实现getMonsterById方法 --><select id="getMonsterById" parameterType="Integer" resultType="Monster">SELECT * FROM mybatis_monster_ WHERE monster_id = #{monster_id}</select><!-- 实现findAllMonster --><select id="findAllMonster" resultType="Monster">SELECT * FROM mybatis_monster_ </select><!-- 实现findMonsterByNameORId --><select id="findMonsterByNameORId" parameterType="Monster" resultType="Monster">SELECT  * FROM mybatis_monster_ WHERE monster_id=#{monster_id} OR name=#{name}</select><!-- 看看模糊查询的使用 取值 需要 ${value} 取值--><select id="findMonsterByName" parameterType="String" resultType="Monster">SELECT  * FROM mybatis_monster_ WHERE name LIKE '%${value}%'</select><!-- 实现findMonsterByIdAndSalary_PrameterHashMap --><select id="findMonsterByIdAndSalary_PrameterHashMap" parameterType="map" resultType="Monster">SELECT * FROM mybatis_monster_ WHERE monster_id > #{monster_id} AND salary > #{salary}</select><!-- 实现findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap传入的参数和返回的参数都是HashMap--><select id="findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap" parameterType="map"resultType="map">SELECT monster_id,name FROM mybatis_monster_ WHERE monster_id > #{monster_id} AND salary > #{salary}</select><!-- 实现findMonsterByAge --><select id="findMonsterByAge" resultType="Monster" parameterType="Integer">SELECT * FROM mybatis_monster_  WHERE 1=1<if test="age > 0">AND age > #{age}</if></select><!-- 实现 findMonsterByIdAndName 【where 和 if】 --><select id="findMonsterByIdAndName" parameterType="Monster" resultType="Monster">SELECT * FROM mybatis_monster_ <!-- 使用where标签开始拼接 where 标签的好处是1. 会自动的加入where子句.mybatis会自动的去掉多余的AND--><where><if test="monster_id > 0">AND monster_id > #{monster_id}</if><if test="name != null and name != ''">AND name = #{name}</if></where></select></mapper>
<?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.atguigu.mybatis.mapper.MonsterMapper2"><!-- 实现 addMonster --><insert id="addMonster" parameterType="monster2">INSERT INTO mybatis_monster2 (user_name,user_email) VALUES(#{username}, #{useremail})</insert><!-- 实现 findAllMonster【使用别名 屏蔽属性名和字段名不一致 1.可以用,但是复用性不ok 2. 】 --><!-- <select id="findAllMonster" resultType="Monster2">SELECT monster_id,user_name AS username, user_email AS useremail FROM mybatis_monster2</select> --><!-- 实现 findAllMonster【resultmap 屏蔽属性名和字段名不一致 1.复用性好,高大上  】 --><!-- 1. resultMap 表示我们定义一个结果映射2. type="Monster2" 返回的真正的数据类型还是 Monster2对象3. id="findAllMonsterMap", 给 resultMap  取名4. column="user_name"  表中的字段5. property="username" 表示对象的属性--><resultMap type="Monster2" id="findAllMonsterMap"><result column="user_name" property="username"/><result column="user_email" property="useremail"/></resultMap><select id="findAllMonster" resultMap="findAllMonsterMap" >SELECT * FROM mybatis_monster2</select>
</mapper>

日志

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><!--使用 ConsoleAppender 来输出日志,到eclipse的控制台--><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><!--输出的编码是utf-8--><param name="Encoding" value="UTF-8" /><!--输入日志的布局格式 --><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" /></layout></appender><!--日志记录 java.sql 包下的类产生的debug级别的错误信息--><logger name="java.sql"><level value="debug" /></logger><!--日志记录 org.apache.ibatis 包下的类产生的debug级别的错误信息--><logger name="org.apache.ibatis"><level value="debug" /></logger><!--从根开始就使用这样的配置,直接饮用 STDOUT--><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
</log4j:configuration>

测试

package com.atguigu.mybatis.test;import java.io.IOException;
import java.io.InputStream;
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 com.atguigu.mybatis.entity.Monster;
import com.atguigu.mybatis.mapper.MonsterAnnotation;public class Bridge {public static void main(String[] args) {// 1. 加载 MyBatis 配置文件String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);// 2. 创建 SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3. 获取 SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4. 获取 Mapper 接口MonsterAnnotation monsterAnnotation = sqlSession.getMapper(MonsterAnnotation.class);// 5. 调用方法查询所有 MonsterList<Monster> monsters = monsterAnnotation.findAllMonster();// 6. 输出结果System.out.println("查询到的 Monster 数量: " + monsters.size());for (Monster monster : monsters) {System.out.println(monster);}// 7. 关闭资源sqlSession.close();} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}
package com.atguigu.mybatis.test;import com.atguigu.mybatis.entity.Monster;
import com.atguigu.mybatis.entity.Monster2;
import com.atguigu.mybatis.mapper.MonsterMapper2;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Facade {public static void main(String[] args) {// 1. 加载 MyBatis 配置文件String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);// 2. 创建 SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3. 获取 SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4. 获取 Mapper 接口MonsterMapper2 monsterAnnotation = sqlSession.getMapper(MonsterMapper2.class);// 5. 调用方法查询所有 MonsterList<Monster2> monsters = monsterAnnotation.findAllMonster();// 6. 输出结果System.out.println("查询到的 Monster 数量: " + monsters.size());for (Monster2 monster : monsters) {System.out.println(monster);}// 7. 关闭资源sqlSession.close();} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}

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

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

相关文章

抗日胜利80周年 | HTML页面

飞翔的和平鸽&#xff1b;屹立的人民英雄纪念碑&#xff1b;倒下的日本国旗&#xff1b;旋转的金色勋章无不代表着我们胜利了&#xff01;&#xff01;&#xff01;HTML源代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta cha…

web仿写网站

一、完成自己学习的官网&#xff0c;至少三个不同的页面。1、界面1&#xff08;1&#xff09;代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

基于element-plus和IndexedDB数据库的基础表单

本文介绍了基于Vue 3和Element Plus的表单项目配置页面实现。页面包含搜索栏、操作按钮、数据表格和分页组件&#xff0c;使用IndexedDB进行本地数据存储。主要功能包括&#xff1a;1) 通过模糊查询搜索项目&#xff1b;2) 分页显示项目数据&#xff1b;3) 添加/编辑/删除项目操…

paimon实时数据湖教程-主键表更新机制

在上一章&#xff0c;我们学习了 Paimon 如何保证每一次写入的原子性和一致性。但数据仓库的核心需求不仅是写入&#xff0c;更重要的是更新。想象一个场景&#xff1a;我们需要实时更新用户的最新信息&#xff0c;或者实时累加计算用户的消费总额。传统的 Hive 数据湖对此无能…

第十六届蓝桥杯青少组C++省赛[2025.8.9]第二部分编程题(4、矩阵圈层交错旋转)

参考程序&#xff1a;#include <bits/stdc.h> using namespace std;const int MAXN 105; int a[MAXN][MAXN];int main() {int n;if (!(cin >> n)) return 0;for (int i 0; i < n; i)for (int j 0; j < n; j)cin >> a[i][j];int layers n / 2; // 每…

【FastGTP✨】[01] 使用 FastGPT 搭建简易 AI 应用

简易应用&#xff1a;英语单词解释 例句 1. 前言 FastGPT 是一个低代码 AI 应用构建平台&#xff0c;可以通过简单配置快速创建自己的 AI 应用。 本文将带你用 FastGPT 搭建一个 英语单词解释 例句 的 AI 工具&#xff0c;输入英文单词后&#xff0c;输出&#xff1a; 单词…

【Mysql语句练习】

MysqlMysql语句练习一、建库建表二、插入数据三、查询Mysql语句练习 一、建库建表 1、创建数据库mydb11_stu&#xff0c;并使用数据库 # 创建数据库mydb11_stu mysql> create database mydb11_stu; Query OK, 1 row affected (0.00 sec) # 使用数据库 mysql> use mydb1…

用Python Scrapy征服网络爬虫(反爬技术深入剖析)

目录 第1章:Scrapy是个啥?为什么它是你爬虫路上的最佳拍档? 1.1 Scrapy的核心亮点 1.2 啥时候用Scrapy? 1.3 安装Scrapy 第2章:动手写你的第一个Scrapy爬虫 2.1 创建Scrapy项目 2.2 定义数据结构(Items) 2.3 编写爬虫逻辑 2.4 运行爬虫 2.5 小技巧:调试爬虫 …

解决Electron透明窗口点击不影响其他应用

遇到的问题&#xff1a;在electron透明窗口点击&#xff0c;影响窗口下的应用接受不到点击事件解决方案&#xff1a;CSSIgnoreMouseEvents实现原理&#xff1a;主进程默认设置禁用目标窗口鼠标事件&#xff08;禁用之后能检测到mousemove&#xff09;&#xff0c;UI进程检测页面…

C# 泛型(Generics)详解

泛型是 C# 2.0 引入的核心特性&#xff0c;它允许在定义类、接口、方法、委托等时使用未指定的类型参数&#xff0c;在使用时再指定具体类型。这种机制可以显著提高代码的复用性、类型安全性和性能。一、泛型的核心概念类型参数化泛型允许将类型作为 "参数" 传递给类…

Spring中存在两个相同的Bean是否会报错?

第一种情况&#xff1a;使用XML的方式设置Bean&#xff0c;这种情况在Spring启动时就会报错&#xff0c;因为ID在Spring中是Bean的唯一标识&#xff0c;Spring容器在启动时会校验唯一性&#xff0c;一旦发现重复就会报错。但是如果是在两个不同的XML文件中定义两个相同的Bean&a…

【新手入门】Android基础知识(一):系统架构

目 录 Android 系统架构图 1. 应用 2. JAVA API 框架 3. 原生 C/C 库 4. Android 运行时&#xff08;Android Runtime&#xff09; 5. 硬件抽象层 (HAL) 6. Linux 内核 参考资料 Android 系统架构图 Android底层内核空间以Linux Kernel作为基石&#xff0c;上层用户空…

晶振电路的负载电容、电阻参数设计

系列文章目录 文章目录系列文章目录前言一、晶振主要参数二、有源与无源区别三、无源晶振四、有源晶振总结前言 在硬件电路的设计中&#xff0c;晶振电路是必不可少的&#xff0c;它充当了整个电路心脏的作用。在这个晶振电路的设计中负载电容、电阻参数的选型是很重要的&…

电脑上练打字用什么软件最好:10款打字软件评测

现在孩子们在电脑上练打字&#xff0c;软件一搜一大把&#xff0c;可好多家长和老师都犯愁&#xff1a;到底哪个管用&#xff1f;我带200多个小学生练过字&#xff0c;前前后后试了十款软件&#xff0c;今天就掏心窝子说说——有的看着花哨其实没用&#xff0c;有的专业是专业但…

第五天~提取Arxml的模板信息

🌟 ARXML模板信息提取:解锁汽车软件的乐高魔法 在汽车电子的世界里,AUTOSAR(汽车开放系统架构)如同无形的神经系统,而ARXML文件正是承载这套神经系统蓝图的数字载体。当工程师们需要批量创建或修改ECU(电子控制单元)配置时,模板信息提取便成为了一项至关重要的核心技…

react+antd+vite自动引入组件、图标等

前言&#xff1a;react在使用antd的时候&#xff0c;也是需要每个组件都在界面上按需引入的&#xff0c;那能不能自动生成&#xff0c;按需使用呢&#xff1f;我们这里说一说这个。安装插件&#xff0c;组件按需引入unplugin-antd-resolverunplugin-auto-importnpm install unp…

深度学习与遥感入门(六)|轻量化 MobileNetV2 高光谱分类

系列回顾&#xff1a; &#xff08;一&#xff09;CNN 基础&#xff1a;高光谱图像分类可视化全流程 &#xff08;二&#xff09;HybridNet&#xff08;CNNTransformer&#xff09;&#xff1a;提升全局感受野 &#xff08;三&#xff09;GCN 入门实战&#xff1a;基于光谱 KNN…

第4节 神经网络从公式简化到卷积神经网络(CNN)的进化之路

🧙 深度学习的"玄学进化史" 从CNN用卷积层池化层处理图片,循环网络RNN如何利用上下文处理序列数据,到注意力机制让Transformer横空出世,现在的大语言模型已经能写能画能决策!每个新技巧都让人惊呼"还能这么玩",难怪说深度学习像玄学——但这玄学,…

最新去水印小程序系统 前端+后端全套源码 多套模版 免授权(源码下载)

最新去水印小程序系统 前端后端全套源码 多套模版 免授权 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/91669468 更多资源下载&#xff1a;关注我

TCP Socket 编程实战:实现简易英译汉服务

前言&#xff1a;TCP&#xff08;传输控制协议&#xff09;是一种面向连接、可靠的流式传输协议&#xff0c;与 UDP 的无连接特性不同&#xff0c;它通过三次握手建立连接、四次挥手断开连接&#xff0c;提供数据确认、重传机制&#xff0c;保证数据有序且完整传输。本文将基于…