Mybatis 框架 ( 一 ) 基本步骤

1.概念

1.1.什么是Mybatis框架

(1)Mybatis是一个半ORM(Object Relation Mapping 对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)

1.2.Mybatis框架与JDBC区别

两者都是持久化的技术

连接数据库时 : mybatis 使用了 连接池技术 , 而jdbc需要自己写

持久化操作时 : mybatis 在映射文件中集中管理SQL语句 , 并且支持动态SQL
通常使用Mapper接口封装成面向对象的语法
而JDBC中的SQL是以参数的形式传入

结果集封装 : mybatis 封装了过程 , 只要指明对应结构就可以 , 而JDBC全手动

1.3.Mybatis框架与Hibernate框架区别

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

2.步骤

在这里插入图片描述

相较于JDBC来说, Mybatis完成持久化操作也分4个步骤, 需要七个参数

4个步骤 : 连接数据库, 持久化操作, 结果集封装, 释放资源

7个参数 : 驱动类路径, 连库信息, 用户名, 密码, SQL语句, SQL参数, 结果集封装结构

2.0.在idea中创建 Maven项目

2.1.依赖包

通过Maven 导入依赖, 同时导入 MySQL数据库的驱动依赖

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

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

2.2.增加配置文件( 4/7参数 )

在 resources 文件夹中增加Mybatis的配置文件 mybatis-config.xml

在文件中 指明连接数据库的 4 个信息 驱动类路径, url, 用户名, 密码

<?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>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/metamooc"  />
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
</configuration>

2.3.连接数据库( 1/4 操作)

建立一个操作类, 增加连接数据库代码

  // 读取myBatis的配置文件
  Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
  // 创建SessionFactory工厂 与数据库建立 连接  conn
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

2.4.Mapper映射 ( 3/7 参数 , 1/4 操作)

2.4.1.实体类Entity

实体类Entity 用于封装数据, 通常与数据库的表对应 , 这里以 Teacher为例

import java.io.Serializable;
import java.util.Date;

/**
 * 教师  teacher
 * @TableName teacher
 */

public class Teacher implements Serializable {
    /**
     * 讲师主键
     */
    private Integer tchId;

    /**
     * 讲师姓名
     */
    private String tchName;

    /**
     * 讲师介绍
     */
    private String tchInfo;

    /**
     * 讲师性别
     */
    private Integer tchSex;

    /**
     * 讲师注册时间
     */
    private Date tchRegTime;

    /**
     * 讲师头像
     */
    private String tchPic;

    /**
     * 登录账号
     */
    private String tchUser;

    /**
     * 登录密码
     */
    private String tchPass;


    @Override
    public String toString() {
        return "Teacher{" +
                "tchId=" + tchId +
                ", tchName='" + tchName + '\'' +
                ", tchInfo='" + tchInfo + '\'' +
                ", tchSex=" + tchSex +
                ", tchRegTime=" + tchRegTime +
                ", tchPic='" + tchPic + '\'' +
                ", tchUser='" + tchUser + '\'' +
                ", tchPass='" + tchPass + '\'' +
                '}';
    }

    public Integer getTchId() {
        return tchId;
    }

    public void setTchId(Integer tchId) {
        this.tchId = tchId;
    }

    public String getTchName() {
        return tchName;
    }

    public void setTchName(String tchName) {
        this.tchName = tchName;
    }

    public String getTchInfo() {
        return tchInfo;
    }

    public void setTchInfo(String tchInfo) {
        this.tchInfo = tchInfo;
    }

    public Integer getTchSex() {
        return tchSex;
    }

    public void setTchSex(Integer tchSex) {
        this.tchSex = tchSex;
    }

    public Date getTchRegTime() {
        return tchRegTime;
    }

    public void setTchRegTime(Date tchRegTime) {
        this.tchRegTime = tchRegTime;
    }

    public String getTchPic() {
        return tchPic;
    }

    public void setTchPic(String tchPic) {
        this.tchPic = tchPic;
    }

    public String getTchUser() {
        return tchUser;
    }

    public void setTchUser(String tchUser) {
        this.tchUser = tchUser;
    }

