day51_mybatis

news2025/2/1 9:52:02

今日内容

零、 复习昨日
一、缓存
二、单例设计模式

零、 复习昨日

多表联查的时候

  • 扩展类
  • 写接口设计方法
  • 写sql语句
    • 不能直接映射成实体类
    • resultMap
      • 一对一 axxxxxxx
      • 一对多 collection

一、$和#的区别

使用#

image-20220922155116760

使用$

image-20220922155245304

总结:

#{} 相当于是预处理语句,会将#换成占位符?,字符串等数据赋值时自动拼接引号,可以避免SQL注入

${} 相当于是处理语句,直接原样将数据取出,直接拼接

使用模糊查询再验证一遍

使用#{} 写模糊查询

    <select id="findByKeyword" resultType="User">
        <!-- 下方#{} 会自动拼接引号,导致sql异常,报错 -->
        select * from tb_user where username like '%#{keyword}%' 
    </select>

以上写法会把sql变成这样,#符号会给字符串拼接单引号

select * from tb_user where username like ‘%‘张’%’

改成${}写模糊查询

    <select id="findByKeyword" resultType="User">
        <!-- 使用${} 直接取出数据,拼接进行就可以 -->
        select * from tb_user where username like '%${keyword}%' 
    </select>

以上写法会把sql变成这样,$符号是直接取值的

select * from tb_user where username like ‘%张%’

函数concat解决#{} 拼接单引号问题

<select id="findByKeyword" resultType="User">
    <!-- 推荐 -->
    select * from tb_user where username like concat('%',#{keyword},'%')
</select>

二、缓存(cache)【面试问】

缓存主要目的是为了提高查询效率.缓存其实就是一个内存空间,存储在程序的某个地方,存储数据.

mybatis支持缓存的,且有两级缓存

  • 一级缓存
  • 二级缓存
无缓存:用户在访问相同数据时,需要发起多次对数据库的直接访问,导致产生大量IO、读写硬盘的操作,效率低下
image-20230601165546620
有缓存:首次访问时,查询数据库,将数据存储到缓存中;再次访问时,直接访问缓存,减少IO、硬盘读写次数、提高效率
image-20230601165610966

2.1 一级缓存

MyBatis的一级缓存是默认的.无需配置,自动实现.

默认的一级缓存是SqlSession级别,是指同一个SqlSession发起的多次查询同一条数据,会使用缓存.

image-20221217112819746

ps: Mybatis内部存储缓存使用的是一个HashMap对象,key为 hashCode + sqlId + sql 语句。而value值就是从查询出来映射生成的java对象。

2.1.1 命中缓存

    /**
     * 测试一级缓存
     * -----------------------
     * 如何确定使用了缓存而不是查询数据库? 通过sql语句来确定
     * 只有发出sql,就说明查询数据库,即没有用缓存
     */
    @Test
    public void testOneLevelCache() {
        UserMapper mapper1 = sqlSession.getMapper(UserMapper.class);
        User user1 = mapper1.findUserById(1);
        System.out.println("user1 = " + user1);

        System.out.println("-----------------------");
        // 命中缓存的前提:1) 同一SqlSession,2) 同一条件
        UserMapper mapper2 = sqlSession.getMapper(UserMapper.class);
        User user2 = mapper2.findUserById(1);
        System.out.println("user2 = " + user2);
    }

image-20221217105404288

2.1.2 不使用缓存的情况

不使用缓存的情况1: 条件不一致

image-20221217105915197

不使用缓存的情况2: sqlSession不一样

   @Test
    public void testOneLevelCache2() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获得会话1
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        User user1 = mapper1.findUserById(1);
        System.out.println("user1 = " + user1);

        System.out.println("---------------------------------" );
        // 获得一个会话2
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        User user2 = mapper2.findUserById(1);
        System.out.println("user2 = " + user2);
    }

image-20221217110337438

虽然是同一条数据,但是还是没有使用缓存!为什么?

一级缓存是SqlSession级别,即缓存数据存储在SqlSession中,这次都不是同一个SqlSession,那就无法使用缓存

2.1.3 清空缓存

在更新(更新,删除,插入)数据后,会清空缓存,下次重新查最新的数据.避免脏读

   /**
     * 演示: 增删改都会清空缓存
     */
    @Test
    public void testOneLevelCache3() {
        UserMapper mapper1 = sqlSession.getMapper(UserMapper.class);
        User user1 = mapper1.findUserById(1);
        System.out.println("user1 = " + user1);
        System.out.println("---------------------------------" );

        // 只要有增删改都会清空缓存
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User( );
        user.setId(2);
        user.setUsername("QF");
        user.setPassword("qf888");
        int i = mapper.updateUser(user);
        System.out.println(i > 0?"OK":"ERR" );
        // 增删改要提交
        sqlSession.commit();


        System.out.println("---------------------------------" );
        // 清空缓存后,再查就要从数据库查
        UserMapper mapper2 = sqlSession.getMapper(UserMapper.class);
        User user2 = mapper2.findUserById(1);
        System.out.println("user2 = " + user2);
    }

