前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot整合MyBatis

SpringBoot整合MyBatis

作者头像
梅花
发布于 2020-10-10 02:29:19
发布于 2020-10-10 02:29:19
42400
代码可运行
举报
运行总次数:0
代码可运行
  1. SpringBoot整合MyBatis 【接口注解方式】

仅做配置记录,方便以后快速搭建粘贴,没有任何营养价值

1.0 创建表的Sql 脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `User` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

1.1 需要Maven配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.plumblossom</groupId>
    <artifactId>springboot-transaction</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-transaction</name>
    <description>Spring Transaction Knowledge</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!-- 配置MyBatis连接数据库,还需要配置 mysql驱动包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <!--  配置驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

		<!-- 为了简化Bean的Get Set 方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.2 Properties 配置文件内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# MyBatis 配置
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123321
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

上述配置有两点需要说明:

  1. 配置spring.datasource.url 的时候需要配置下时区不然运行的时候会抛出异常
  2. spring.datasource.driver-class-name 这个是因为 默认使用的是mysql8 的连接驱动所以和传统的比较多了个cj

1.3 User 对象的实体类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.plumblossom.springboottransaction.bean;


import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString
@NoArgsConstructor
public class User {

    private Long id;
    private String name;
    private Integer age;

    public User(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

1.4 UserMapper 数据化持久层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.plumblossom.springboottransaction.mapper;

import com.plumblossom.springboottransaction.bean.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {

    // 查询指定姓名的用户
    @Select("select * from user where name=#{name}")
    User findUserByName(@Param("name") String n);

    // 向数据库中插入用户
    @Insert("insert into user(name,age) values(#{name},#{age})")
    int insertUser(@Param("name") String name, @Param("age") Integer age);

}

1.5 编写测试用例对上面这种方式进行测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.plumblossom.springboottransaction.mapper;

import com.plumblossom.springboottransaction.bean.User;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;


@Slf4j
@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    @Rollback
    public void testUserMapperInsert(){
        userMapper.insertUser("张三", 23);
        User user = userMapper.findUserByName("张三");
        log.info(user.toString());
        Assertions.assertThat(user.getAge()).isEqualTo(23);

    }

}

执行代码日志打印结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-09-28 16:37:25.288  INFO 5344 --- [ main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-09-28 16:37:25.621  INFO 5344 --- [ main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-09-28 16:37:25.805  INFO 5344 --- [ main] c.p.s.mapper.UserMapperTest              : User(id=1, name=张三, age=23)

可以看到成功的执行了,但是此处还有一个注意点:

SpringBoot2.x 中默认使用的是hikari.HikariDataSource 数据源,SpringBoot1.x 网上说使用的是TomcatDataSource

拓展思考点: 如何更换数据源,还有这个数据源是怎么被SpringBoot 管理的

  1. SpringBoot整合MyBatis 【xml 配置文件方式】

2.1 application.properties 配置文件中的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# MyBatis 配置
mybatis.type-aliases-package=com.plumblossom.springboottransaction.bean
# 指定Mybatis 配置文件,应该也可以使用Configuration 配置类的方式进行配置
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# 指定Mapper配置文件的路径,也可以使用Configuration 配置类的方式进行配置
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml


# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123321
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2.2 mybatis-config.xml 配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>
</configuration>

2.3 UserMapper配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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.plumblossom.springboottransaction.mapper.UserMapper" >

    <resultMap id="BaseResultMap" type="com.plumblossom.springboottransaction.bean.User" >
        <id column="id" property="id" jdbcType="VARCHAR" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="age" property="age" jdbcType="INTEGER" />
    </resultMap>

    <sql id="Base_Column_List" >
        id, name, age
    </sql>


    <select id="findUserByName" parameterType="java.lang.String" resultMap="BaseResultMap" >
        SELECT
        <include refid="Base_Column_List" />
        FROM
        user
        WHERE name = #{name}
    </select>

    <insert id="insertUser" >

        INSERT INTO
        user
        (name, age)
        VALUES
        ( #{name}, #{age})
    </insert>


</mapper>

2.4 UserMapper.Java的文件内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.plumblossom.springboottransaction.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;


@Mapper
public interface UserMapper {

    User findUserByName(@Param("name") String n);

    int insertUser(@Param("name") String name, @Param("age") Integer age);

}

2.5 使用测试用例执行测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.plumblossom.springboottransaction.mapper;

import com.plumblossom.springboottransaction.bean.User;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;

@Slf4j
@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    @Rollback
    public void testUserMapperInsert(){
        userMapper.insertUser("李四", 55);
        User user = userMapper.findUserByName("李四");
        log.info(user.toString());
        Assertions.assertThat(user.getAge()).isEqualTo(55);

    }

}

执行测试结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-09-28 17:20:28.254  INFO 17148 --- [main] com.zaxxer.hikari.HikariDataSource  : HikariPool-1 - Starting...
2020-09-28 17:20:28.527  INFO 17148 --- [main] com.zaxxer.hikari.HikariDataSource  : HikariPool-1 - Start completed.
2020-09-28 17:20:28.706  INFO 17148 --- [main] c.p.s.mapper.UserMapperTest : User(id=2, name=李四, age=55)

注意点: 这两种Dao 数据持久层的接口,我都使用了@Mapper 这个注解,他的作用就是在代码编译过后会生成相应的接口实现类,这种方式是官方推荐的。这里只有一个接口文件,如果有非常多的接口,在每一个上面标注上这个注解,也是一件麻烦的事情。所以还有另一个注解@MapperScan(packageName) 在SpringBoot的启动类上标注上这个注解,就会直接扫描指定包下的接口并生成实现类。

3 SpringBoot 整合MyBatis 原理

3.1 SpringBoot 能够整合MyBatis的原因

主要是org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration 这个类在起作用

在以前学习spring整合与mybatis整合的时候,需要我们自己配置两个Bean 一个是sqlSessionFactoryBean,还有一个是MapperScanner,在Springboot中这两个Bean不需要我们提供了,但并不是意味着这两个Bean不需要了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {
    private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class);
    private final MybatisProperties properties;
    private final Interceptor[] interceptors;
    private final TypeHandler[] typeHandlers;
    private final LanguageDriver[] languageDrivers;
    private final ResourceLoader resourceLoader;
    private final DatabaseIdProvider databaseIdProvider;
    private final List<ConfigurationCustomizer> configurationCustomizers;

  

    @Bean
    @ConditionalOnMissingBean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setVfs(SpringBootVFS.class);
        if (StringUtils.hasText(this.properties.getConfigLocation())) {
            factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
        }

        this.applyConfiguration(factory);
        if (this.properties.getConfigurationProperties() != null) {
            factory.setConfigurationProperties(this.properties.getConfigurationProperties());
        }

        if (!ObjectUtils.isEmpty(this.interceptors)) {
            factory.setPlugins(this.interceptors);
        }

        if (this.databaseIdProvider != null) {
            factory.setDatabaseIdProvider(this.databaseIdProvider);
        }

        if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
            factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
        }

        if (this.properties.getTypeAliasesSuperType() != null) {
            factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType());
        }