    public String getTchPass() {
        return tchPass;
    }

    public void setTchPass(String tchPass) {
        this.tchPass = tchPass;
    }
}

2.4.2.Mapper接口

对 要执行的SQL 进行抽象声明

import com.yuan.mybatis.entity.Teacher;

import java.util.List;

/**
* @description 针对表【teacher(教师  teacher)】的数据库操作Mapper
* @Entity com.yuan.mybatis.entity.Teacher
*/
public interface TeacherMapper  {

    /**
     *  全查
     */
    List<Teacher> selectList();

    /**
     * 添加
     */
    int insert(Teacher teacher);

    /**
     * 修改
     */
    int updateById(Teacher teacher);

    /**
     * 根据id 删除记录
     */
    int removeById(Integer id);

    /**
     * 根据id 查询一条记录
     */
    Teacher selectOneById(Integer tchId);
    
    /**
     * 查询指定表的记录数
     */
    int selectCount(String tabName);
    
    /**
     * 根据tch_user, tch_pass 查询一条记录
     */
    Teacher selectOneByUserNameAndPassword(@Param("userName") String name, @Param("password") String pass);



}

2.4.3. ***映射文件

在 resources 文件夹下 mapper 文件夹中 增加 Mapper接口对应的映射文件 TeacherMapper.xml

其中(重点) :

2.4.3.1. namespace

根结点 mapper 的 namespace 属性 指向 Mapper 接口

<mapper namespace="com.yuan.mybatis.mapper.TeacherMapper">

2.4.3.2.resultMap

<resultMap> 结点 与 Entity 实体类 对应 , 通过 type 属性 对应类的路径

<id> 对应 主键 字段, <result> 为普通字段

property 对应 实体类的属性名 , column 对应 字段名 , jdbcType 对应类型(这个可以不写)

    <resultMap id="BaseResultMap" type="com.yuan.mybatis.entity.Teacher">
            <id property="tchId" column="tch_id" jdbcType="INTEGER"/>
            <result property="tchName" column="tch_name" jdbcType="VARCHAR"/>
            <result property="tchInfo" column="tch_info" jdbcType="VARCHAR"/>
            <result property="tchSex" column="tch_sex" jdbcType="BOOLEAN"/>
            <result property="tchRegTime" column="tch_reg_time" jdbcType="TIMESTAMP"/>
            <result property="tchPic" column="tch_pic" jdbcType="VARCHAR"/>
            <result property="tchUser" column="tch_user" jdbcType="VARCHAR"/>
            <result property="tchPass" column="tch_pass" jdbcType="VARCHAR"/>
    </resultMap>

2.4.3.3.SQL语句

<insert> , <delete> , <update> , <select> 是用来编写 对应SQL 语句

id 与 Mapper接口 中声明的 方法名 对应

#{属性} 在SQL语句中作属性占位符, 执行时替换成对应值, 值是从Mapper接口传入的参数对应

​ 如果传入是实体类, 属性取类的属性

 <update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">
        update teacher
        set tch_name = #{tchName},
            tch_info = #{tchInfo},
            tch_sex = #{tchSex},
            tch_reg_time = #{tchRegTime},
            tch_pic = #{tchPic},
            tch_user = #{tchUser},
            tch_pass = #{tchPass}
        where tch_id = #{tchId}
    </update>

​ 如果传入是单个值, 可以用类型如: list , array , id 等, 或者与参数名相同

    <delete id="removeById" parameterType="java.lang.Integer">
        delete from teacher
        where tch_id = #{id}
    </delete>

​ 如果传入多个参数 , 对应的方法有多种, 推荐在传参时使用@Param("别名") 进行标注(这个可以不写)

    <select id="selectOneByUserNameAndPassword"  resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from teacher
        where  tch_user = #{userName} and tch_pass = #{password}
        limit 1
    </select>

${值} 也是属性占位符, 直接替换为实际的参数值, 没有预编译效果,

​ 只用于与参数无关的字符类型数据, 所以代表字符串时要用 单引号包围起来 '${}'