image-20221217111713739

2.1.4 关闭缓存

一级缓存也叫本地缓存(LocalCache),Mybatis的一级缓存是会话级别(SqlSession)层面进行缓存的。Mybatis的一级缓存是默认开启的。开发项目中不需要做任何配置,但是如果想关闭一级缓存,可以在mybatis配置文件的settings下面使用localCacheScopde=statement来关闭。

<settings>
    <!-- localCacheScope是本地缓存(一级缓存)的作用域,只有两种取值:SESSION和STATEMENT,取STATEMENT意味着关闭一级缓存-->
    <setting name="localCacheScope" value="STATEMENT"/>
</settings>

2.2 二级缓存

二级缓存是Mapper级别,比SqlSession级别范围更大.

使用时需要手动设置

  • 1)需要在全局配置文件中开启缓存(默认开着的)

        <settings>
            <!-- 开启缓存(默认就是true) -->
            <setting name="cacheEnabled" value="true"/>
        </settings>
    
  • 2)需要在mapper中设置caceh即可

    <cache/>
    
    • 映射语句文件中的所有 select 语句的结果将会被缓存。
    • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。

2.2.1 使用二级缓存

  • 1)需要在全局配置文件中开启缓存(默认开着的)
  • 2)需要在mapper中设置caceh即可
  • 3)每个会话执行完,要关流close,才会将查询是数据放入缓存
  • 4)实体类需要系列化,实现Serializable接口
   /**
     * 二级缓存
     * 演示不同SqlSession,会命中缓存
     */
    @Test
    public void testTwoLevelCache1() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获得会话1
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        User user1 = mapper1.findUserById(1);
        System.out.println("user1 = " + user1);
        // 关闭会话,才会将这次查询的结果放入缓存!!!
        sqlSession1.close();


        System.out.println("---------------------------------" );
        // 获得一个会话2
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        User user2 = mapper2.findUserById(1);
        System.out.println("user2 = " + user2);
        sqlSession2.close();


        System.out.println("---------------------------------" );
        // 获得一个会话3
        SqlSession sqlSession3 = sqlSessionFactory.openSession();
        UserMapper mapper3 = sqlSession3.getMapper(UserMapper.class);
        User user3 = mapper3.findUserById(1);
        System.out.println("user3 = " + user3);
        sqlSession3.close();
    }

image-20221217150734678

2.2.2 清空缓存

   /**
     * 二级缓存
     * 演示增删改会清空缓存
     */
    @Test
    public void testTwoLevelCache2() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获得会话1
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        User user1 = mapper1.findUserById(1);
        System.out.println("user1 = " + user1);
        // 关闭会话,才会将这次查询的结果放入缓存!!!
        sqlSession1.close();


        System.out.println("---------------------------------" );
        // 获得一个会话2
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        User user2 = mapper2.findUserById(1);
        System.out.println("user2 = " + user2);
        System.out.println("---------------------------------" );

        // 只要有增删改都会清空缓存
        UserMapper mapper = sqlSession2.getMapper(UserMapper.class);
        User user = new User( );
        user.setId(2);
        user.setUsername("QF");
        user.setPassword("qf888");
        int i = mapper.updateUser(user);
        System.out.println(i > 0?"OK":"ERR" );
        // 增删改要提交
        sqlSession2.commit();
        sqlSession2.close();

        System.out.println("---------------------------------" );
        // 获得一个会话3
        SqlSession sqlSession3 = sqlSessionFactory.openSession();
        UserMapper mapper3 = sqlSession3.getMapper(UserMapper.class);
        User user3 = mapper3.findUserById(1);
        System.out.println("user3 = " + user3);
        sqlSession3.close();
    }

image-20221217151432765

image-20221217151638962

三、整合数据源

引入依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

配置db.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database_name?useSSL=false
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=5
jdbc.maxActive=20
jdbc.minIdle=3
jdbc.maxWait=0
jdbc.timeBetweenEvictionRunsMillis=0
jdbc.minEvictableIdleTimeMillis=0

替换原有的连接池类型

需要创建一个类,继承Mybatis提供一个数据库连接池的工厂类

package com.qf.util;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class MyDruidDataSourceFactory extends PooledDataSourceFactory {
    // 构造方法
    public MyDruidDataSourceFactory(){
        // 创建alibaba的连接池
        this.dataSource = new DruidDataSource();
    }
}
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <!-- 上面创建的数据库连接池类 -->
        <dataSource type="com.qf.util.MyDruidDataSourceFactory">
            <!-- 下面的配置,name跟以前不一样 -->
            <!-- driver变成了driverClass -->
            <!-- urler变成了jdbcUrl -->
            <property name="driverClass" value="${jdbc.driver}"/>
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

