• MyBatis开荒


    一.Mybatis简介

    最初是一个Apache的开源项目iBatis,2010年迁移至了Google Code,从3.x开始 更名为MyBatis,2013年迁移至GitHub
    iBatis == internet + abatis
    是一个基于java的持久层框架,提供 SQL Maps & Data Access Object(DAO)

    1.2 Mybatis特性

    • 支持定制化SQL 存储过程 高级映射
    • 避免了JDBC & 手动设计参数
    • 用xml & 注解 配置和原始数据的映射,将interface & POJO(Plain Old Java Obeject, 普通java对象)映射
    • 半自动ORM(Object Relation Mapping)框架

    二. start

    IDE:idea 2019.2
    构建工具:maven 3.5.4
    MySQL版本:MySQL 8
    MyBatis版本:MyBatis 3.5.7

    2.1 maven

    首先创建主工程SSM,
    再添加子工程MyBatis
    在这里插入图片描述

    指定打包方式

    可以直接在主工程中添加这个打包方式

        jar
    
    • 1

    在maven中指定打包的方式

    引入依赖

    
        org.mybatis
        mybatis
        3.5.7
    
    
        
    
        junit
        junit
        4.12
        test
    
    
        
    
        mysql
        mysql-connector-java
        8.0.16
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.2 创建MyBatis核心配置文件

    src/main/resource

    在这里插入图片描述

    用于配制数据库连接环境 & Mybatis 全局配置信息

    习惯上命名为mybatis-config.xml

    
    
    
    
        
            
                
                
                    
                    
                    
                    
                
            
    
        
    
    
        
            
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2.3 创建Mapper接口

    相当于之前的dao
    区别:mapper仅仅是interface ,不需要实例化

    public interface UserMapper {
    /**
    * 添加用户信息 */
        int insertUser();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.4 创建Mybatis的映射文件

    ORM:Object Releationship Mapping 对象映射关系

    • obejct:java中的实体类对象
    • relationship:关系型DB
    • mapping:映射关系
    Java概念数据库概念
    属性字段/列
    对象记录/行

    1、映射文件的命名规则:
    表所对应的实体类的类名+Mapper.xml
    例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
    因此一个映射文件对应一个实体类,对应一张表的操作 MyBatis映射文件用于编写SQL,访问以及操作表中的数据 MyBatis映射文件存放的位置是src/main/resources/mappers目录下
    2、 MyBatis中可以面向接口操作数据,要保证两个一致:

    • mapper接口的全类名和映射文件的命名空间(namespace)保持一致
    • mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
    
    
    
    
    
    
    
        
            insert into User (username,password,age,gender,email) values('admin2','123456',23,'男','12345@qq.com')
        
    
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    DB ready

    CREATE TABLE `User` (
      `id` BIGINT(19) AUTO_INCREMENT primary key NOT NULL,
      `username` VARCHAR(64) NOT NULL,
      `password` VARCHAR(64) NOT NULL,
      `age` VARCHAR(64) NOT NULL,
      `gender` VARCHAR(64) NOT NULL,
      `email` VARCHAR(64) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.5 junit Test

    package org.example.mybatis.test;
    
    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.example.mybatis.mapper.UserMapper;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class MybatisTest {
    
        @Test
        public void testInsert() throws IOException {
            //TODO 1 获取核心配置文件的输入流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //TODO 2 sqlSessionFactoryBuilder 对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //TODO 3 获取SqlSessionBuilder 对象
            SqlSessionFactory SqlSessionBuilder = sqlSessionFactoryBuilder.build(is);
            //TODO 4 获取sqlSession,是Mybatis提供的操作数据库表的对象
    //        SqlSession sqlSession = SqlSessionBuilder.openSession(); 不会自动提交
            SqlSession sqlSession = SqlSessionBuilder.openSession(true);
            //TODO 5 获取UserMapper接口的实现类对象 (代理模式)
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //TODO 6 调用mapper接口中的方法,实现添加用户信息的功能
            int result = mapper.insertUser();
            
    	 //TODO 7 也可以直接用sqlSession 通过唯一标识(namespace.sqlId) 来找到sql
            int result2 = sqlSession.insert("org.example.mybatis.mapper.UserMapper.insertUser");
    
    
            System.out.println("result = " + result);
            System.out.println("result2 = " + result2);
            sqlSession.commit();//提交事务
            sqlSession.close();
    
    
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    2.6 log4j

    resource/log4j.xml

    
    
    
        
            
            
                
            
        
        
            
        
        
            
        
        
            
            
        
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    日志的级别
    FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试) 从左到右打印的内容越来越详细

    2.7 SqlSessionUtil

    package org.example.mybatis.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 SqlSessionUtil {
    
        public static SqlSession getSqlSession(){
            SqlSession sqlSession = null;
            try {
                //获取核心配置文件的输入流
                InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
                //获取sqlSessionFactoryBuilder
                SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                //获取sqlSessionFactory
                SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
                //获取sqlSession 对象
                sqlSession = sqlSessionFactory.openSession(true);
    
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
    
            return sqlSession;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
        @Test
        public void testUpdate(){
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.updateUser();
            sqlSession.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.8 getUser

    
    
    
        
    
        
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    三.配置文件

    The content of element type "configuration" must match "
    (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,
    objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
    
    • 1
    • 2
    • 3

    3.1 properties

    在这里插入图片描述

    可以将一些基本的 username password 配置到 jdbc.properties中,然后在
    mybatis-config.xml中进行引用
    就需要用到了 properties标签

    
        
        
     
    
    • 1
    • 2
    • 3
    • 4

    3.2 typeAliases

    在这里插入图片描述
    在 UserMapper.xml中 ,这个resultType 用全类名难免有点繁琐
    可以在 mybatis-config.xml 中起别名

    
        
    
            
    
            
    
            
    
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    3.3 mappers.package

    批量引入mapper

    
        
    
    
    
           
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    3.4 在idea中创建模版

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

    四 . 传入参数

    但个参数,名字随便写
    • ${} 的本质 字符串拼接
      若为字符串类型或日期类型的字段进行赋值,需要手动加单引号

    • #{} 的本质 占位符赋值
      为字符串或日期类型的字段进行赋值,会自动加单引号

    
        
    
    • 1
    • 2
    • 3
    • 4
    多个参数

    mapper 接口有多个接口,Mybatis会将参数放到map 集合中,以两种方式存储数据

    arg0 , arg1
    param1 , param2

    在这里插入图片描述

    自定义map

    手动放入集合,可以通过自己定义的key访问

        List checkLoginByMap(Map map);
    
    • 1

    在这里插入图片描述

        @Test
        public void testCheckLoginByMap(){
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            HashMap map = new HashMap<>();
            map.put("username","admin2");
            map.put("password","123456");
    
            List users = mapper.checkLoginByMap(map);
            Iterator iterator = users.iterator();
            while (iterator.hasNext()){
                User next = iterator.next();
                System.out.println(next);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    插入User类

    直接访问属性名

    采用@param注解
    
    
        
    
    • 1
    • 2
    • 3
    • 4
    • 5

    相当于指定 map 的key

    4.2 查询结果toMap

    方式一

    /**
    * 查询所有用户信息为map集合
    * @return
    * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此 时可以将这些map放在一个list集合中获取
    */
    List> getAllUserToMap();
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方式二

    
    /**
    * 查询所有用户信息为map集合
    * @return
    * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并 且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的 map集合
    */
    @MapKey("id")
    Map getAllUserToMap();
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4.3 模糊查询

    /**
    * 测试模糊查询 * @param mohu * @return
    */
    List testMohu(@Param("mohu") String mohu);
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.4 动态设置表名

    
    /**
    * 动态设置表名,查询所有的用户信息 * @param tableName
    * @return
    */
    List getAllUser(@Param("tableName") String tableName);
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.自定义ResultMp

    CREATE TABLE MyBatis.t_emp (
    	emp_id  BIGINT(19)  AUTO_INCREMENT primary key NOT NULL,
    	emp_name varchar(100) NULL,
    	age INT NULL,
    	gender varchar(100) NULL,
    	dept_id INT NULL
    )
    ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_0900_ai_ci;
    
    
    CREATE TABLE MyBatis.t_dept (
    	dept_id  BIGINT(19)  AUTO_INCREMENT primary key NOT NULL,
    	dept_name varchar(100) NULL
    )
    ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_0900_ai_ci;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    问题分析
    字段名 和 属性名字 不一致的情况
    在这里插入图片描述
    如何处理这种关系

    5.1 字段名alias ,和属性名字一致

    5.2 核心配置文件

    当字段名符合MySQL的要求 _ , 属性名 驼峰,可以在mybatis的核心配置文件设置一个全局配置,可以将 _ 自动映射为驼峰

    在这里插入图片描述

    5.3 ResultMap来实现

    resultType 写的是一个具体的类型
    resultMap 写的是一个自定义的映射关系

    
        
            
            
            
            
        
    
        
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5.3.1 多对一映射处理

    在emp中加入dept 属性

    
        
        
        
        
        
        
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.3.2 使用association处理映射关系

    
        
        
        
        
        
        
            
            
        
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5.3.3 使用分步查询

    • 查询员工信息
    /**
    * 通过分步查询查询员工信息 * @param eid
    * @return
    */
    Emp getEmpByStep(@Param("eid") int eid);
    
        
        
        
        
        
        
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 查询到的dept_id 到 dept表中查询
    /**
    * 分步查询的第二步: 根据员工所对应的did查询部门信息 * @param did
    * @return
    */
    Dept getEmpDeptByStep(@Param("did") int did);
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
        
            
            
            
            
                
            
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.4 延迟加载

    分步查询的优点:可以实现延迟加载
    但是必须在核心配置文件中设置全局配置信息:
    lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
    aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属 性会按需加载
    此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和 collection中的fetchType属性设置当前的分步查询是否使用延迟加载, fetchType=“lazy(延迟加 载)|eager(立即加载)”

    5.5 多对一映射处理

    在resultMap中进行设置

            
                
                
                
                
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    也可以通过分步查询来解决

    六.动态SQL

    根据特定条件,动态拼装SQL语句的功能

    6.1 if

    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.2 where

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6.3 foreach

    批量添加 批量删除

    
        
            insert into t_emp (emp_name,age,gender,dept_id) values
            
                ('admin2',23,'男',1)
                (#{emp.empName},#{emp.age},#{emp.gender})
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
        @Test
        public void testInsertMoreEmp(){
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            Emp emp1 = new Emp(null, "Tom1", 20, "男");
            Emp emp2 = new Emp(null, "Tom2", 20, "男");
            Emp emp3 = new Emp(null, "Tom3", 20, "男");
            List emps = Arrays.asList(emp1, emp2, emp3);
            int i = mapper.insertMoreEmp(emps);
            System.out.println("result = " + i);
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.4 SQL片段

    
        eid,ename,age,sex,did
    
    select  from t_emp
    
    • 1
    • 2
    • 3
    • 4

    七. 逆向工程

    正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。

    逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:

    • Java实体类
    • Mapper接口
    • Mapper映射文件

    7.1 添加依赖和插件

    
    
        
            org.mybatis
            mybatis
            3.5.7
        
     
            junit
            junit
            4.12
            test
        
     
    
            log4j
            log4j
            1.2.17
        
        
            mysql
            mysql-connector-java
            8.0.16
        
    
     
     
     
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.0
     
     
                        org.mybatis.generator
                        mybatis-generator-core
                        1.3.2
                    
     
                        mysql
                        mysql-connector-java
                        8.0.16
                    
                
            
        
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    7.2 创建逆向工程的配置文件

    名字必须是 generatorConfig.xml

    
    
    
        
        targetRuntime: 执行生成的逆向工程的版本 MyBatis3Simple: 生成基本的CRUD(清新简洁版) MyBatis3: 生成带条件的CRUD
        
            
    
        
        
    
    
    
    
        
        
            
             
        
        
            
        
        
        
             
        
         
        
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

    八. 分页插件

    limit index,pageSize
    pageSize:每页显示的条数
    pageNum:当前页的页码 index:当前页的起始索引,index=(pageNum-1)*pageSize count:总记录数
    totalPage:总页数
    totalPage = count / pageSize;
    if(count % pageSize != 0){
    totalPage += 1;
    }
    pageSize=4,pageNum=1,index=0 limit 0,4 pageSize=4,pageNum=3,index=8 limit 8,4 pageSize=4,pageNum=6,index=20 limit 8,4
    首页 上一页 2 3 4 5 6 下一页 末页

    8.1 配置插件

    8.1.1 添加依赖

    
        com.github.pagehelper
        pagehelper
        5.2.0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    8.1.2 在核心配置文件中配置

        
            
            
        
    
    • 1
    • 2
    • 3
    • 4

    8.2 使用分页

        @Test void testPage(){
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //查询之前开启分页功能
            Page list = PageHelper.startPage(1, 4);
            List users =  mapper.selectByExample(null);
    
            //查询之后可以获取分页相关的所有数据
            PageInfo userPageInfo = new PageInfo<>(users, 5);
            
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    可以根据这个userPageInfo 做更多的处理,提供的方法如下

    PageInfo{
    pageNum=8, pageSize=4, size=2, startRow=29, endRow=30, total=30, pages=8, list=Page{count=true, pageNum=8, pageSize=4, startRow=28, endRow=32, total=30, pages=8, reasonable=false, pageSizeZero=false},
    prePage=7, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true, hasNextPage=false, navigatePages=5, navigateFirstPage4, navigateLastPage8, navigatepageNums=[4, 5, 6, 7, 8]
    }
    pageNum:当前页的页码
    pageSize:每页显示的条数
    size:当前页显示的真实条数
    total:总记录数
    pages:总页数
    prePage:上一页的页码
    nextPage:下一页的页码
    isFirstPage/isLastPage:是否为第一页/最后一页 hasPreviousPage/hasNextPage:是否存在上一页/下一页 navigatePages:导航分页的页码数
    navigatepageNums:导航分页的页码,[1,2,3,4,5]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    如何一站式解决跨境电商难题?
    基于AntDesign vue的自定义文件上传
    CAD进阶练习(四)
    qps、tps、吞吐量
    Java学习笔记——34多线程01
    Java网络编程
    parquet-go的CSVWriter
    Leetcode 2876. Count Visited Nodes in a Directed Graph
    y92.第六章 微服务、服务网格及Envoy实战 -- Envoy基础(三)
    ViTPose+:迈向通用身体姿态估计的视觉Transformer基础模型
  • 原文地址:https://blog.csdn.net/weixin_39381833/article/details/125906129