深入浅出Mybatis从理论到实践(详细)

深入浅出Mybatis从理论到实践(详细)

  • 引言
  • 1. Mybatis介绍
  • 2. Mybatis安装
    • 2.1. 新建maven project工程
    • 2.2. 配置maven地址及文件
    • 2.3. 配置工程jdk
    • 2.4. mybatis及相关依赖及相关配置
      • 2.4.1. 配置打包方式 jar
      • 2.4.2.配置MySql驱动
      • 2.4.3. junit测试
      • 2.4.4. mybatis配置
      • 2.4.5. 日志log4j配置
  • 3. Mybatis工作流程-概述
  • 4. 方式1:使用mybatis自带的方法操作数据库
  • 5. 方式2:使用编写的接口调用sql执行

引言

了解底层:Java开发中对于数据库的操作至关重要,数据库是对数据的存储和处理,如何更高效的操作数据以及有哪些注意点,对于一名合格的开发人员至关重要,接下来我们开始讲解Mybatis,深入浅出的梳理其中的知识。

1. Mybatis介绍

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录。
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

以下是 MyBatis 的一些核心特性:

  1. SQL 映射: MyBatis 允许你在 XML 文件中编写 SQL 语句,或者使用注解直接在接口方法上定义 SQL 语句。

  2. 结果映射: 你可以定义如何将数据库结果集的列映射到 Java 对象的属性中。

  3. 动态 SQL: MyBatis 支持构建动态 SQL,这使得你可以在运行时构建 SQL 语句,例如 if 条件、foreach 循环等。

  4. 事务管理: MyBatis 提供了声明式事务管理,可以很容易地与 Spring 集成。

  5. 缓存机制: MyBatis 提供了一级缓存和二级缓存,以提高性能。

  6. 插件机制: MyBatis 允许你在执行数据库操作的过程中插入自定义的行为。

  7. 与 Spring 集成: MyBatis 可以很容易地与 Spring 框架集成,使用 Spring 的依赖注入和事务管理。

  8. 映射器接口: 你可以定义一个接口,MyBatis 会自动实现这个接口,并创建一个代理对象。

ORM(Object Relationship Mapping)对象关系映射。
对象:Java的实体类对象
关系:关系型数据库
映射:二者之间的对应关系

2. Mybatis安装

Mabatis由于跳槽到github,因此下载是在githab上,Mybatis下载地址下载下来是一个压缩包,java开发本身就是在各种依赖的基础上进行开发,使用其接口进行。实际上我们使用的时候是不用下载的,直接在依赖中引入,交给maven工程帮我们下载,这里只是为了讲解让大家可以看到具体信息。

2.1. 新建maven project工程

IDEA-file-new-project-maven 我们起名叫(mybatis_studing001)
在这里插入图片描述

2.2. 配置maven地址及文件

在这里插入图片描述
在这里插入图片描述

2.3. 配置工程jdk

在这里插入图片描述
在这里插入图片描述

2.4. mybatis及相关依赖及相关配置

在工程中找到pom文件

2.4.1. 配置打包方式 jar

<packaging>jar</packaging>

2.4.2.配置MySql驱动

无论我们用什么框架都是离不开与数据库的交互,也就需要驱动

  <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.3</version></dependency>

2.4.3. junit测试

    <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>

2.4.4. mybatis配置

   <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency>

在mysql中新增加MyBatis数据库
在这里插入图片描述

有了依赖,还需要配置数据库连接地址及其他相关信息,src/main/resources目录下,习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring,之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息。注意:&需要转义

<?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/MyBatis?useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/mybatis/mapper/UserMapper.xml"/></mappers>
</configuration>

2.4.5. 日志log4j配置

为了在代码与数据库交互过程中输出具体的SQL信息,我们配置下日志,这样可以直观的看到数据库的操作信息。

   <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

引入依赖后,还需要配置下log的日志输出级别,log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
</log4j:configuration>

日志的级别
FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
至此,目录结构如下:
在这里插入图片描述

配置完如果依赖有红色,说明我们仓库没有该包,则点击POM右上角的圆圈按钮maven 会自动帮我们下载。点击右侧maven 的 Dependencies 可以看到本工程的依赖包;
在这里插入图片描述
完整的依赖文件

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>mybatis_studing001</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies></project>

3. Mybatis工作流程-概述

  1. 读取配置文件
    -连接数据库的相关信息,如果一个属性存在于下面的多个位置,那么 MyBatis 将按照以下顺序来加载它们:

