Mybatis 知识点

Mybatis 知识点

1.1 Mybatis 简介

1.1.1 什么是 Mybatis

  • Mybatis 是一款优秀的持久层框架
  • 支持定制化 SQL、存储过程及高级映射
  • Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO 为数据库中的记录

1.1.2 为什么需要 Mybatis

  • 更方便的将数据存入到数据库中
  • 传统的 JDBC 代码太复杂。简化,自动化
  • 减少了50%以上的代码量,比JDBC更简洁
  • Mybatis 的优点
    • 简单易学
    • 灵活
    • sql 和代码分离,提高了可维护性
    • 提供映射标签,支持对象与数据库的 orm 字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供 xml 标签,支持编写动态 sql

1.1.3 如何获取 Mybatis

maven 仓库获取

  • 可直接用以下代码引入自己的 maven 仓库中
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version>
</dependency>

Github 获取源码

  • 下载地址:Releases · mybatis/mybatis-3 (github.com)

image-20230729164317294

中文文档

  • 可以帮助你更好的了解 Mybatis
  • 文档地址:mybatis – MyBatis 3 | 入门

1.2 第一个 Mybatis 程序

编写第一个 Mybatis 程序首先需要有一个具体步骤:

搭建环境–> 导入 Mybatis–>编写代码–>测试

1.2.1 搭建环境

  • 新建数据库,随便添加一张表,添加一些数据,便于测试

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',`userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名称',`userAge` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户年龄',PRIMARY KEY (`userId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '张三', '12');
INSERT INTO `user` VALUES (2, '李四', '15');
INSERT INTO `user` VALUES (3, '王五', '18');SET FOREIGN_KEY_CHECKS = 1;
  • 创建一个 maven 项目
  • 导入三个 maven依赖
    • mysql驱动
    • mybatis
    • junit
    <dependencies><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><!-- mysql 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>

1.2.2 编写 mybatis 的核心配置文件

  • 在 resources 文件夹新建一个名为 mybatis-config.xml 的 xml 文件

image-20230730133540062

  • 将以下代码粘贴进核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>
  • 以上 property 标签中的 value 值,就是我们在 JDBC 中编写配置文件对应的
  • 例如 driver 代表驱动类的位置等等
  • 下面按照我自己的项目中的写法,示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://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.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

1.2.3 编写 Mybatis 工具类

每个 Mybatis 的应用都是一个以 SqlSessionFactory 的实例为核心的

SqlSessionFactory 可以通过 SqlSessionFactoryBuilder 来获取

**而 SqlSessionFactoryBuilder 可以从 XML 配置文件来构建出 SqlSessionFactory **

从 SqlSessionFactory 可以获取 SqlSession 实例

通过 SqlSession 可以直接执行已经映射的 SQL 语句

  • 创建一个 dao 包和 utils 工具包

image-20230730135435816

  • 在 utils 包下创建一个工具类 MybatisUtils

  • 编写 MybatisUtils 类,获取 SqlSessionFactory 实例

package com.qiaoer.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {//获取资源String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}
}
  • String resource 的值是刚刚编写的 resource 文件夹下的 xml 文件路径

  • 通过已经获取的 SqlSessionFactory 实例,来获取 SqlSession 实例

  • 编写 getSqlSession() 方法,来获取 SqlSession 实例