​ #{} 只能以预编译的形式为属性赋值 , 而 ${} 可以替代SQL语句中的表名, 字段名等结构信息

    <select id="selectCount" resultType="java.lang.Integer" >
        select count(*)
        from ${tabName}
    </select>

2.4.3.4.delete, update

<delete> , <update> 这两个结点是用来编写 删除, 更新 对应SQL语句的

parameterType 属性 指明传入参数类型(这个可以不写)

 <update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">
        update teacher
        set tch_name = #{tchName},
            tch_info = #{tchInfo},
            tch_sex = #{tchSex},
            tch_reg_time = #{tchRegTime},
            tch_pic = #{tchPic},
            tch_user = #{tchUser},
            tch_pass = #{tchPass}
        where tch_id = #{tchId}
    </update>

2.4.3.5.insert

<insert> 用于编写插入SQL语句

​ 通常MySQL数据库主键设置成 自增长, 在添加之前不知道具体值, 通过下面的三个属性, 在添加完成后立刻可以通过实体类得到值

keyColumn=“主键字段” keyProperty=“对应实体类属性” useGeneratedKeys=“使用生成的主键, 选 : true”

   <insert id="insert" keyColumn="tch_id" keyProperty="tchId"
            parameterType="com.yuan.mybatis.entity.Teacher" useGeneratedKeys="true">
        insert into teacher (tch_name, tch_info, tch_sex,tch_reg_time, tch_pic, tch_user,tch_pass)
        values (#{tchName}, #{tchInfo}, #{tchSex},#{tchRegTime}, #{tchPic}, #{tchUser}, #{tchPass})
    </insert>

2.4.3.6.SQL片段

<sql> 编写 可复用的SQL语句片段,

​ 在其它语句中 通过 <include> 进行引入 refidid 属性对应

  <sql id="Base_Column_List">
        tch_id,tch_name,tch_info,
        tch_sex,tch_reg_time,tch_pic,
        tch_user,tch_pass
    </sql>
    <select id="selectList" resultMap="BaseResultMap" >
        select <include refid="Base_Column_List"/>
        from teacher
    </select>
    

2.4.3.7.select

<select> 用于编写查询SQL语句 , 通过 指定返回值类型完成结果集封装

resultMap 属性 是用于指明返回的实体类 , 与 <resultMap> 结点的 id 属性对应

    <select id="selectOneById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from teacher
        where tch_id = #{tchId}
    </select>

resultType属性 也是用于指明返回值类型, 用于指明除 实体类以外的通用类型

    <select id="selectCount" resultType="java.lang.Integer" >
        select count(*)
        from ${tabName}
    </select>

2.4.3.8.完整文件

<?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.yuan.mybatis.mapper.TeacherMapper">

    <resultMap id="BaseResultMap" type="com.yuan.mybatis.entity.Teacher">
            <id property="tchId" column="tch_id" jdbcType="INTEGER"/>
            <result property="tchName" column="tch_name" jdbcType="VARCHAR"/>
            <result property="tchInfo" column="tch_info" jdbcType="VARCHAR"/>
            <result property="tchSex" column="tch_sex" jdbcType="BOOLEAN"/>
            <result property="tchRegTime" column="tch_reg_time" jdbcType="TIMESTAMP"/>
            <result property="tchPic" column="tch_pic" jdbcType="VARCHAR"/>
            <result property="tchUser" column="tch_user" jdbcType="VARCHAR"/>
            <result property="tchPass" column="tch_pass" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        tch_id,tch_name,tch_info,
        tch_sex,tch_reg_time,tch_pic,
        tch_user,tch_pass
    </sql>
    <select id="selectList" resultMap="BaseResultMap" >
        select <include refid="Base_Column_List"/>
        from teacher
    </select>
    
    <select id="selectOneById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from teacher
        where tch_id = #{tchId}
    </select>
    
    <select id="selectCount" resultType="java.lang.Integer" >
        select count(*)
        from ${tabName}
    </select>
    
    <delete id="removeById" parameterType="java.lang.Integer">
        delete from teacher
        where tch_id = #{id}
    </delete>
    
    <insert id="insert" keyColumn="tch_id" keyProperty="tchId"
            parameterType="com.yuan.mybatis.entity.Teacher" useGeneratedKeys="true">
        insert into teacher (tch_name, tch_info, tch_sex,tch_reg_time, tch_pic, tch_user,tch_pass)
        values (#{tchName}, #{tchInfo}, #{tchSex},#{tchRegTime}, #{tchPic}, #{tchUser}, #{tchPass})
    </insert>

    <update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">
        update teacher
        set tch_name = #{tchName},
            tch_info = #{tchInfo},
            tch_sex = #{tchSex},
            tch_reg_time = #{tchRegTime},
            tch_pic = #{tchPic},
            tch_user = #{tchUser},
            tch_pass = #{tchPass}
        where tch_id = #{tchId}
    </update>

</mapper>

2.4.4.在配置文件中声明

在 Mybatis的主配置文件中, 增加映射文件的声明

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/metamooc"  />
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
	<!-- 映射声明 -->
    <mappers>
        <mapper resource="mapper/TeacherMapper.xml"></mapper>
    </mappers>
</configuration>

2.5.持久化操作( 1/4 操作)

持久化操作先要得到 SqlSession实例,

再得到Mapper接口的实例,

// 取出一个session 得到对数据持久化操作的句柄  stmt
SqlSession session = sqlSessionFactory.openSession();
// 通过session得到Mapper, 再通过 Mapper对象调用方法完成持久化操作
TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);

通过实例调用方法完成持久化操作 如:

// 插入数据 
int insert = teacherMapper.insert(teacher);
// 查询数据
 List<Teacher> list = teacherMapper.selectList();

2.5.1.事务提交

进行 插入数据, 修改数据, 删除数据时 要手动处理事务

如果操作没有问题 提交事务, 出现问题 事务回滚

// 提交
session.commit();
// 或者 回滚       
session.rollback();

2.6.释放资源(1/4 操作)

由于 连接数据库时 使用连接池, 所以只需要释放session实例

// 关闭 session
session.close();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【工具使用】- git实现gitee托管代码以及检出代码

1. 下载Git工具 git下载地址1&#xff1a;https://git-scm.com/download/win git下载2&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/github-release/git-for-windows/git/Git%20for%20Windows%202.40.1/ 下载完成后安装 安装直接执行exe可执行程序&#xff0c;下一步…

Packet Tracer - 配置 RIPv2

Packet Tracer - 配置 RIPv2 目标 第 1 部分&#xff1a;配置 RIPv2 第 2 部分&#xff1a;验证配置 拓扑图 背景信息 尽管在现代网络中极少使用 RIP&#xff0c;但是作为了解基本网络路由的基础则十分有用。 在本活动中&#xff0c;您将使用适当的网络语句和被动接口配置…

【Java笔试强训 24】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;年终奖 …

VC++ | MFC应用程序设计:框架搭建

VC | MFC应用程序设计&#xff1a;框架搭建 时间&#xff1a;2023-05-01 文章目录 VC | MFC应用程序设计&#xff1a;框架搭建1.启动程序2.新建项目2-1.新建项目2-2.应用程序类型2-3.文档模板属性2-4.用户界面功能2-5.高级功能选项2-6.生成的类2-7.解决方案资源管理器 3.工程文…

springboot websocket通信

目录 一、websocket是什么 二、实现websocket 2.1参考学习b站资料&#xff08;一定要看&#xff0c;前后端详细&#xff09; 2.2学习配套代码 一、websocket是什么 WebSocket_ohana&#xff01;的博客-CSDN博客 二、实现websocket 2.1参考学习b站资料&#xff08;一定要看…

Java 数组在内存中的结构是怎样的?数组访问、遍历、复制、扩容、缩容如何编写代码?

Java是一门面向对象的编程语言&#xff0c;数组是其中的重要数据结构之一。在Java中&#xff0c;数组是一种固定长度、有序的数据结构&#xff0c;可以存储一组相同数据类型的元素。在本文中&#xff0c;我们将详细介绍Java数组在内存中的结构。 Java数组的定义 在Java中&…

linux中使用docker部署微服务

目录 一、制作jar包&#xff08;如果看一眼很简单&#xff0c;可以直接使用结尾的jar&#xff09; 1.首先创建一个微服务 demo2 2.启动微服务&#xff08;在DemoApplication上右键执行启动就行&#xff09; 注意&#xff1a;其他操作导致的 可能遇到的报错 3.修改端口 4.新…

超细Redis(一)

目录 概述 Redis是什么&#xff1f; Redis能干嘛&#xff1f; 特性 如何学习 Linux安装 测试性能 概述 Redis是什么&#xff1f; Redis &#xff08;Remote Dictionary Server&#xff09;,即远程字典服务 是一个开源使用ANSI C语言编写、支持网络、可基于内存亦可持…

【Java笔试强训 12】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;二进制插…

Python小姿势 - Python学习笔记——类与对象

Python学习笔记——类与对象 类与对象是面向对象编程的两个基本概念。类是对象的抽象概念&#xff0c;对象是类的具体表现。 类是对一类事物的抽象&#xff0c;它是描述一类事物的模板&#xff0c;而对象是类的具体表现。对象是类的实例&#xff0c;类是对象的模板。 举个例子&…

STM32 系列 DAC的介绍与使用

STM32网上资料多&#xff0c;对自己来说基本的使用也是很简单的&#xff0c; 我的STM32专栏并没有什么系统的基础教学&#xff0c;基本上是某个项目用到了&#xff0c;或者产品使用过程出过问题 才会来记录一下&#xff0c;正好用到了 DAC &#xff0c;一般产品还用得不多&…

QML应用动画(Applying Animations)

目录 一 扩展可点击图像元素版本2&#xff08;ClickableImage Version2&#xff09; 1 第一个火箭 2 第二个火箭 3 第三个火箭 动画可以通过以下几种方式来应用&#xff1a; 属性动画 - 在元素完整加载后自动运行&#xff1b; 属性动作 - 当属性值改变时自动运行&#xf…

【栈】的实现

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : —>&#x1f4d6;区块链 &#xff1a; 小明向你借100块钱&#xff0c;说一周后还你&#xff0c;然后你拿个喇叭大喊一声&#xff1a;我是某某&#xff0c;小明向我借了100块&#xff0c…

Vue3+Element Plus环境搭建和一键切换明暗主题的配置

Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。而Element Plus是一款基于Vue3面向设计师和开发者的组件库。 最终效果&#xff1a; 环境搭建 已安装 16.0 或更高版本的 Node.js&#xff0c;终端&#xff1a; npm init vuelatest这一…

Three.js--》Gsap动画库基本使用与原理

目录 Gsap动画库使用讲解 Gsap动画库基本使用 修改自适应画面及双击进入全屏 设置stats性能监视器 Gsap动画库使用讲解 GSAP的全名是GreenSock Animation Platform&#xff0c;是一个从flash时代一直发展到今天的专业动画库&#xff0c;今天将其与three.js进行结合&#x…

面试官:你知道 Spring lazy-init 懒加载的原理吗?

普通的bean的初始化是在容器启动初始化阶段执行的&#xff0c;而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring能够识别的BeanDefinition并存到Hashmap里供下面的初始…

HttpRunner3.x 源码解析(5)-runner.py

首先看下生成的pytest文件 from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCaseclass TestCaseLogin(HttpRunner):config (Config("登录成功").variables(**{"password": "tester", "expect_foo2": "co…

4.4.1内核编译

内核源码下载地址&#xff1a; https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.1.tar.gz 安装依赖包&#xff1a;报错就装 cp /boot/config-xxx ./.config make mrproper make menuconfig,然后save保存&#xff0c;退出 make -j4 //四线程编译 sudo ma…

Java基础(十六)泛型

1. 泛型概述 1.1 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就类似于上述场景中的…

计算机视觉的应用4-目标检测任务:利用Faster R-cnn+Resnet50+FPN模型对目标进行预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用4-目标检测任务&#xff0c;利用Faster RcnnResnet50FPN模型对目标进行预测&#xff0c;目标检测是计算机视觉三大任务中应用较为广泛的&#xff0c;Faster R-CNN 是一个著名的目标检测网络&#x…