首先,读取在 properties 元素体中指定的属性;
其次,读取在 properties 元素的类路径 resource 或 url 指定的属性,且会覆盖已经指定了的重复属性;
最后,读取作为方法参数传递的属性,且会覆盖已经从 properties 元素体和 resource 或 url 属性中加载了的重复属性。

因此,通过方法参数传递的属性的优先级最高,resource 或 url 指定的属性优先级中等,在 properties 元素体中指定的属性优先级最低。

 <transactionManager type="JDBC"/> ---事务管理    <dataSource type="POOLED">  ---是否使用连接池,以及连接池的信息 
  1. 生成SqlSessionFactory
    SqlSession工厂,用于与数据库的连接,在一个程序中有一个,程序运行时建立,程序运行时结束;SqlSessionFactoryBuilder
    SqlSessionFactoryBuilder 有五个 build() 方法,每一种都允许你从不同的资源中创建一个 SqlSessionFactory 实例。提示 :当 Mybatis 与一些依赖注入框架(如 Spring 或者 Guice)搭配使用时,SqlSession 将被依赖注入框架创建并注入,
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

举例:

String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
  1. 建立SqlSession
    用于建立数据库会话,进行各种各样的数据库操作,这些操作是有它来进行的。一个SQL操作会创建一个,操作完成后结束,一个程序中会有多个SqlSession。
    SqlSessionFactory 有六个方法创建 SqlSession 实例。通常来说,当你选择其中一个方法时,你需要考虑以下几点:

事务处理:在 session 作用域中使用事务作用域,还是使用自动提交(auto-commit)?(对很多数据库和/或 JDBC 驱动来说,等同于关闭事务支持)
数据库连接: MyBatis 帮你从已配置的数据源获取连接,还是使用自己提供的连接?
语句执行: MyBatis 复用 PreparedStatement 和/或批量更新语句(包括插入语句和删除语句)吗?

创建的几种方法

SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();

默认的 openSession() 方法没有参数,它会创建具备如下特性的 SqlSession:

事务作用域将会开启(也就是不自动提交)。
将由当前环境配置的 DataSource 实例中获取 Connection 对象。
事务隔离级别将会使用驱动或数据源的默认设置。
预处理语句不会被复用,也不会批量处理更新。

  1. 调用Mybatis提供的API
    语句执行方法
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<T> Cursor<T> selectCursor(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
  1. 查询MAP配置
    map 中包含各种sql语句,可以有三种配置方式
 mybatisConfig.xml中引用map文件
<mappers>
<mapperresource="jike/book/map/jikeUser.xm!"/></mappers>
·也可以用绝对路径引用
<mapper url="file:///var/sqlmaps/AuthorMapper.xm!"/>
·还可以使用包路径引用
<package name="com.tiantian.mybatis.mapperinterface"/>
  1. 返回结果
    7.关闭SqlSession

4. 方式1:使用mybatis自带的方法操作数据库

  1. 创建user表并插入一行纪录。
    在这里插入图片描述

  2. 创建包并新建User类,并生成get和set 方法、构造方法、tostring方法,ALT+insert健,添加get 和set 方法,相关代码和结构如下:

package com.mybatis.src;
public class User {private int id;private String userName;private String passWord;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public User(int id, String userName, String passWord) {this.id = id;this.userName = userName;this.passWord = passWord;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", passWord='" + passWord + '\'' +'}';}
}

在这里插入图片描述
3. 创建mapping文件
java类创建好了,数据库也创建好了,现在就是将这两部分映射起来;该配置文件也放入resources目录下,一张表对应一个mapping文件,后面为了增加我们再resources目录下增加结构,且与我们的类所在的包结构一致,注意使用/添加文件夹结构;

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis"><!--test hello;-->
<select id="findById" parameterType="int" resultType="com.mybatis.src.User">
select  * from  user where id =#{id}
</select>
</mapper>

这里我们先建立了一个findById的 查询,用于查询一条记录,建立好后在mybatis-config.xml,引入改映射文件
在这里插入图片描述
4.编写测试类测试

package com.mybatis.src;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 org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;/*** @Auther: lifang* @Description* @Date: $ $* $* $**/
public class UserTest {@Testpublic void testFindById()  {String resource="mybatis-config.xml";Reader reader=null;SqlSession sqlSession;try {reader=Resources.getResourceAsReader(resource);} catch (IOException e) {e.printStackTrace();}SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader) ;sqlSession=sqlSessionFactory.openSession();User user=sqlSession.selectOne("findById",1);System.out.println(user);sqlSession.close();}
}