后续正常使用CRUD,可以减少查询时间.

四、逆向工程(神器)

只有给定数据库表,然后逆向工程可以直接根据表自动生成实体类,接口文件,CRUD方法以及对应的映射文件,以及文件中写好SQL语句.

1 加入逆向工程的依赖

    <dependencies>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>

2 pom中加入逆向工程的插件

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
            <!--指定资源文件的路径-->
            <configuration>
                <configurationFile>src\main\resources\generator.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.47</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

3 编写逆向所需配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <!-- 生成 JavaBean 对象重写 toString方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/java2212"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- targetProject:生成MODEL类的位置 -->
        <javaModelGenerator targetPackage="com.qf.model"
                            targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.qf.mapper"
                         targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.qf.mapper"
                             targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <table tableName="admin"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"/>
        <table tableName="user"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

4 运行

image-20220922172113233

五、单例设计模式

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。

单例模式是一种对象创建型模式。

Servlet默认是单例的。

单例模式有三个要点:

  • 某个类只能有一个实例
  • 它必须自行创建这个实例
  • 它必须自行向整个系统提供这个实例。

懒汉式

(1)由于每次使用new关键字来实例化Singleton 类时都将产生一个新对象,为了确保Singleton 实例的唯一性,我们需要禁止类的外部直接使用new来创建对象,因此需要将Singleton 的构造函数的可见性为private

(3)为了保证成员变量的封装性,我们将Singleton 类型的single的可见性设置为private,但外界该如何使用该成员变量并何时实例化该成员变量呢?答案是增加一个公有的静态方法Singleton getInstance(),

//懒汉式单例类.在第一次调用的时候实例化自己   
public class Singleton {  
    //1 私有的构造器
    private Singleton() {}  
    //2 私有 静态 Singleton类型 成员变量
    private static Singleton single=null;  
    //3 公有静态方法  
    public static Singleton getInstance() {  
         if (single == null) {    
             single = new Singleton();  
         }    
        return single;  
    }  
}

饿汉式

不管有么有被被人使用,先把对象创建出来

//饿汉式单例类.在类初始化时,已经自行实例化   
public class Singleton1 {  
    //1 私有构造器
    private Singleton1() {} 
    //2 直接创建私有 静态(可以不是final)对象
    private static final Singleton1 single = new Singleton1();  
    //3 静态方法   
    public static Singleton1 getInstance() {  
        return single;  
    }  
}  

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

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

相关文章

【c语言进阶】深入挖掘数据在内存中的存储

深入挖掘数据在内存中的存储 数据类型介绍数据类型基本分类及其大小 整形在内存中的存储方式原码、反码、补码大小端介绍判断一个系统是大端还是小端 char与unsigned char值范围与图解整形存储相关练习题 浮点数在内存中的存储方式浮点数存储规则案列 结语 铁汁们&#xff0c;今…

计算机网络填空题

我会写下自己的答案和理解 希望自己可用在学习中体会到快乐&#xff0c;而不是麻木。 1. 网络协议三要素中语义是指 需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应 1.在计算机网络中要做到有条不紊的交换数据&#xff0c;就必须遵守一些事…

算法刷题-链表-移除链表元素

链表操作中&#xff0c;可以使用原链表来直接进行删除操作&#xff0c;也可以设置一个虚拟头结点再进行删除操作&#xff0c;接下来看一看哪种方式更方便。 203.移除链表元素 力扣题目链接 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&…

红黑树(Red Black Tree)基本性质 + 建树

定义 红黑树&#xff1a;一种特殊的二叉搜索树 二叉搜索树&#xff1a;一种树的类型&#xff0c;每个节点最多有两个子节点&#xff0c;其中其左节点一定小于当前节点&#xff0c;右节点一定大于当前节点 二叉树的缺点&#xff1a;如果给定的初始序列顺序不好&#xff0c;可能…

算法刷题-链表-删除链表的倒数第N个节点

删除链表的倒数第N个节点 19.删除链表的倒数第N个节点思路其他语言版本 19.删除链表的倒数第N个节点 力扣题目链接 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1…

微服务_fegin

Feign服务调用 是客户端组件 ruoyi系统中Log\Auth\User用了远程服务调用&#xff0c;用工厂模式给他的报错加了层工厂类&#xff0c;return错误的时候重写了以下方法。 在ruoyi-common-core模块中引入依赖 <!-- SpringCloud Openfeign --><dependency><group…

springboot不香吗?为什么还要使用springcloud--各个组件基本介绍(Feign,Hystrix,ZUUL)

1.Feign负载均衡简介 1.1 Feign是什么 Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口&#xff0c;然后在上面添加注解&#xff0c;同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring…