package com.qiaoer.utils;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;public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {//获取资源String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}//获取 SqlSession 实例public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}
  • 获取 SqlSession 实例后,可以使用 SqlSession 中的很多方法来对数据库进行操作

1.2.4 测试,编写代码

  • 编写实体类

image-20230730142538562

  • User 实体类代码
package com.qiaoer.entity;public class User {private int userId;private String userName;private String userAge;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserAge() {return userAge;}public void setUserAge(String userAge) {this.userAge = userAge;}public User() {}public User(int userId, String userName, String userAge) {this.userId = userId;this.userName = userName;this.userAge = userAge;}@Overridepublic String toString() {return "User{" +"userId=" + userId +", userName='" + userName + '\'' +", userAge='" + userAge + '\'' +'}';}
}
  • 编写 dao 接口

image-20230730142731557

  • UserDao 接口代码
package com.qiaoer.dao;import com.qiaoer.entity.User;import java.util.List;public interface UserDao {//获取所有用户List<User> getUsers();
}
  • 编写 dao 的接口实现类
  • 在 Mybatis 中,不需要在编写接口的实现类,只需要编写一个 xml 文档即可
  • 由原来的 UserDaoImpl 转换为一个 UserMapper.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoer.dao.UserDao">
<!-- SQL 语句查询--><select id="selectBlog" resultType="com.qiaoer.entity.User">select * from user</select>
</mapper>
  • 其中 <mapper namespace="com.qiaoer.dao.UserDao"> 中的 namespace 的值对应的是要实现的接口类

  • <select id="selectBlog" resultType="com.qiaoer.entity.User">id 的值为对应的方法名

  • resultType属性表示返回一个结果

  • resultType 的值为返回值类型的返回类型对应的实体类

  • 编写完 UserMapper.xml 后,需要在 Mybatis 的核心配置文件 mybatis-config.xml 进行 Mapper 注册

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://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.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/qiaoer/dao/UserMapper.xml"/></mappers>
</configuration>
  • 这段代码中 <mappers> 则表现 Mapper 注册
  • 每一个 Mapper.xml 文件都需要进行注册
  • resource 属性的值就是对应的 Mapper.xml 文件路径
  • 但是这样也存在一定的 资源过滤问题,可能会导致你填写的 Mapper.xml 路径找不到
  • **因此需要在我们的 maven 中的 build 中配置 resources 来防止资源导出失败的问题 **
  • 将以下代码赋值到自己的 maven 中即可
<!--在build中配置resources,来防止我们资源导出失败的问题--><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>

image-20230730144321388

  • 测试代码
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;public class Test01 {public static void main(String[] args) {//第一步,获取 SqlSession 对象SqlSession sqlSession= MybatisUtils.getSqlSession();//方法一:通过 SqlSession 对象获取实现类System.out.println("=====方法1=====");UserDao mapper = sqlSession.getMapper(UserDao.class);List<User> users = mapper.getUsers();for (User user:users) {System.out.println(user);}//直接获取结果List<User> UserLists = sqlSession.selectList("com.qiaoer.dao.UserDao.getUsers");System.out.println("=====方法2=====");for (User user:UserLists) {System.out.println(user);}//关闭 SqlSessionsqlSession.close();}
}

1.3 Mybatis 中 CRUD (增删改查)的标签介绍

在 Mybatis 中编写dao层的实现类的 Mapper.xml 文件中,对增删改查的标签进行介绍

1.3.1 select 标签

  • select 标签主要作用域 sql 语句的查询
  • select 标签语法
  <select id="对应方法" resultType="方法的返回值类型" parameterType="方法的参数类型">查询的 SQL 语句</select>
  • **id:**对应的 namespace 所对应的 dao 层接口类中的方法名
  • **resultType:**Sql 语句执行的返回值
  • **parameterType:**参数类型
  • 若 sql 语句中的条件需要参数来进行判读,则使用 #{参数名}
  • 示例如下,若需要通过方法传递过来的参数 id,来查询数据
<mapper namespace="com.qiaoer.dao.UserDao">
<!-- SQL 语句查询--><select id="selectBlog" resultType="com.qiaoer.entity.User" parameterType="int">select * from user where userId=#{id}</select>
</mapper>

1.3.2 insert 标签

  • insert 标签主要作用域 sql 语句的增加数据
  • insert 标签语法
    <insert id="对应方法" parameterType="方法的参数类型">增加的 SQL 语句</insert>
  • 当我们的参数是一个对象时,在 #{} 当中直接写对象的属性名即可
  • 示例
<insert id="addUser" parameterType="com.qiaoer.entity.User">insert into user (userName, userAge) values (#{userName},#{userAge});
</insert>
  • 其中 #{userName},#{userAge} 两个均是 User 对象的属性名

  • ==注意:==当我们执行 SQL 语句的增删改时,都需要开启 SQL 的提交事务,否则并不会实际添加

  • 开启提交事务使用 SqlSession 中的 commit() 方法

  • 代码示例

import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;public class Test01 {public static void main(String[] args) {//第一步,获取 SqlSession 对象SqlSession sqlSession= MybatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);//执行增加用户mapper.addUser(new User(-1,"你好","15"));//查询所有用户List<User> users = mapper.getUsers();for (User user : users) {System.out.println(user);}//提交事务sqlSession.commit();//关闭 SqlSessionsqlSession.close();}
}

1.3.3 update 标签

  • update 标签主要作用域 sql 语句的修改数据
  • update 标签语法
    <insert id="对应方法" parameterType="方法的参数类型">修改的 SQL 语句</insert>
  • 它的参数设置与增加一样
  • 执行完毕也需要进行 SQL 的提交事务
  • Mapper.xml 示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoer.dao.UserDao"><update id="updateUser" parameterType="com.qiaoer.entity.User">update user set  userName=#{userName}  where userId=#{userId};</update>
</mapper>
  • 代码示例
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;public class Test01 {public static void main(String[] args) {//第一步,获取 SqlSession 对象SqlSession sqlSession= MybatisUtils.getSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);//执行修改 id为1的用户mapper.updateUser(new User(1,"Qiaoer","15"));//查询所有用户List<User> users = mapper.getUsers();for (User user : users) {System.out.println(user);}//提交事务sqlSession.commit();//关闭 SqlSessionsqlSession.close();}
}

1.3.3 delete 标签

  • delete标签主要作用域 sql 语句的修改数据
  • delete标签语法
    <delete id="对应方法" parameterType="方法的参数类型">删除的 SQL 语句</delete>
  • 增删改的操作基本一致

1.3.4 多参数传递 Map

  • 当我们的 sql 需要多个参数时,而这些参数并不只单单包含某个实体类,可以使用 Map 来传递参数
  • Map 传递参数,取值时直接使用 key 值来取出 value 值
  • 示例,在 dao 层接口类中,编写方法,通过用户年龄及用户姓名,查询用户
package com.qiaoer.dao;import com.qiaoer.entity.User;import java.util.List;
import java.util.Map;
import java.util.Objects;public interface UserDao {//通过用户年龄,用户姓名,查询用户List<User> getUserByUserAgeAndUserName(Map<String, Object> map);
}
  • 在 Mapper.xml 中编写对应的生成实现类标签
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoer.dao.UserDao"><select id="getUserByUserAgeAndUserName" resultType="com.qiaoer.entity.User" parameterType="map">select * from user where userAge=#{userAge} and userName=#{userName}</select>
</mapper>
  • 其中 #{userAge}#{userName} 都属于 map 的 key 值
  • 编写测试类,调用方法
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;public class Test01 {public static void main(String[] args) {//获取 SqlSession 对象SqlSession sqlSession=MybatisUtils.getSqlSession();//获取实现类UserDao userDao=sqlSession.getMapper(UserDao.class);//创建参数 mapMap<String, Object> map=new HashMap<String, Object>();map.put("userAge",15);map.put("userName","Qiaoer");//调用查询方法List<User> userByUserAgeAndUserName = userDao.getUserByUserAgeAndUserName(map);//输出结果for (User user : userByUserAgeAndUserName) {System.out.println(user);}//提交事务sqlSession.commit();//关闭 SqlSessionsqlSession.close();}
}

1.4 配置解析

1.4.1 核心配置文件

  • 核心配置文件一般官方命名为:mybatis-config.xml
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息
  • 核心配置文件的主要结构
  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

1.4.2 environments(环境配置)

  • MyBatis 可以配置成适应多种环境
  • 但是一次只可以选择一种环境
  • 示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="test"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/qiaoer/dao/UserMapper.xml"/></mappers>
</configuration>
  • 在上方的<environments></environments> 标签内,<environment></environment> 标签代表不同的环境

  • environment 标签的属性 id,则对应的是自己的环境名称

  • environments 标签的 属性 default,则表示用户要选择哪个环境,与environment 标签的属性 id 的值对应

  • 例如,上方示例中,我的 environments 标签的属性 default 的值为 test ,则代表我选择了 环境 <environment id="test">

  • <transactionManager/> 标签为事务管理器

    • 在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”)
    • 只需记住 MyBatis 的默认的事务管理器为 JDBC 即可
  • <dataSource></dataSource> 标签为数据源

    • 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源
    • 有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”)
    • MyBatis 的默认的数据源类型为 POOLED

1.4.3 属性(properties)

  • 可以通过 properties 标签来应用外部的配置文件
  • 这些属性可以在外部进行配置,并可以进行动态替换
  • 示例,编写一个 配置文件,放入 resources 资源文件下

image-20230801111729723

  • 在 核心配置文件中引入外部配置文件
  • 通过 <properties></properties> 标签引入
  • <properties></properties> 必须放在 <configuration></configuration> 标签内部的最顶部
  • 示例

image-20230801112105683

  • <properties></properties> 标签的 resource 属性则代表配置文件的路径
  • 因为引入了外部配置文件,所以在下方的 <dataSource> 标签中,可以使用配置文件中的键来调用
  • 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值,示例

image-20230801112428365

  • <properties></properties> 标签内也可以写入配置信息
  • 示例

image-20230801120620256

  • <properties></properties> 标签内的子元素和外部配置文件 之间的顺序存在一个优先级顺序
  • 如果两个都存在同样的键,那么会使用外部的配置文件当中的键对应的值
    I]")
    • MyBatis 的默认的数据源类型为 POOLED

1.4.3 属性(properties)

  • 可以通过 properties 标签来应用外部的配置文件
  • 这些属性可以在外部进行配置,并可以进行动态替换
  • 示例,编写一个 配置文件,放入 resources 资源文件下

[外链图片转存中…(img-q4RXm37z-1690863007343)]

  • 在 核心配置文件中引入外部配置文件
  • 通过 <properties></properties> 标签引入
  • <properties></properties> 必须放在 <configuration></configuration> 标签内部的最顶部
  • 示例

[外链图片转存中…(img-h8xqCyEL-1690863007343)]

  • <properties></properties> 标签的 resource 属性则代表配置文件的路径
  • 因为引入了外部配置文件,所以在下方的 <dataSource> 标签中,可以使用配置文件中的键来调用
  • 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值,示例

[外链图片转存中…(img-OrgPNL0u-1690863007343)]

  • <properties></properties> 标签内也可以写入配置信息
  • 示例

[外链图片转存中…(img-hqFB60K9-1690863007343)]

  • <properties></properties> 标签内的子元素和外部配置文件 之间的顺序存在一个优先级顺序
  • 如果两个都存在同样的键,那么会使用外部的配置文件当中的键对应的值

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

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

相关文章

Spring的@Scheduled

Spring的Scheduled的默认线程池数量为1&#xff0c;也就是说定时任务是单线程执行的。这意味着最多同时只有一个任务在执行。当一个任务还在执行时&#xff0c;其他任务会等待其完成&#xff0c;然后按照其预定的执行策略依次执行。 测试代码&#xff1a; 启动类上加注解Enab…

网络编程 IO多路复用 [epoll版] (TCP网络聊天室)

//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 通过IO多路复用实现服务器在单进程单线程下可以与多个客户端交互 API epoll函数 #include<sys/epoll.h> int epoll_create(int size); 功能&#xff1a;创建一个epoll句柄//创建红黑树根…

线程、进程和管程

一、线程 1.1 定义 线程&#xff1a;线程是进程中的实体&#xff0c;一个进程可以拥有多个线程&#xff0c;一个线程必须有一个父进程。线程有时被称为轻量级进程&#xff0c;是程序执行流的最小单元。 线程的组成部分&#xff1a; 1. 线程ID&#xff1a;线程标识符 2. 当前…

【C++从0到王者】第十五站:list源码分析及手把手教你写一个list

文章目录 一、list源码分析1.分析构造函数2.分析尾插等 二、手把手教你写一个list1.结点声明2.list类的成员变量3.list类的默认构造函数4.list类的尾插5.结点的默认构造函数6.list类的迭代器7.设计const迭代器8.list的insert、erase等接口9.size10.list的clear11.list的析构函数…

arm neon/fpu/mfloat

neon官网介绍: Arm Neon technology is an advanced Single Instruction Multiple Data (SIMD) architecture extension for the A-profile and R-profile processors. Neon technology is a packed SIMD architecture. Neon registers are considered as vectors of elements …

前沿分享-会发电的水凝胶敷料

四川大学的研究团队设计了一种新型的伤口敷料&#xff0c; 将电刺激治疗引入伤口敷料&#xff0c;达到营造湿润环境的同时利用电刺激来加速愈合的效果。 上半部分由树状纳米纤维构成&#xff0c;下半部分由双网络导电水凝胶构成&#xff0c;加入了铁离子和儿茶酚。该部分用于贴…

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核&#xff0c;基础性IP核都是可以直接免费调用的&#xff0c;比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识&#xff0c;帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out&#xff0c;即先进先出。 FIFO是一个数…

语义检索系统【四】:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练的单塔模型实现数据精排

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

无涯教程-Lua - 环境安装

在Windows上安装 为Windows环境开发了一个单独的名为" SciTE"的IDE,可以从https://code.google.com/p/luaforwindows/下载部分。 运行下载的可执行文件以安装Lua IDE。 由于它是一个IDE&#xff0c;因此您可以使用它来创建和构建Lua代码。 如果您有兴趣在命令行模…

微服务架构的模式介绍

1.微服务架构模式方案 用Scale Cube方法设计应用架构&#xff0c;将应用服务按功能拆分成一组相互协作的服务。每个服务负责一组特定、相关的功能。每个服务可以有自己独立的数据库&#xff0c;从而保证与其他服务解耦。 1.1 聚合器微服务设计模式 聚合器调用多个服务实现应用程…

Jmeter远程服务模式运行时引用csv文件的路径配置

问题 在使用jmeter过程中&#xff0c;本机的内存等配置不足&#xff0c;启动较多的线程时&#xff0c;可以采用分布式运行。 在分布式运行的时候&#xff0c;jmeter会自动将脚本从master主机发送到remote主机上&#xff0c;所以不需要考虑将脚本拷贝到remote主机。但是jmeter…

UPnP是什么?有什么更好的连接方案?快解析内网穿透

一、UPnP是什么 有些小伙伴对于UPnP并不了解&#xff0c;其实UPnP只是一种网络协议&#xff0c;主要作用就是简化家庭和企业网络中设备之间的连接和通信过程&#xff0c;它的主要目标是实现网络的无缝连接&#xff0c;并简化相关网络操作。 二、UPnP有什么主要作用&#xff1…

125.验证回文串

目录 一、题目 二、代码 一、题目 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public: bool ABC(char& s) {if (s > 65 && s < 90){s 32;return true;}if (s > 97 && s < 122){return true;}if …

Chapter 10: Dictionaries | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介DictionariesDictionariesDictionary as a set of countersDictionaries and filesLooping and dictionariesAdvanced text parsingDebuggingGlossary Python for Everybody Exploring Data Using Python 3 Dr. Charles R. Severance 课程…

linux安装Tomcat及部署jpress的详细教程!!!

一、YUM在线安装 1、查看Tomcat相关安装包 [rootlocalhost ~]# yum list | grep tomcat tomcat.noarch 7.0.76-16.el7_9 updates tomcat-admin-webapps.noarch 7.0.76-16.el7_9 updates tomcat-docs…

2D视觉检测算法整理

1.ROI pooling 和 ROI align的区别 ROI pooling第一步根据候选区域找特征图的位置&#xff0c;可能不是刚好对应&#xff0c;需要一次量化&#xff0c;如上图所示&#xff0c;第二次是特征图需要转化为特定的大小&#xff0c;这时候pooling可能也不能正好整除&#xff0c;所以第…

【Linux命令200例】tee将输入内容输出到屏幕和文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

计算机毕设 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

RocketMQ 在业务消息场景的优势详解

作者&#xff1a;隆基 01 消息场景 RocketMQ 5.0 是消息事件流一体的实时数据处理平台&#xff0c;是业务消息领域的事实标准&#xff0c;很多互联网公司在业务消息场景会使用 RocketMQ。 我们反复提到的“消息、业务消息”&#xff0c;指的是分布式应用解耦&#xff0c;是 R…

Linux系统CPU和磁盘性能进程分析工具pidstat

一、pidstat对CPU的分析 Linux 上的pidstat(1)工具按进程或线程打印CPU 用量&#xff0c;包括用户态和系统态时间的分解。默认情况下&#xff0c;仅循环输出活动进程的信息。例如&#xff1a; 这个例子捕捉到了系统备份&#xff0c;包含了tar(1)命令&#xff0c;从文件系统读取…