        if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
            factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
        }

        if (!ObjectUtils.isEmpty(this.typeHandlers)) {
            factory.setTypeHandlers(this.typeHandlers);
        }

        if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
            factory.setMapperLocations(this.properties.resolveMapperLocations());
        }

        Set<String> factoryPropertyNames = (Set)Stream.of((new BeanWrapperImpl(SqlSessionFactoryBean.class)).getPropertyDescriptors()).map(FeatureDescriptor::getName).collect(Collectors.toSet());
        Class<? extends LanguageDriver> defaultLanguageDriver = this.properties.getDefaultScriptingLanguageDriver();
        if (factoryPropertyNames.contains("scriptingLanguageDrivers") && !ObjectUtils.isEmpty(this.languageDrivers)) {
            factory.setScriptingLanguageDrivers(this.languageDrivers);
            if (defaultLanguageDriver == null && this.languageDrivers.length == 1) {
                defaultLanguageDriver = this.languageDrivers[0].getClass();
            }
        }

        if (factoryPropertyNames.contains("defaultScriptingLanguageDriver")) {
            factory.setDefaultScriptingLanguageDriver(defaultLanguageDriver);
        }

        return factory.getObject();
    }

   

    @Bean
    @ConditionalOnMissingBean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        ExecutorType executorType = this.properties.getExecutorType();
        return executorType != null ? new SqlSessionTemplate(sqlSessionFactory, executorType) : new SqlSessionTemplate(sqlSessionFactory);
    }

    @Configuration
    @Import({MybatisAutoConfiguration.AutoConfiguredMapperScannerRegistrar.class})
    @ConditionalOnMissingBean({MapperFactoryBean.class, MapperScannerConfigurer.class})
    public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {
        public MapperScannerRegistrarNotFoundConfiguration() {
        }

        public void afterPropertiesSet() {
            MybatisAutoConfiguration.logger.debug("Not found configuration for registering mapper bean using @MapperScan, MapperFactoryBean and MapperScannerConfigurer.");
        }
    }

   
}

