磁县专业做网站/搜狗引擎搜索
Mybatis框架
一、Mybatis框架简介
1.1 传统JDBC的缺陷
(1)数据库连接创建、释放频繁会造成系统资源浪费
【MyBatis通过在核心配置文件中配置数据路连接池解决此问题】
(2) SQL语句在代码中硬编码(PreparedStatement向占位符传参数),造成代码不易维护。
【MyBatis将SQL写在映射文件中,并支持动态SQL,通过Statement中的parameterType定义输入参数的类型】
(3) JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。
【通过Statement中的resultType定义输出结果的类型】
2.2 MyBatis定义
MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
2.3 ORM对象关系映射
MyBatis框架是一个ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
二、MyBatis工作原理
(1)MyBatis读取核心配置文件mybatis-config.xml:mybatis-config.xml核心配置文件主要配置了MyBatis的运行环境等信息。
(2)加载映射文件Mapper.xml:Mapper.xml文件即SQL映射文件,该文件配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。
(3)构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory,用于创建SqlSession。
(4)创建会话对象:由会话工厂SqlSessionFactory创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
(5)创建执行器:会话对象本身不能直接操作数据库,MyBatis底层定义了一个Executor接口用于操作数据库,执行器会根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存地维护。
(6)封装SQL信息:SqlSession内部通过执行器Executor操作数据库,执行器将待处理的SQL信息封装到MappedStatement对象中。
(7)操作数据库:根据动态生成的SQL操作数据库。(8)输出结果映射:执行SQL语句之后,通过MappedStatement对象将输出结果映射至Java对象中。
三、MyBatis的核心对象
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
3.1 SqlSessionFactoryBuilder对象
-
**作用:**用来创建SqlSessionFactory工厂对象
-
**方法:**按照配置信息的传入方式
方法 | 描述 |
---|---|
build(InputStream inputStream【, String environment, Properties properties】) | inputStream是字节流,它封装了XML文件形式的配置信息 |
build(Reader reader【, String environment, Properties properties】) | Reader字符流封装了xml文件形式的配置信息 |
build(Configuration config) | Configuation对象用于封装MyBatis项目中的配置信息。 |
environment:决定将要加载的环境,包括数据源和事务管理器;
properties:决定将要加载的properties文件。
- 使用方式:
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("配置文件位置");
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用程序执行期间都会存在,使用单例模式创建。
3.2 SqlSessionFactory对象
- **作用:**创建SqlSession对象
- 方法:
方法名称 | 描述 |
---|---|
SqlSession openSession() | 开启一个事务。 |
SqlSession openSession(Boolean autoCommit) | 参数autoCommit可设置是否开启事务。 (true表示关闭事务控制,自动提交;false表示开启事务控制。若不传入参数,默认为false。) |
SqlSession openSession(ExecutorType execType) | ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。ExecutorType.REUSE:表示会复用预处理语句。ExecutorType.BATCH:表示会批量执行所有更新语句。 |
3.3 SqlSession对象
- **作用:**SqlSession对象包含了执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用SqlSession对象来执行已映射的SQL语句(单线程对象)。
- 注意: 每一个线程都应该有一个自己的SqlSession对象,并且该对象不能共享。SqlSession对象是线程不安全的,绝不能将其放在类的静态字段、对象字段或任何类型的管理范围中使用。SqlSession对象使用完之后,要及时的关闭。
- 方法:
有关SELECT相关的方法:
方法名称 | 描述 |
---|---|
T selectOne(String statement) | statement是在配置文件中定义的select元素的id。 |
T selectOne(String statement, Object parameter) | parameter是查询语句所需的参数。 |
List selectList(String statement) | statement是在配置文件中定义的select元素的id。 |
List selectList(String statement, Object | parameter是查询语句所需的参数。 |
List selectList(String statement, Object parameter, RowBounds rowBounds) | rowBounds是用于分页的参数对象。 |
void select(String statement, Object parameter, ResultHandler handler) | handler对象用于处理查询语句返回的复杂结果集。该方法多用于多表查询。 |
有关INSERT相关的方法:
方法名称 | 描述 |
---|---|
int insert(String statement) | 参数statement是在配置文件中定义的insert元素的id。 返回影响条数 |
int insert(String statement, Object parameter) | parameter是插入语句所需的参数。 |
有关UPDATE相关的方法:
方法名称 | 描述 |
---|---|
int update(String statement) | 参数statement是在配置文件中定义的update元素的id。 返回更新条数 |
int update(String statement, Object parameter) | parameter是更新语句所需的参数。 |
有关DELETE相关的方法:
方法名称 | 描述 |
---|---|
int delete(String statement) | 参数statement是在配置文件中定义的delete元素的id。返回影响条数 |
int delete(String statement, Object parameter) | parameter是删除语句所需的参数。 |
有关事务的相关的方法:
方法名称 | 描述 |
---|---|
void commit() | 提交事务的方法。 |
void rollback() | 回滚事务的方法。 |
void close() | 关闭SqlSession对象。 |
四、MyBatis核心配置文件
MyBatis核心配置文件配置了MyBatis的全局信息。
在核心配置文件中,<configuration>
的子元素必须按照上图由上到下的顺序进行配置,否则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><!-- 加载db.properties文件 --><properties resource="db.properties"/><!-- 设置别名 --><typeAliases><typeAlias alias="User" type="com.tyut.pojo.User"/></typeAliases><!-- 加载运行环境 --><environments default="development"><environment id="development"><!-- 事务管理 --><transactionManager type="JDBC"/><!-- 数据源管理 --><dataSource type="POOLED"><property name="drive" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 映射文件 --><mappers><mapper resource="com.tyut.mapper.UserMapper"></mapper></mappers>
</configuration>
4.1 <properties>
元素
<properties>
是一个配置属性的元素,该元素的作用是读取外部文件的配置信息
<!-- 加载db.properties文件 -->
<properties resource="db.properties"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" />
</properties>
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_01
jdbc.username=root
jdbc.password=root
4.2 <typeAliases>
元素
**作用:**使用<typeAliases>
元素为冗长的全限定名设置别名,简化代码书写。
**方式一:**在<typeAliases>
元素下,使用多个<typeAlias>
元素为每一个全限定类逐个配置别名。
<typeAliases><typeAlias alias="User" type="com.tyut.pojo.User"/><typeAlias alias="Student" type="com.tyut.pojo.Student"/>
</typeAliases>
**方式二:**通过自动扫描包的形式自定义别名。
<typeAliases><package name="com.itheima.pojo"/>
</typeAliases>
**方法三:**默认别名
4.3 <environments>
元素
**作用:**MyBatis可以配置多套运行环境,如开发环境、测试环境、生产环境等。MyBatis的运行环境信息包括事务管理器和数据源。
<transactionManager>元素用于配置运行环境的事务管理器;
<daraSource>元素用于配置运行环境的数据源信息。
<environments default="development"><environment id="development"><!—设置使用JDBC事务管理 --><transactionManager type="JDBC" /><!-配置数据源 --><dataSource type="POOLED"> <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>
</environments>
- 事务管理
<transcationManager>元素可以配置两种类型的事务管理器,分别是JDBC和MANAGED。
--JDBC:此配置直接使用JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
--MANAGED:此配置不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接。
- 数据源管理
1.UNPOOLED表示数据源为无连接池类型。配置此数据源类型后,程序在每次被请求时会打开和关闭数据库连接。
属性 | 说明 |
---|---|
driver | JDBC驱动的Java类的完全限定名 |
url | 数据库的URL地址 |
username | 登录数据库的用户名 |
password | 登录数据库的密码 |
defaultTransactionIsolationLevel | 默认的连接事务隔离级别 |
2.POOLED表示数据源为连接池类型。节省了在创建新的连接对象时需要初始化和认证的时间。
属性 | 说明 |
---|---|
poolMaximumActiveConnections | 在任意时间可以存在的活动连接数量,默认值:10。 |
poolMaximumIdleConnections | 任意时间可能存在的空闲连接数。 |
4.4 <mappers>
元素
作用:<mappers>
元素用于引入MyBatis映射文件。映射文件包含了POJO对象和数据表之间映射信息。MyBatis通过核心配置文件中的<mappers>
元素找到映射文件并解析其中的映射信息
//类路径引入
<mappers><mapper resource="com/tyut/mapper/Mapper.xml"/>
</mappers>//本地文件路径引入
<mappers>
<mapper url="file://D:/com/tyut/mapper/Mapper.xml"/>
</mappers>//接口引入
<mappers>
<mapper class="com.tyut.mapper.Mapper"/>
</mappers>//包名引入
<mappers><package name="com.tyut.mapper"/>
</mappers>
五、MyBatis映射文件
相关约束信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
1.mapper元素
- namespace属性
1.用于区分不同的mapper,全局唯一。
2.绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的全限定名查找到对应的mapper配置来执行SQL语句,因此namespace的命名必须跟接口同名。
- id属性
1.在不同的映射文件中,<mapper>元素的子元素的id可以相同。
2.MyBatis通过<mapper>元素的namespace属性值和子元素的id联合区分不同的Mapper.xml文件。
3.接口中的方法与映射文件中SQL语句id应一一对应。
2.select元素
<select>
元素用来映射查询语句,它可以从数据库中查询数据并返回。
<select id="" parameterType="" resultType="">select的sql语句
</select>
属性 | 说明 |
---|---|
id | 表示命名空间中元素的唯一标识,通过该标识可以调用这条查询语句。 |
parameterType | 它是一个可选属性,用于指定SQL语句所需参数类的全限定名或者别名,其默认值是unset。 |
resultType | 用于指定执行这条SQL语句返回的全限定类名或别名。 |
resultMap | 表示外部resultMap的命名引用。resultMap和resultType不能同时使用。 |
flushCache | 用于指定是否需要MyBatis清空本地缓存和二级缓存。 |
timeout | 用于设置超时时间,单位为秒。 |
3.insert元素
<insert>
元素用于映射插入语句,在执行完元素中定义的SQL语句后,会返回插入记录的数量。
<insert id="" parameterType="">
insert into users(uid,uname,uage) values(#{uid}, #{uname}, #{uage})
</insert>
属性 | 说明 |
---|---|
keyProperty <仅对insert和update元素有用> | 将插入或更新操作的返回值赋值给POJO类的某属性。如果需要设置联合主键,在多个值之间用逗号隔开 |
keyColumn <仅对insert和update元素有用> | 该属性用于设置第几列是主键,当主键列不是表中的第一列时需要设置。需要设置联合主键时,在多个值之间用逗号隔开。 |
useGeneratedKeys <仅对insert和update元素有用> | 该属性会使MyBatis调用JDBC的getGeneratedKeys方法来获取由数据库内部生产的主键,如MySQL和SQL Server等自动递增的字段,其默认值为false。 |
如果使用的数据库支持主键自动增长,那么可以通过keyProperty属性指定POJO类的某个属性接收主键返回值(通常会设置到id属性上),然后useGeneratedKeys的属性值设置为true。
<insert id="addUser" parameterType=""
keyProperty="uid" useGeneratedKeys="true" >
insert into users(uid,uname,uage) values(#{uid},#{uname},#{uage})
</insert>
4.update元素
<update>
元素用于映射更新语句,它可以更新数据库中的数据。在执行完元素中定义的SQL语句后,会返回更新的记录数量。
<update id="" parameterType="">update users set uname= #{uname},uage = #{uage} where uid = #{uid}
</update>
5.delete元素
<delete>
元素用于映射删除语句,在执行完<delete>
元素中的SQL语句之后,会返回删除的记录数量。
<delete id="deleteUser" parameterType="Integer">delete from users where uid=#{uid}
</delete>
6.sql元素
<sql>
元素的作用是定义可重用的SQL代码片段,它可以被包含在其他语句中。<sql>
元素可以被静态地(在加载参数时)参数化,<sql>
元素不同的属性值通过包含的对象发生变化。
<sql id="someinclude">from <include refid="${include_target}" /></sql><sql id="userColumns"> uid,uname,uage
</sql><select id="findUserById" parameterType="Integer"
resultType="com.tyut.pojo.User"> select <include refid="userColumns"/> <include refid="someinclude"><property name="include_target" value="users" /></include>where uid = #{uid}
</select>
tip:<sql>
标签对经常使用的代码段进行提取,在引用时要用到如下标签
<include refid="sql标签的id"><property name="sql标签中的占位符" value="占位符的值">
</include>
7.resultMap元素
<resultMap>
元素主要作用是定义映射规则、更新级联以及定义类型转化器等。
默认情况下,MyBatis程序在运行时会自动将查询到的数据与需返回的对象的属性进行匹配赋值(**数据表中列名**与**对象的属性**名完全一致才能匹配成功并赋值)。数据表中的列和需要返回的对象的属性可能不会完全一致,这种情况下MyBatis不会自动赋值,这时就需要使用<resultMap>元素进行结果集映射。
<mapper namespace="com.tyut.mapper.StudentMapper">
<resultMap type="要映射的pojo对象" id="sm"><id property="属性名" column="db列名"/> <result property="" column=""/>
</resultMap><select id="findAllStudent" resultMap="sm">select * from t_student
</select>
</mapper>
六、动态SQL语句
6.1 条件查询操作
1.单条件判断
<if test="逻辑判断语句">要拼接的SQL语句
</if>
//对username做非空判断
select * from t_user where 1=1
<if test="username != '' and username != null">and username like concat('%', #{username}, '%')
</if>
2.多分支判断
<choose><when test="逻辑判断语句"></when> <when test="逻辑判断语句"></when> <otherwise></otherwise>
</choose>
select * from t_user where 1=1
<choose><when test="username != null">and username = #{username}</when> <when test="job != null">and job = #{job}</when> <otherwise>and phone is not null</otherwise>
</choose>
在映射文件中,编写的SQL后面加入了“where 1=1”的条件的话,既保证了where后面的条件成立,又避免了where后面第一个词是and或者or之类的关键字。如果将where后面的1=1去掉,这条拼接出的SQL语句是不正确
3.where,trim元素
<where>
会自动判断SQL语句,只有<where>
内的一个或多个条件成立时,才会在拼接SQL中加入where关键字,否则将不会添加;还会去除多余的“AND”或“OR”。
select * from t_customer
<where><if test="username !=null and username !=''">and username like concat('%',#{username}, '%')</if><if test="jobs !=null and jobs !=''">and jobs= #{jobs}</if>
</where>
<trim>
的作用是去除和添加特殊的字符串。
属性 | 说明 |
---|---|
prefix | 指定给SQL语句增加的前缀 |
prefixOverrides | 指定SQL语句中要去掉的前缀字符串 |
suffix | 指定给SQL语句增加的后缀 |
suffixOverrides | 指定SQL语句中要去掉的后缀字符串 |
select * from t_customer
<trim prefix="where" prefixOverrides="and"><if test="username !=null and username !=''">and username like concat('%',#{username}, '%')</if><if test="jobs !=null and jobs !=''">and jobs= #{jobs}</if>
</trim>
4.foreach元素
foreach元素主要用于遍历,支持数组,list,或set接口的集合.
属性 | 说明 |
---|---|
item(必选) | 集合中每一个元素进行迭代时的别名 |
index | 在List和数组中,index是元素的序号,在Map中,index是元素的key。 |
open | 表示foreach语句代码的开始符号,一般和close=“)”合用。常用在in条件语句中。该属性可选。 |
separator | 表示元素之间的分隔符。可选 |
close | 表示foreach语句代码的关闭符号,一般和open="("合用。常用在in条件语句中。该属性可选。 |
collection(必选) | 用于指定遍历参数的类型。注意,该属性必须指定,不同情况下,该属性的值是不一样的。(若参数是List,collection为list;若参数是数组,collection为array;若参数是Map,collection为Map的键) |
- 遍历数组(传参为数组)
<select id="findByArray"
parameterType="java.util.Arrays"
resultType="com.tyut.pojo.Customer">
select * from t_customer where id in
<foreach item="id" index="index" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</select>
- 遍历集合(传参为集合)
<select id="findByList" parameterType="java.util.List"
resultType="com.tyut.pojo.Customer">
select * from t_customer where id in
<foreach item="id" index="index" collection="list"
open="(" separator="," close=")">
#{id}
</foreach>
</select>
- 遍历Map(传参为多个聚合类型)
<select id="findByMap" parameterType="java.util.Map"
resultType="com.itheima.pojo.Customer">
select * from t_customer where jobs=#{jobs} and id in
<foreach item="roleMap" index="index" collection="id" open="(" separator="," close=")">
#{roleMap}
</foreach>
</select>
6.2 更新操作
<set>
元素主要用于更新操作,它可以在动态SQL语句前输出一个SET关键字,并将SQL语句中最后一个多余的逗号去除。
update t_customer
<set><if test="username !=null and username !=''">username=#{username},</if><if test="jobs !=null and jobs !=''">jobs=#{jobs},</if>
</set>
where id=#{id}
**tip:**在使用<set>
元素进行字段信息更新时,要确保传入的更新字段不能都为空。
七、MyBatis框架环境搭建
1.pom相关依赖
<!-- 添加相关的依赖 --><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- mybatis相关依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><!-- mysql相关依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
</dependencies>
- 为了使得项目可以加载到此项目下的所有特殊文件
<!-- 对于项目中的properties和xml结尾的文件均可加载 -->
<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes></resource></resources>
</build>
2.配置 MyBatis 环境
2.1 创建 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 resource="db.properties"/><environments default="development"><environment id="development"><transactionManager type="jdbc"></transactionManager><dataSource type="POOLED"><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></environments><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers>
</configuration>
2.2 配置数据源
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/db_student?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
jdbc.username = root
jdbc.password = 123456
2.3 创建pojo实体
public class User {private int id;private String name;private String email;// Getters and setters
}
2.4 创建Mapper接口
public interface UserDaoImpl {User getUserById(int id);List<User> getAllUsers();
}
2.5 创建Mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.tyut.mapper.UserMapper"><select id="getUserById" resultType="User">SELECT id, name, email FROM users WHERE id = #{id}</select><select id="getAllUsers" resultType="User">SELECT id, name, email FROM users</select></mapper>
2.6 配置 SqlSessionFactory
public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}
2.7 使用 MyBatis 进行数据库操作
public class UserService {public User getUserById(int id) {try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);return userMapper.getUserById(id);}}public List<User> getAllUsers() {try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);return userMapper.getAllUsers();}}
}
相关文章:

SSM01-MyBatis框架(一文学会MyBatis)
Mybatis框架 一、Mybatis框架简介 1.1 传统JDBC的缺陷 (1)数据库连接创建、释放频繁会造成系统资源浪费 【MyBatis通过在核心配置文件中配置数据路连接池解决此问题】 (2) SQL语句在代码中硬编码(PreparedStatement向占位符传…...

【PlantUML系列】状态图(六)
一、状态图的组成部分 状态:对象在其生命周期内可能处于的条件或情形,使用 state "State Name" as Statename 表示。初始状态:表示对象生命周期的开始,使用 [*] 表示。最终状态:表示对象生命周期的结束&…...

JS中重排和重绘的区别是什么?
在JavaScript中,当DOM(文档对象模型)发生变化时,浏览器需要重新计算和更新渲染树,这个过程通常涉及到重排(reflow)和重绘(repaint)。了解这两者之间的区别对于优化页面性…...

工业—使用Flink处理Kafka中的数据_ProduceRecord2
使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“...

C 库中的断言与 FreeRTOS 中的 trace 宏
在 C 编程领域,断言和 FreeRTOS 中的 trace 宏都有着独特而重要的作用。 一、断言(assert) 断言在一般的 C 库中是一个非常有用的工具,它以函数的形式存在。其核心作用在于对程序中的逻辑条件进行检查,确保特定的表达…...

JAVAWeb中的Servlet学习
一 Servlet简介 1.1动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源.例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时动态生成,例如Servle…...

docker安装ddns-go(外网连接局域网)
docker先下载镜像,目前最新版是v6.7.6 也可以csdn资源下载 再导入dockers https://download.csdn.net/download/u014756339/90096748 docker load -i ddns-go.tar 启动 docker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/…...
时间复杂度度详解
时间复杂度是衡量算法性能的重要指标,用来描述算法随着输入规模 n 增大,运行时间的增长趋势。以下是时间复杂度的核心概念与常见分类的详细讲解。 1. 时间复杂度的定义 时间复杂度反映了算法执行的 基本操作数量 与输入规模 n 的关系。它通常使用大 O表示法来表示,即: 其中…...

如何处理和优化大文件上传和下载
如何处理和优化大文件上传和下载 简单来说 文件过大会导致内存溢出,上传和下载过慢会影响用户体验,不合理的设计可能引发安全问题,还有网络问题,数据完整性,服务器压力等 文件过大,内存溢出,…...

QT 线程锁
在 Qt 中,线程锁是用来同步多线程访问共享资源的机制,防止数据竞争和线程安全问题。Qt 提供了几种线程锁和同步工具,主要包括以下几种: 1. QMutex 功能:QMutex 是 Qt 中最常用的互斥锁(mutex)…...

光猫开DMZ教程
本教程以移动光猫未例,具体操作以实际光猫为准 1、登录移动光猫管理后台 打开浏览器,在浏览器地址栏输入移动光猫登录管理地址192.168.1.1或者tplogin.cn 按“回车键”打开登录页面,然后输入路由器管理密码登录。 移动光猫登录页面 超级密…...

分区之间的一种度量方法-覆盖度量(Covering Metric)
分区之间的一种度量方法——覆盖度量(Covering Metric),用于量化一个分区如何被另一个分区覆盖或近似。以下是逐步详细解释: 1. 背景与符号说明 分区的概念: 分区是将一个集合(这里是 { 1 , … , n } \{…...

cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)
今天更新了某个抖音小游戏的版本,增加了部分剧情,半天过后一条短信审核未通过,emmm…抖音总是能给开发者惊喜…打开电脑看看这次又整什么幺蛾子… 首先是一脸懵逼,后端早已接入了官方的内容安全检测能力了(https://de…...

13.Java IO 流(文件流、字符流、字符处理流、字节处理流、对象处理流、标准流、转换流、打印流、Properties 配置文件、其他流)
一、文件引入 1、文件的概念 文件是保存数据的地方(例如,文档,图片,音视频等) 2、文件流 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流&…...

掌握 DOM 操作:让你的网页动起来
文章目录 前言一、什么是 DOM?二、DOM 树的结构三、使用 JavaScript 操作 DOM总结前言 在现代 Web 开发中,动态交互几乎是每个网站的标配。而这种交互的实现,离不开 DOM(Document Object Model) 的操作。本次课程深入讲解了 DOM 的基础知识以及如何使用 JavaScript 操作 …...

JVM整理部分面试题
1.如何主动触发垃圾回收? 在Java中,垃圾回收是自动进行的,由Java虚拟机(JVM)负责管理。但是,有时候我们可能希望手动触发垃圾回收以释放一些无用的对象。这可以通过调用System.gc()方法来实现 手动触发垃…...

ubuntu20 使用 pyspacemouse获取 spacemouse wireless 输入
1. 设置设备权限 (1) 默认情况下,普通用户可能没有权限访问 HID 设备,可以通过设置 udev 规则解决: cd /etc/udev/rules.d sudo touch 99-spacemouse.rules sudo gedit 99-spacemouse.rules在新建的99-spacemouse.rules中添加以下内容 SUB…...

windows下Qt5自动编译配置QtMqtt环境(11)
文章目录 [toc]1、概述2、准备1.1 下载源码1.2 配置环境1.3 解释原理 3、编译4、验证5、参考6、视频 更多精彩内容👉内容导航 👈👉Qt网络编程 👈 1、概述 Qt默认是不包含mqtt库的,如果需要使用到mqtt库就只能自己编译配…...

速盾:高防cdn有哪些冷知识?
高防CDN(Content Delivery Network)是一种用于提供高可靠性、高性能的互联网服务的技术。它通过将内容分发到离用户最近的服务器上,并优化网络流量,以提升网站的响应速度和承载能力。除了这些基本的了解,下面是一些高防…...

全面UI组件库Telerik 2024 Q4全新发布——官方宣布支持.NET 9
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Ken…...

电脑投屏到电脑:Windows,macOS及Linux系统可以相互投屏!
本篇其实是电脑远程投屏到另一台电脑的操作介绍。本篇文章的方法可用于Windows,macOS及Linux系统的相互投屏。 为了避免介绍过程中出现“这台电脑”投屏到“那台电脑”的混乱表述,假定当前屏幕投出端是Windows系统电脑,屏幕接收端是Linux系统…...

12.6深度学习_模型优化和迁移_模型移植
八、模型移植 1. 认识ONNX https://onnx.ai/ Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。 ONNX的规范及代码主要由微软…...

Grid++Report:自定义模板设计(自由表格使用),详细教程
实现效果 步骤 一、新建空白 初始状态都是空白页,如果不是,点击右上角->文件->新建空白 二、页面设置 右击页面灰色部分->页面设置 根据需求自定义页面 三、报表头设计 1、新增报表头 右击屏幕->新增->报表节->报表头 点击报表头…...

[Collection与数据结构] 位图与布隆过滤器
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

idea中新建一个空项目
目的,为了在同一个目录下有多个小的项目:使用IDE为idea2022。 步骤: 点击新建项目,点击创建空项目,这里选择空项目是将其作为其他项目的一个容器,如图所示: 然后点击文件->项目结构…...

【Python】【Conda 】Conda 与 venv 虚拟环境优缺点全解:如何做出明智选择
目录 引言一、基本概念1.1 Conda 虚拟环境1.2 Python venv 虚拟环境 二、主要区别对比三、优缺点分析3.1 Conda 虚拟环境的优缺点3.2 Python venv 虚拟环境的优缺点 四、使用场景推荐4.1 使用 Conda 虚拟环境的场景4.2 使用 Python venv 虚拟环境的场景 五、虚拟环境管理工具对…...

深度学习在故障检测中的应用:从理论到实践
随着工业设备和信息系统的复杂性增加,故障检测成为企业运维的重要任务。然而,传统的基于规则或统计学的故障检测方法难以应对复杂多变的故障模式。深度学习作为一种强大的数据分析工具,为故障检测提供了新的解决思路。本文将介绍深度学习模型…...

自然语言处理与人工智能
自然语言处理(NLP)与人工智能(AI) 自然语言处理(NLP)是人工智能(AI)领域的一个重要分支,旨在使计算机能够理解、解释和生成自然语言。随着深度学习技术的进步࿰…...

量化交易系统开发-实时行情自动化交易-8.15.Ptrade/恒生平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于Ptrade/恒生平台介绍。 P…...

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 4
三十三、出入库管理 Header.vue导一下,RecordController加一个 //将入库数据和原有数据相加吧//新增PostMapping("/save")public Result save(RequestBody Record record) {return recordService.save(record) ? Result.success() : Result.fail();} GoodsManage.v…...