07-根据Hutool工具的JWT实现单点登录功能

1、两种单点登录方案 1.1、使用token + Redis 实现单点登录(一般不用了) 1.2、使用JWT实现单点登录 2、 JWT单点登录的原理和JWT存在的问题及解决方案讲解 2.1、JWT结构 > Header 头部信息,主要声明了JWT的签名算法等信息。 > Payload 载荷信息,主要承载了各种声明并…

闲置APP小程序开发 你不喜欢的可能正是别人需要的

生活中我们常常会产生各种闲置物品&#xff0c;尤其是对于有宝宝的家庭来说&#xff0c;孩子小的时候可能会添置各种玩具、婴儿车或者是别的用品&#xff0c;随着孩子渐渐长大&#xff0c;这些东西都用不上了&#xff0c;但是扔了又觉得很可惜&#xff0c;留着又占地方&#xf…

给编程初学者写一篇简单的文章,快速查询本机ip,黑别人电脑的基基础

给编程小白写一篇简单的文章&#xff0c;快速查询本机ip 首先&#xff0c;按下win徽标键r键 &#xff08;先按win键再按r键&#xff09; 出现一个小窗口 在里面输入cmd 然后&#xff0c;你将得到一个cmd窗口 在里面输入ipconfig&#xff0c;然后按回车 就可以得到ip地址了 如…

【浅学 MyBatis 】

MyBatis 笔记记录 一、MyBatis基础1. MyBatis介绍及快速入门2. 相关API介绍2.1 Resources2.2 SqlSessionFactory&&SqlSessionFactoryBuilder2.3 SqlSession 3. 映射配置文件4. 核心配置文件4.1 规范写法4.2 参数和返回类型_起别名 5. 引入Log4j 二、MyBatis进阶1. 接口…

Mac环境Royal TSX 从入门使用代替X sheet

Royal TSX 是一款 macOS 下可用的远程连接软件&#xff0c;类似于 Windows 系统的 XShell 。免费版最多支持 10 个连接&#xff0c;对于个人开发而言&#xff0c;已经足够了 一、下载安装 Royal TS 官网&#xff1a;https://www.royalapps.com/ts/win/download 选择 Royal T…

Python Ploty学习: 最简单的Dash App

1 Ploty简介 示例来自官网A Minimal Dash App | Dash for Python Documentation | Plotly有改动 Ploty与matplotlib和seaborn相比&#xff0c;其核心优势在于可交互性&#xff0c;matplotlib和seaborn默认情况下不可交互&#xff0c;具备可交互性的图表在数据分析、展示方面更…

CLIP原理解读——大模型论文阅读笔记一

CLIP原理解读 一. 核心思想 通过自然语言处理来的一些监督信号&#xff0c;可以去训练一个迁移效果很好的视觉模型。 论文的作者团队收集了一个超级大的图像文本配对的数据集&#xff0c;有400 million个图片文本的配对&#xff0c; 模型最大用了ViT-large&#xff0c;提出了…

【JavaEE】使Cookie与Session失效-Servlet上传文件操作-优化表白墙

表白墙退出登录操作-表白墙注册上传头像登录显示头像功能 文章目录 【JavaEE】使Cookie与Session失效-表白墙退出登录操作-Servlet上传文件操作-表白墙注册上传头像登录显示头像功能1. Cookie与Session的删除1.1 表白墙页面增加登录出口1.2 点击链接退出登录1.3 测试 2. 上传文…

【Java线程池详解】—— 每天一点小知识

&#x1f4a7; J a v a 线程池 \color{#FF1493}{Java线程池} Java线程池&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x1f…

2023-6-10-第一式工厂方法模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

安卓与串口通信-数据分包的处理

前言 本文是安卓串口通信的第 5 篇文章。本来这篇文章不在计划内&#xff0c;但是最近在项目中遇到了这个问题&#xff0c;正好借此机会写一篇文章&#xff0c;在加深自己理解的同时也让大伙对串口通信时接收数据可能会出现分包的情况有所了解。 其实关于串口通信会可能会出现…

编译tolua——3、以pbc为例子,添加第三方库

目录 1、编译工具和环境说明 2、基础编译tolua 3、以pbc为例子&#xff0c;添加第三方库 4、更新luaJit 大家好&#xff0c;我是阿赵。 之前分享过怎样正常编译基础版本的tolua。这次用添加pbc为例&#xff0c;看看怎样往tolua里面添加其他的第三方库。知道了方法之后&#xf…

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好&#xff0c;我是郭东白。上节课我们讲了为什么要做阶段性的价值交付&#xff0c;以及进入阶段性价值交付环节的准备工作。有了这些学习基础&#xff0c;这节课我们就可以进行阶段性价值交付了。 在交付的过程中&#xff0c;主要有三部分工作&#xff1a;目标分解、定义交…