未完。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
SSH的工作原理
SSH简介 传统的网络服务程序,比如FTP,POP,Telnet,本质上都是不安全的,因为它们在网络上用明文传送数据、用户账号和用户口令,很容易受到中间人攻击方式的攻击,攻击者会冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。 为了满足安全性的需求,IETF的网络工作小组制定了Secure Shell(缩写为SSH),这是一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell提供安全的传输和使用环境。 SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协
大蟒传奇
2018/06/20
1.4K0
SSH 协议为什么安全?
大家都知道 ssh 命令,是用于远程登陆的,使用用户名密码或公钥进行认证。 如命令
somenzz
2020/12/10
2.8K0
了解SSH加密和连接过程 转
SSH或安全shell是安全协议,也是安全管理远程服务器的最常用方式。通过使用多种加密技术,SSH提供了一种机制,用于在双方之间建立加密安全连接,对彼此进行身份验证,以及来回传递命令和输出。
wuweixiang
2018/08/14
1.2K0
了解SSH加密和连接过程【官方推荐教程】
SSH或安全shell是一种安全协议,是安全管理远程服务器的最常用方法。使用多种加密技术,SSH提供了一种机制,用于在双方之间建立加密安全连接,向另一方验证每一方,以及来回传递命令和输出。
Jean
2019/05/23
3.1K0
了解SSH加密和连接过程【官方推荐教程】
SSH初认识:了解加密、端口和连接
SSH(即安全外壳协议)是一种远程管理协议,允许用户通过 Internet 访问、控制和修改其远程服务器。SSH 服务是作为未加密 Telnet 的安全替代品而创建的,并使用加密技术来确保与远程服务器之间的所有通信都以加密方式进行。它提供了一种对远程用户进行身份验证、将输入从客户端传输到主机以及将输出中继回客户端的机制。
Lemon黄
2023/11/23
2.2K0
SSH初认识:了解加密、端口和连接
SSH基于用户名密码的认证原理
哈喽,大家好呀!这里是码农后端。今天来聊一聊什么是SSH以及SSH基于用户名密码的认证原理。
reload
2024/07/03
4210
SSH基于用户名密码的认证原理
SSH 工作原理
SSH 全称(Secure Shell),是一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。
运维部落
2020/05/28
2.1K0
透视HTTPS建造固若金汤的城堡
为什么有 HTTPS?因为 HTTP 不安全! 现在的互联网已经不再是 “田园时代”,“黑暗森林” 已经到来。上网的记录会被轻易截获,网站是否真实也无法验证,黑客可以伪装成银行网站,盗取真实姓名、密码、银行卡等敏感信息,威胁人身安全和财产安全。
Bug开发工程师
2020/09/22
5150
透视HTTPS建造固若金汤的城堡
HTTPS终于搞懂了
近些年来,越来越多的网站使用 HTTPS 协议进行数据传输,原因在于 HTTPS 相较于 HTTP 能够提供更加安全的服务。
捡田螺的小男孩
2023/02/22
9900
HTTPS终于搞懂了
【HTTP】HTTPS TLS 1.2
在个人过去的读书笔记中已经介绍过一次,在这一篇文章中介绍了HTTP1.1的缺点,以及SSL、TLS的历史,之后介绍了有关SSL加密的主要加密方案:公开密钥加密 和 共享密钥加密,最后简单介绍了HTTPS的交互过程,但是书中的过程比较粗,这节我们讲细一点点。
阿东
2022/09/12
1.3K0
Nginx(3)-创建 https 站点
使用对称加密,交易双方都使用同样钥匙,安全性得不到保证;每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。
懒人的小脑
2019/03/19
1.2K0
Nginx(3)-创建 https 站点
深入理解SSL协议:从理论到实践
这是一篇关于SSL协议的技术文章,有理论知识,但又兼具一定的实战性,文章的主要内容分享了SSL协议的核心概念、工作原理、常见的应用场景,以及就https这种实际应用场景,又着重分享具体的工作原理以及如何实现https访问网站。无论你是信息安全技术的初学者,还是专业人士,相信这篇文章都能给你带来一些帮助或启示。如果有失误之处,烦请在评论区指出,以便共同成长和进步。
大漠天涯
2024/03/28
3.1K0
HTTPS:网络安全攻坚战
我们知道,明文传输和不安全是HTTP的其中一个特点,但是随着越来越多机密的业务交易转移到线上,如银行转账、证券交易、在线支付、电商等,我们对传输的安全性有了更高的要求,为此,出现了HTTP的扩展:HTTPS,Hypertext Transfer Protocol Secure,超文本传输安全协议。
用户9282069
2021/12/13
4850
HTTP与HTTPS的区别,详细介绍[通俗易懂]
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
全栈程序员站长
2022/07/01
4.9K0
HTTP与HTTPS的区别,详细介绍[通俗易懂]
一文彻底搞懂 HTTPS 的工作原理!
当你打开浏览器,访问某个网站,如果网址旁有个小锁,代表访问的网址是安全的,反之不安全。当我们没有看到那个小锁的小图标的时候,需要提高警惕,不要随意输入个人重要的资料。所有的银行和支付相关的网站都是100%使用HTTPS的。
杰哥的IT之旅
2020/06/18
4.1K0
一文彻底搞懂 HTTPS 的工作原理!
HTTP和HTTPS的区别,看完后随便吊打面试官
下面我们来一起学习一下 HTTPS ,首先问你一个问题,为什么有了 HTTP 之后,还需要有 HTTPS ?我突然有个想法,为什么我们面试的时候需要回答标准答案呢?为什么我们不说出我们自己的想法和见解,却要记住一些所谓的标准回答呢?技术还有正确与否吗?
淘课之家
2020/03/15
3.7K1
HTTP和HTTPS的区别,看完后随便吊打面试官
HTTP和HTTPS的区别【面试常考】[通俗易懂]
HTTP和HTTPS是计算机网络中很重要的知识点,面试的时候很容易被问他们的区别,可能每个人都会有自己理解;
全栈程序员站长
2022/11/10
1.3K0
基础知识补充1:密钥交换/协商机制
密钥协商这一概念也得以提出。一方面它能为参与者提供身份认证,另一方面,也能与参与者协商并共享会话密钥。
春风大魔王
2020/07/29
5.6K0
真正“搞”懂HTTPS协议16之安全的实现
  然后,我们还学了HTTPS到底是什么,以及HTTPS真正的核心SSL/TLS是什么。最后我们还聊了聊TLS的实现,也就是OpenSSL。
zaking
2023/02/16
7350
真正“搞”懂HTTPS协议16之安全的实现
车联网通信安全之 SSL/TLS 协议
在汽车出行愈加智能化的今天,我们可以实现手机远程操控车辆解锁、启动通风、查看车辆周围影像,也可以通过 OTA(空中下载技术)完成升级车机固件、更新地图包等操作,自动驾驶技术更是可以让车辆根据路面状况自动辅助实施转向、加速和制动。
EMQ映云科技
2022/07/04
1.4K0
车联网通信安全之 SSL/TLS 协议
相关推荐
SSH的工作原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档