运行后的效果
在这里插入图片描述

5. 方式2:使用编写的接口调用sql执行

典型的面向接口编程

  1. 编写UserMapper接口
public interface UserMapper {User findById(int id);
}
  1. mapping文件
<mapper namespace="com.mybatis.src.mapper.UserMapper">

a>mapper接口的全类名和映射文件的命名空间(namespace)保持一致
b>mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

  1. 编写测试类测试
@Testpublic void testFindById2(){String resource="mybatis-config.xml";Reader reader=null;SqlSession sqlSession;try {reader=Resources.getResourceAsReader(resource);} catch (IOException e) {e.printStackTrace();}SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader) ;sqlSession=sqlSessionFactory.openSession();//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user=userMapper.findById(1);System.out.println(user);sqlSession.close();}

另外一种创建session模式

 @Testpublic void testFindById3() {//读取MyBatis的核心配置文件InputStream is = null;try {is = Resources.getResourceAsStream("mybatis-config.xml");} catch (IOException e) {e.printStackTrace();}
//创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = newSqlSessionFactoryBuilder();
//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
//SqlSession sqlSession = sqlSessionFactory.openSession();
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配//映射文件中的SQL标签,并执行标签中的SQL语句User user=userMapper.findById(1);System.out.println(user);sqlSession.close();}

在这里插入图片描述

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

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

相关文章

Oh My Posh安装

nullSet up your terminalhttps://ohmyposh.dev/docs/installation/windows Git ee oh-my-posh: Windows上的oh-my-zsh&#xff0c;源地址 https://github.com/JanDeDobbeleer/oh-my-posh.git (gitee.com)https://gitee.com/efluent/oh-my-posh

MySQL 安装

所有平台的 MySQL 下载地址为&#xff1a; MySQL 下载 。 挑选你需要的 MySQL Community Server 版本及对应的平台。 注意&#xff1a;安装过程我们需要通过开启管理员权限来安装&#xff0c;否则会由于权限不足导致无法安装。 Linux/UNIX 上安装 MySQL Linux平台上推荐使用RP…

Stable Diffusion Web UI - ControlNet 景深 Depth

Depth 的使用场景为建筑类型带有景深的场景&#xff0c;同样的针对人物也可以&#xff0c;不过 Depth 会限制人物的绘画时的自由发挥范围。 通过 Depth 可以得到类似如下的结果 从上图结果&#xff0c;可以看到&#xff0c;通过 Depth 来控制图片生成&#xff0c;整体图片的结…

UE5 随机生成地牢关卡

参考视频&#xff1a;【UE5 | 教程 | 地编】虚幻引擎5 中创建史诗级 程序化 地下城_哔哩哔哩_bilibili 首先创建一个父项Actor 这个BOX碰撞提是和地板重叠的 这三个是场景组件&#xff0c;这个ExitsFolder下面的箭头等会会在子蓝图中添加 接下来创建BP_MasterRoom的子蓝图&…

计算机网络:网络层 —— 软件定义网络 SDN

文章目录 软件定义网络 SDN远程控制器OpenFlow协议SDN 广义转发流表简单转发负载均衡防火墙 SDN 控制器 软件定义网络 SDN 软件定义网络&#xff08;Software Defined Networking&#xff0c;SDN&#xff09;是一种新兴的网络架构&#xff0c;旨在通过网络控制与数据转发的分离…

软件技术求职简历「优选篇」

【#软件技术简历#】一份精心撰写的简历是增加获得心仪职位的机会。那么&#xff0c;如何才能写出一份既全面又吸引人的软件技术简历呢&#xff1f;以下是幻主简历整理的软件技术简历「优选篇」&#xff0c;欢迎大家阅读收藏&#xff01; 软件技术简历范文&#xff1a; 求职意向…

MQTT实用示例集:Air201版

今天贴出的是Air201版关于MQTT实用示例集&#xff0c;希望大家喜欢。 本示例教你通过使用脚本代码&#xff0c;对Air201模组进行MQTT链接操作。 操作例程包括&#xff1a; MQTT单链接 MQTT多链接 MQTT SSL不带证书链接 MQTT SSL带证书链接 大家可根据自身需求&#xff0c…

ip地址跟路由器有关吗?更换路由器ip地址会变吗

IP地址与路由器之间的关系是一个涉及计算机网络基础知识的话题。在深入探讨这个问题之前&#xff0c;我们首先需要理解IP地址的基本概念以及它在家庭和企业网络中的作用。 IP地址&#xff0c;即互联网协议地址&#xff0c;是分配给网络上的每个设备的数字标签&#xff0c;用于…

CSS综合练习

该综合练习就是为这个静态网页设置CSS样式&#xff0c;使其变成下面的模样 设置CSS样式前&#xff1a; 设置CSS样式后&#xff1a; 其骨架为&#xff1a; <body><div class"qwq"><img src"top.jpg" alt""></div><d…

神经网络基础--什么是神经网络?? 常用激活函数是什么???

前言 本专栏更新神经网络的一些基础知识&#xff1b;案例代码基于pytorch&#xff1b;欢迎收藏 关注&#xff0c; 本人将会持续更新。 神经网络 1、什么是神经网络 人工神经网络&#xff08; Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络…

《AI大模型对软件开发流程的重塑:变革、优势、挑战与展望》

《AI大模型对软件开发流程的重塑&#xff1a;变革、优势、挑战与展望》 一、传统软件开发流程与模式&#xff08;一&#xff09;传统软件开发流程&#xff08;二&#xff09;传统软件开发模式面临的问题&#xff08;一&#xff09;AI在软件开发中的应用场景&#xff08;二&…

初识C++(上) -- C++的关键字、命名空间、缺省参数以及函数的重载

目录 一、C的关键字&#xff08;C98&#xff09; 二、命名空间 1、命名冲突 2、命名空间 2.1 命名空间的定义 (1). 命名空间定义的例子以及命名空间的嵌套&#xff1a; (2). 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中&#xff1a; 2…

template和span标签的使用

一&#xff1a;template template是模板占位符&#xff0c;可帮助我们包裹元素&#xff0c;而且循环过程当中&#xff0c;template不会被渲染到页面。 <div>ABC</div> <template v-for"(item, index) in 5"><div>{{ index }}</div>&…

Oracle视频基础1.4.4练习

1.4.4 [dbs] 删干净上次创建的bbk ll rm -f *dbf ll rm -f spfilebbk.ora clear ll创建bbk的pfile&#xff0c;准备对应的目录 ll strings spfilewilson.ora | more strings spfilewilson.ora > initbbk.ora :%s/wilson/bbk :%s/*\.//g :wq ll vi initbbk.ora####### 创…

C# 选择导入文件的路径、导出文件的路径

通过C#代码&#xff0c;调出windows风格的文件选择对话框和存储文件对话框。提供界面来选择文件的位置&#xff0c;并将完整路径以字符串形式返回。 1、选择导入文件&#xff0c;获取其路径 C#通过这段代码将弹出一个文件选择对话框&#xff0c;允许用户选择一个文件&#xff…

孤岛的总面积(Dfs C#

卡码网 101题 力扣第 1254. 统计封闭岛屿的数目 也是一样的 差不多是一道题 101. 孤岛的总面积 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域&…

论文解读 P2《Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey》

论文解读系列文章目录 文章目录 论文解读系列文章目录一、图中公式什么意思&#xff1f;二、“早期的基于匹配和密集嵌入相似性的方法&#xff0c;逐步发展到可学习的检索技术和预训练语言模型&#xff08;PLM&#xff09;生成技术”什么意思&#xff1f;三、在从问题&#xff…

http请求响应详解

http介绍 http协议&#xff1a; Http”协议称为是“超文本传输协议”&#xff08;HTTP-Hypertext transfer protocol&#xff09;。它定义了浏览器怎么向万维网服务器请求万维网文档&#xff0c;以及服务器怎么样把文档传送给浏览器。 https协议&#xff1a; 传统的HTTP协议…

mysql5安全审计

安装插件 插件需要严格与数据库版本适配&#xff0c;不然安装过程中会出现问题 解压插件 cd 插件所在路径unzip audit-plugin-mysql-5.7-1.1.7-921-linux-x86_64.zip#查看mysql默认插件目录 mysql> SHOW GLOBAL VARIABLES LIKE plugin_dir;# 将插件移动到mysql默认插件目…

一文解秘Rust如何与Java互操作

本博客所有文章除特别声明外&#xff0c;均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 唯你 使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情&#xff0c;而 Java 也可以享受 Rust 语言特性的内存安全&#xff0c;所有权机制&#xff0c;无畏并发。…