MyBatis 学习(二)之 第一个 MyBatis 案例
目录
1 配置 MyBatis 方式
1.1 XML 配置文件
1.2 Java 注解配置
1.3. Java API 配置
2 在 MySQL 中创建一张表
3 创建一个基于 Maven 的 JavaWeb 工程
4 编写 User 实体类
5 创建 Mybatis 全局配置文件
6 编写一个 DAO 或 Mapper 接口
7 编写 SQL 映射配置文件(重要)
8 加载映射文件
9 导入日志文件
10 创建 MyBatisTest 测试类
11 参考文档
1 配置 MyBatis 方式
MyBatis 可以通过以下三种方式来创建和配置
1.1 XML 配置文件
最常见的方式是使用 XML 配置文件来配置 MyBatis。在 XML 配置文件中,可以定义数据源、映射文件的位置、类型别名、插件等信息。XML 配置文件通常包括 MyBatis 的全局配置和映射文件的配置。以下是一个简单的 XML 配置文件示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/ExampleMapper.xml"/></mappers>
</configuration>
1.2 Java 注解配置
从 MyBatis 3.4.1 版本开始,MyBatis 支持使用 Java 注解来配置映射关系。可以使用 @MapperScan 注解来指定 Mapper 接口所在的包,也可以使用 @Mapper 注解来标记 Mapper 接口。以下是一个简单的 Java 注解配置示例:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {// 数据源配置// 其他配置...
}
1.3. Java API 配置
除了使用 XML 配置文件和 Java 注解外,MyBatis 还支持使用 Java API 来进行配置。通过编写 Java 代码,可以动态地创建 SqlSessionFactory 对象,并且进行各种配置。以下是一个简单的 Java API 配置示例:
DataSource dataSource = getDataSource(); // 获取数据源
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(MyMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
2 在 MySQL 中创建一张表
drop table if exists person;
create table person (
id int(10) primary key auto_increment, #主键,自动增长
name varchar(14) unique not null, #该行不重复,不为空
age int,
sex char(10) default '女' # 没有插入该列,填入默认值"女"
)charset=utf8; #utf-8 编码#多行插入
insert into person(name, age, sex) values
('西施', 18, '女'),
('大乔', 32, null),
('王昭君', 24, null);insert into person(name,age) values('赵飞燕',27);
insert into person(name,age) values('虞姬', 25);
insert into person(id,name,age) values(9, '貂蝉', 26);
3 创建一个基于 Maven 的 JavaWeb 工程
可以参考以下博文:
IDEA 2023.2 配置 JavaWeb 工程-CSDN博客https://blog.csdn.net/zjs246813/article/details/136199249?spm=1001.2014.3001.5501导入依赖
<dependencies><!-- Mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!-- 日志处理 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>
4 编写 User 实体类
public class User {private Integer id;private String name;private Integer age;private String sex;// Getter、Setter、toString() 方法省略
}
5 创建 Mybatis 全局配置文件
创建 mysql.properties 配置文件
study 改为自己的数据库名
root 是数据库用户名
123456 是数据库用户密码
驱动器一般为 com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
name=root
password=123456
driver=com.mysql.cj.jdbc.Driver
在 resources 目录中,创建 Mybatis 的全局配置文件 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 通过properties标签,读取java配置文件的内容 --><properties resource="mysql.properties" /><!-- 配置环境.--><environments default="development"><!-- id属性必须和上面的default一致 --><environment id="development"><!--配置事务的类型--><transactionManager type="JDBC"></transactionManager><!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源 --><dataSource type="POOLED"><!--配置连接数据库的4个基本信息--><property name="url" value="${url}" /><property name="username" value="${name}" /><property name="password" value="${password}" /><property name="driver" value="${driver}" /></dataSource></environment></environments>
</configuration>
对 mybatis-config.xml 中配置项的简单说明:
- properties:用于加载外部属性文件,通过指定 resource="mysql.properties",MyBatis 会尝试从当前目录下查找名为 "mysql.properties" 的文件,并将其中的属性值应用到配置 property 中
- environments:
配置当前的环境,default 属性有 development 和 work 两种选择,默认是 development 开发模式,work 是工作模式指定当前运行环境,通过 default 属性指定某个运行环境的标识符 id 来使用该运行环境 - environment:
配置每个 environment 定义的环境,可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境。其 id 属性也有 development 和 work 两种选择,并且必须和上面的 default 属性一致配置运行环境,通过 id 属性来标识该环境。如果配置了两个相同的 environment,即它们的 id 属性值相同,MyBatis 会用后面的覆盖掉前面的 - transactionManager:配置事务管理器类型,type 属性中有 JDBC 和 MANAGED 两种,一次只能配置一个
- JDBC 使用 JdbcTransactionFactory 工厂生成的 JdbcTransaction 对象实现,以 JDBC 的方式进行数据库的提交、回滚等操作,它依赖于从数据源得到的连接来管理事务范围
- MANAGED 使用 ManagedTransactionFactory 工厂生成的 ManagedTransaction 对象实现,它的提交和回滚不需要任何操作,而是把事务交给容器进行处理,默认情况下会关闭连接,如果不希望默认关闭,只要将其中的 closeConnection 属性设置为 false 即可
- dataSource:配置数据源类型,type属性有 UNPOOLED、POOLED 和 JNDI 三种选择:
- UNPOOLED (UnpooledDataSourceFactory):采用非数据库池的管理方式,每次请求都会新建一个连接,并用完后关闭它,所以性能不是很高。该方式适用于只有小规模数量并发用户的简单应用程序上
- POOLED (PooledDataSourceFactory):采用连接池的概念将数据库链接对象 Connection 组织起来,可以在初始化时创建多个连接,使用时直接从连接池获取,避免了重复创建连接所需的初始化和认证时间,从而提升了效率,所以这种方式比较适合对性能要求高的应用中。在开发或测试环境中经常用到此方式
- JNDI (JndiDataSourceFactory):数据源 JNDI 的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。在生产环境中优先考虑这种方式
- property:dataSource 中的 property 元素就是数据库相关的配置信息
6 编写一个 DAO 或 Mapper 接口
在 com.mapper 目录下创建一个 UserMapper 接口
package com.mapper;import com.entity.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper {// 查询所有用户List<User> selectAllUser();// 通过 id 查询一个用户User selectUserById(int id);// 模糊查询,根据 name 字段查询用户List<User> selectUserByName(String name);// insert、update、delete的返回值都是int(影响行数)// 添加用户// 带两个参数,需要在接口中通过@Param注解指定名称(因为编译时参数名不会保留)int insertUser(@Param("name") String name,@Param("age") int age,@Param("sex") String sex);// 根据 id 更新用户int updateUser(@Param("id") int id,@Param("name") String name,@Param("age") int age,@Param("sex") String sex);// 根据 id 删除用户int deleteUsesr(int id);
}
7 编写 SQL 映射配置文件(重要)
在目录 resources 创建 mapper 目录,然后在 mapper 目录下创建一个 UserMapper.xml 文件。Mybatis 中所有数据库的操作都基于 SQL 映射配置文件中配置的SQL语句,在 SQL 映射配置文件中可以配置任何类型的 SQL 语句。框架会根据配置文件中的参数配置,完成对 SQL 语句输入输出参数的映射配置。
相关属性 | 描述 |
---|---|
namespace | 表示命名空间,用来设定当前 Mapper 配置文件的唯一标识,将来在 Java 程序中通过 namespace 属性值来定位到这个配置文件,namespace 属性值可以随意命名,建议使用 Mapper 接口的全类名命名,如 com.mapper.UserMapper |
id | SQL 映射语句的唯一标识 |
parameterType | 用来指定 SQL 语句中的参数类型,可以是一个简单类型,也可以是一个复杂对象类型 |
resultType 和 resultMap | 用来指定 SQL 语句的返回值类型,resultType 用于指定返回的单一结果类型,而 resultMap 用于指定返回结果的映射关系,通常用于复杂的查询结果映射 |
parameterMap | 用来指定参数映射关系 |
sql | 用于定义可重用的 SQL 片段,可以在不同的 SQL 语句中重复使用,从而减少重复编写相同的 SQL 代码 |
include | 用于引用外部的 SQL 片段,可以在 SQL 映射文件中引用其他 SQL 片段,从而实现模块化的 SQL 代码编写 |
cache | 用于配置结果缓存,可以指定 SQL 语句的查询结果是否需要被缓存 |
#{} | #{} 表示 SQL 语句的占位符 |
${} | ${} 表示 SQL 语句的拼接符 |
#{} 和 ${} 介绍
- #{}:SQL 语句的占位符,相当于JDBC中的 "?",它会自动进行 Java 类型和 JDBC 类型转换,可以防止 SQL 注入攻击。#{} 接受的输入参数的类型可以是简单类型、普通 JavaBean 或者 HashMap 。当接受简单类型时,#{} 中可以写 value 或者其他任意名称。如果接受的是JavaBean,它会通过 OGNL 读取对象中的属性值,例如,一个JavaBean user,它有一个属性 name,在映射文件中可以使用 #{user.name} 来引用这个属性值
- ${}: SQL 语句的拼接符,会将接收到的参数在不进行 JDBC 类型转换的情况下拼接在 SQL 语句中,${} 里面必须要写参数,不然会报错。${} 接受输入参数的类型可以是简单类型、普通 JavaBean 或者 HashMap 。当接受简单类型时,${} 中只能写 value,而不能写其他任意名称。如果接受的是 JavaBean,它会通过 OGNL 读取对象中的属性值,同上
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace-绑定一个对应dao/mapper接口-->
<mapper namespace="com.mapper.UserMapper"><!-- 查询所有用户 --><!--通过 resultType 指定查询的结果是 User 类型的数据只需要指定 resultType 的类型,MyBatis 会自动将查询的结果映射成 JavaBean 中的属性--><!-- id 和 com.mapper.UserMapper.selectAllUser 对应 --><select id="selectAllUser" resultType="com.entity.User">select * from person;</select><!-- 通过id查询一个用户 --><!-- 带一个简单类型的参数, 这种情况下parameterType属性可以省略,mybatis可以自动推断出类型 --><select id="selectUserById" parameterType="int" resultType="com.entity.User">select * from person where id = #{id};</select><!-- 模糊查询,根据name字段查询用户--><select id="selectUserByName" parameterType="String" resultType="com.entity.User">select * from person where name like '%${value}%';</select><!-- 添加用户--><!-- 带两个参数,需要在接口中通过@Param注解指定名称(因为编译时参数名不会保留) --><!-- insert、update、delete的返回值都是int(影响行数) --><insert id="insertUser" parameterType="com.entity.User">insert into person(name, age, sex)values (#{name}, #{age}, #{sex});</insert><!-- 根据id更新用户 --><update id="updateUser" parameterType="com.entity.User">update person set name = #{name},age = #{age},sex = #{sex} where id = #{id}</update><!-- 根据id删除用户 --><delete id="deleteUser" parameterType="int">delete from person where id = #{id}</delete>
</mapper>
8 加载映射文件
将上面创建的 UserMapper.xml 文件配置到全局配置文件 mybatis-config.xml 中
<!--指定映射配置文件的位置,这个映射配置文件指的是每个业务独立的配置文件-->
<mappers><mapper resource="mapper/UserMapper.xml"/>
</mappers>
9 导入日志文件
导入日志文件,在 resources 目录下创建 log4j.properties 配置文件,并且导入如下配置(如果log报错则以管理员的方式启动 Eclipse 或 IDEA)
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
10 创建 MyBatisTest 测试类
使用 JDBC 的事务管理在进行增删改操作时,需要进行提交事务,也就是 sqlSession.commit(),否则数据不会操作成功
public class MybatisTest {//定义 SqlSessionSqlSession sqlSession = null;@Beforepublic void getSqlSession() throws IOException {//加载 mybatis 全局配置文件 Resources// 原 InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//创建 SqlSessionFactory 对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//根据 sqlSessionFactory 产生 sessionsqlSession = sqlSessionFactory.openSession();}//查询所有用户数据@Testpublic void testSelectAllUser() {/*** 注意:这个字符串由 UserMapper.xml 文件中的两个部分构成(namespace + id)* <mapper namespace="com.mapper.UserMapper">中 namespace 的值* <select id="selectAllUser" > 中的 id 值* 这样Mybatis才能找到需要的SQL*/String statement = "com.mapper.UserMapper.selectAllUser";List<User> listUser = sqlSession.selectList(statement);for (User user : listUser) {System.out.println(user);}sqlSession.close();}//根据Id查询一个用户数据@Testpublic void testSelectUserById() {String statement = "com.mapper.UserMapper.selectUserById";User user = sqlSession.selectOne(statement, 1);System.out.println(user);sqlSession.close();}//模糊查询:根据 person 表的 name 字段@Testpublic void testSelectUserByName() {String statement = "com.mapper.UserMapper.selectUserByName";List<User> listUser = sqlSession.selectList(statement, "大");for (User user : listUser) {System.out.println(user);}sqlSession.close();}//添加一个用户数据@Testpublic void testInsertUser() {String statement = "com.mapper.UserMapper.insertUser";User user = new User();user.setName("嫦娥");user.setAge(24);user.setSex("女");int i = sqlSession.insert(statement, user);System.out.println( (i>0)? "添加成功!":"添加失败!");//提交插入的数据sqlSession.commit();sqlSession.close();}//根据id修改用户数据@Testpublic void testUpdateUser(){//如果设置的 id不存在,那么数据库没有数据更改String statement = "com.mapper.UserMapper.updateUser";User user = new User();user.setId(10);user.setName("王红");user.setAge(26);user.setSex("女");int i = sqlSession.update(statement, user);System.out.println( (i>0)? "修改成功!":"修改失败!");//提交数据sqlSession.commit();sqlSession.close();}//根据id删除用户数据@Testpublic void testDeleteUser(){String statement = "com.mapper.UserMapper.deleteUser";int i = sqlSession.delete(statement, 10);System.out.println( (i>0)? "删除成功!":"删除失败!");sqlSession.commit();sqlSession.close();}
}
部分执行结果
执行过程(添加一个用户)
11 参考文档
Mybatis3详解(二)----Mybatis的第一个入门实例 - 唐浩荣 - 博客园 (cnblogs.com)
MyBatis中#{}占位符与${}拼接符的用法说明_java_脚本之家 (jb51.net)
相关文章:

MyBatis 学习(二)之 第一个 MyBatis 案例
目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…...
30天自制操作系统(第21天)
21.1 攻克难题——字符串显示API 显示单个字符时,用 [CS:ECX] 的方式特意指定了 CS(代码段寄存器),因此可以成功读取 msg的内容。但在显示字符串时,由于无法指定段地址,程序误以为是 DS而从完全错误的内存地…...

linux系统Jenkins的安装
Jenkins安装 安装上传安装包解压包首次登录要去服务器查看密码,更改密码选择需要安装的插件设置Admin用户和密码安装完成 安装 上传安装包 上传 jdk17 tomcat jenkins.war的安装包 . 上传 tomcat安装包解压包 解压jdk tar xf jdk-11.0.18_linux-x64_bin.tar.gz解…...
【GStreamer】basic-tutorial-1:GstBus、GstMessage详解
【目录】郭老二博文之:图像视频汇总 1、先看示例 #include <gst/gst.h>int main (int argc, char *argv[]) {GstElement *pipeline;GstBus...
Python中的可变变量与不可变变量
python中的可变与不可变变量 一、变量的三个参数 就像区分一个人一样,同样都是张三,可能这个张三就不是那个张三。同一个变量是指的什么相同呢? Python中的对象包含三个要素,id(内存地址),typ…...
OpenGL调用窗口,方向键和鼠标
9.2 OpenGL调用窗口,方向键和鼠标 9.2.1 opengl调用窗口 OpenGL调用窗口步骤: 第一步:初始化 GLFW,初始化OpenGL,初始化窗口,初始化上下文 第二步:设置窗口大小和位置,设置输入输出 第三步…...

fastAdmin表格列表的功能
更多文章,请关注:fastAdmin后台功能详解 | 夜空中最亮的星 FastAdmin是一款基于ThinkPHP5Bootstrap的极速后台开发框架。优点见开发文档 介绍 - FastAdmin框架文档 - FastAdmin开发文档 在这里上传几张优秀的快速入门图: 一张图解析FastAdmin中的表格列…...
用来检查 CUDA、Conda 和 PyTorch 的版本的python文件
提供的 Python 代码片段包括几个语句,用来检查 CUDA、Conda 和 PyTorch 的版本,以及一些与 CUDA 相关的系统配置。让我们分解一下:PyTorch 版本和配置:torch.__config__.show():显示 PyTorch 的构建配置。 torch.__ver…...
基于Redisson,实现分布式锁注解
1.原始写法 我们平常使用redisson的分布式锁是不是基本都用下面的这个模板,既然是模板,那为何不把他抽出来呢? // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁 boolean res lock.tryLock(100, 10, TimeUnit.SECON…...
【机器学习】机器学习是什么?
你知道机器学习是什么吗?它就像是一个超级聪明的孩子,可以通过观察和经验不断学习和成长。而我们要做的就是培养和教育这个孩子,让他能够从数据中学习并做出决策和预测。 那么,我们该如何培养和教育这个聪明的孩子呢?首…...

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人
一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络(CNN):细致的艺术学徒生成对抗网络(GAN):画家与评审的双重角色…...
C# 中的执行表达式树(Expression Tree)
引言: 在C#编程中,表达式树(Expression Tree)是一种强大的工具,用于表示和执行计算表达式。表达式树将计算表达式抽象为树状结构,每个节点代表表达式中的一个元素,如常量、变量、方法调用等。本…...

森林监测VR虚拟情景再现系统更便利
AI人工智能技术已经逐渐渗透到各个领域,为我们的生活带来了诸多便利。在虚拟仿真教学领域,AI技术的应用也日益丰富,为虚拟情景交互体验带来了前所未有的好处。 提高VR虚拟情景的逼真度 通过深度学习和计算机视觉等技术,AI/VR虚拟现…...

高频面试题整理(一)
文章目录 平台无关性如何实现?JVM如何加载 .class文件?什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器:Java虚拟机栈局部变量表和操作数栈: Java内存模型中堆和栈的区别…...

2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类
文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…...

基础!!!吴恩达deeplearning.ai:卷积层
以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 回顾——密集层 Dense Layer卷积层 Convolutional Neural Network定义优势具体说明心电图卷积层搭建 到目前为止,你使用的所有神经网络层都是密集层类型,这…...

SpringBoot案例(黑马学习笔记)
这个案例呢,就是Tlias智能学习辅助系统。 参考接口文档完成后端功能的开 发,然后结合前端工程进行联调测试即可。 完成后的成品效果展示: 准备工作 需求&环境搭建 需求说明 部门管理 部门管理功能开发包括: ● 查询部门列…...

项目流程图
实现便利店自助付款项目 服务器: 1、并发服务器(多进程、多线程、IO多路复用) 2、SQL数据库的创建和使用(增删改查) 3、以模块化编写项目代码,按照不同模块编写.h/.c文件 客户端: 1、QT客户端界…...

鸿蒙这么大声势,为何迟迟看不见岗位?最新数据来了
对于鸿蒙生态建设而言,2024年可谓至关重要,而生态建设的前提,就是要有足够的开发人才。与之对应的,今年春招市场上与鸿蒙相关岗位和人才旺盛的热度,一方面反应了鸿蒙生态的逐渐壮大,另一方面也让人们对鸿蒙…...

Qt中关于信号与槽函数的思考
信号与槽函数的思考 以pushbutton控件为例,在主界面上放置一个pushbutton控件,点击右键选择关联槽函数,关联一个click函数,如下图所示: 在该函数中,实现了一个点击pushbutton按钮后,弹出一个窗…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...