mybatis实战:二、mybatis xml 方式的基本用法

news2024/10/6 18:26:57

注释都在代码里,最好复制了再看!


1.创建表

CREATE TABLE sys_user(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
user_name VARCHAR(50) COMMENT '用户名',
user_password VARCHAR(50) COMMENT '密码',
user_email VARCHAR(50) COMMENT '邮箱',
user_info TEXT COMMENT '简介',
head_img BLOB COMMENT '头像',
create_time DATETIME COMMENT '创建时间',
PRIMARY KEY (id) 
);
ALTER TABLE sys_user COMMENT '用户表';

CREATE TABLE sys_role(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色 ID',
role_name VARCHAR(50) COMMENT '角色名',
enabled INT COMMENT '有效标志',
create_by BIGINT COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
PRIMARY KEY (id) 
);
ALTER TABLE sys_role COMMENT '角色表';

CREATE TABLE sys_prvilege(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '权限  ID',
privilege_name VARCHAR(50) COMMENT '权限名称',
privilege_url VARCHAR (200) COMMENT '权限 URL',
PRIMARY KEY (id) 
);
ALTER TABLE sys_prvilege COMMENT '权限表';

CREATE TABLE sys_user_role( 
user_id BIGINT COMMENT '用户 ID ',
role_id BIGINT COMMENT '角色 ID'
);
ALTER TABLE sys_user_role COMMENT '用户角色关联表';

CREATE TABLE sys_role_prvilege(
role_id BIGINT COMMENT '角色ID',
privilege_id BIGINT COMMENT 'ID' 
);
ALTER TABLE sys_role_prvilege COMMENT '角色权限关联表';

2.插入数据

CREATE TABLE sys_user(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
user_name VARCHAR(50) COMMENT '用户名',
user_password VARCHAR(50) COMMENT '密码',
user_email VARCHAR(50) COMMENT '邮箱',
user_info TEXT COMMENT '简介',
head_img BLOB COMMENT '头像',
create_time DATETIME COMMENT '创建时间',
PRIMARY KEY (id) 
);
ALTER TABLE sys_user COMMENT '用户表';

CREATE TABLE sys_role(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色 ID',
role_name VARCHAR(50) COMMENT '角色名',
enabled INT COMMENT '有效标志',
create_by BIGINT COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
PRIMARY KEY (id) 
);
ALTER TABLE sys_role COMMENT '角色表';

CREATE TABLE sys_prvilege(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '权限  ID',
privilege_name VARCHAR(50) COMMENT '权限名称',
privilege_url VARCHAR (200) COMMENT '权限 URL',
PRIMARY KEY (id) 
);
ALTER TABLE sys_prvilege COMMENT '权限表';

CREATE TABLE sys_user_role( 
user_id BIGINT COMMENT '用户 ID ',
role_id BIGINT COMMENT '角色 ID'
);
ALTER TABLE sys_user_role COMMENT '用户角色关联表';

CREATE TABLE sys_role_prvilege(
role_id BIGINT COMMENT '角色ID',
privilege_id BIGINT COMMENT 'ID' 
);
ALTER TABLE sys_role_prvilege COMMENT '角色权限关联表';

INSERT INTO sys_user VALUES ('2','admin','123456','admin@mybatis.tk','管理员',NULL,'2016-04-01 17:00:58'); 
INSERT INTO sys_user VALUES ('1001','test','123456','test@mybatis.tk','测试用户',NULL,'2016-04-01 17:00:58'); 
INSERT INTO sys_role VALUES ('1','管理员','1','1','2016-04-01 17:02:14'); 
INSERT INTO sys_role VALUES ('2','普通用户','1','1','2016-04-01 17:02:34');
INSERT INTO sys_user_role VALUES ('1','1'); 
INSERT INTO sys_user_role VALUES ('1','2');  
INSERT INTO sys_user_role VALUES ('3','2'); 
INSERT INTO sys_prvilege VALUES ('1','用户管理','/users'); 
INSERT INTO sys_prvilege VALUES ('2','角色管理','/roles'); 
INSERT INTO sys_prvilege VALUES ('3','系统日志','/logs'); 
INSERT INTO sys_prvilege VALUES ('4','人员维护','/persons'); 
INSERT INTO sys_prvilege VALUES ('5','单位维护','/companies'); 
INSERT INTO sys_role_prvilege VALUES ('1','l'); 
INSERT INTO sys_role_prvilege VALUES ('1','1001'); 
INSERT INTO sys_role_prvilege VALUES ('1','2');  
INSERT INTO sys_role_prvilege VALUES ('2','4'); 
INSERT INTO sys_role_prvilege VALUES ('2','5'); 

3.创建实体类

package tk.mybatis.simple.model;

import java.util.Date;

import lombok.Data;

@Data
public class SysUser {
    private Long id;
    private String userName;
    private String userPassword;
    private String userInfo;
    private byte[] headImg;
    private Date createTime;
    private String userEmail;
}

@Date可以省略get、set方法,要导入依赖、下载插件才可以使用

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

package tk.mybatis.simple.model;

import lombok.Data;

@Data
public class SysUserRole {
    private Long userId;
    private Long roleId;
}

4.Mapper

创建一下文件

xml:

需要注意 是<mapper >根标签 name space 属性。当 app 接口和 XM 文件关联的时候,命名空间口amespace 值就需要配置成接口的全限定名称,例如 UserMapper 接口对 应的 tk.mybat. simple.mapper.UserMapper内部就是通过这个值将接口和XML 关联起来的。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--        需要注意 是<mapper >根标签 name space 属性。当 app 接口和 XM 文件关联的-->
<!--        时候,命名空间口amespace 值就需要配置成接口的全限定名称,例如 UserMapper 接口对-->
<!--        应的 tk mybat simple .mapper . UserMapper, is 内部就是通过这个值将接口和-->
<!--        XML 关联起来的。-->
<mapper namespace="tk.mybatis.simple.mapper.UserMapper">
</mapper>

 mybatis-config.xml

<mappers>
        <mapper resource="mapper/CountryMapper.xml"/>
        <mapper resource="mapper/UserMapper.xml"/>
        <mapper resource="mapper/RoleMapper.xml"/>
        <mapper resource="mapper/PrivilegeMapper.xml"/>
        <mapper resource="mapper/UserRoleMapper.xml"/>
        <mapper resource="mapper/RolePrivilegeMapper.xml"/>
    </mappers>

5.UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--        需要注意 是<mapper >根标签 name space 属性。当 app 接口和 XM 文件关联的-->
<!--        时候,命名空间口amespace 值就需要配置成接口的全限定名称,例如 UserMapper 接口对-->
<!--        应的 tk mybat simple .mapper . UserMapper, is 内部就是通过这个值将接口和-->
<!--        XML 关联起来的。-->
<mapper namespace="tk.mybatis.simple.mapper.UserMapper">
    <!--        constructor: 通过构造方法注入属性的结果值 构造方法中的 idArg 、arg 参数分别对应着 resultMap 中的 id result 标签,它们的含义相同,只是注入方式不同-->
    <!--        resultMap :中的 id result 标签包含的属性相同,不同的地方在于, id 表的是主键(或唯一值)的字段(可以有多个),它们的属性值是通过 setter 方法注入的-->
    <resultMap id="userMap" type="tk.mybatis.simple.model.SysUser">
<!--        id :必填,并且唯一。 select 标签中, resultMap 指定的值即为此处 id 所设置的值。
            type :必填,用于配置查询列所映射到的 Java 对象类型。
            extends :选填,可以配置当前的 resultMap 继承自其他的 re sultMap ,属性值为继承 resultMap id
            autoMapping :选填,可选值为 true false ,用于配置是否启用非映射字段(没有在 resultMap 中配置的字段〉的自动映射功能 该配置可以覆盖全局的
            autoMappingBehavior 配置。以上是 resultMap 的属性, resultMap 包含的所有标签如下。
            constructor :配置使用构造方法注入结果,包含以下两个子标签
                idArg: id 参数,标记结果作为 id (唯 值),可以帮助提高整体性能。
                arg :注入到构造方法的 个普通结果。
            id :一个id 结果,标记结果作为 id (唯 值),可以帮助提高整体性能。
            result :注入到 Java 对象属性的普通结果。
            association: 一个复杂的类型关联,许多结果将包成这种类型
            collection :复杂类型的集合。
            discriminator :根据结果值来决定使用哪个结果映射。
            case: 基于某些值的结果映射。-->
        <id property="id" column="id"/>
        <result property="userName" column="user_name"/>
        <result property="userPassword" column="user_password"/>
        <result property="userEmail" column="user_email"/>
        <result property="userInfo" column="user_info"/>
        <result property="headImg" column="head_img" jdbcType="BLOB"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<!--        id result 标签包含的属性。-->
<!--        column :从数据库中得到的列名 或者是列的别名。-->
<!--        property :映射到列结果的属性。可以映射简单的如“username ”这样的属性,也-->
<!--        可以映射 些复杂对象中的属性 例如“ address.street.number ”,这会通过“ .”-->
<!--        方式的属性嵌套赋值。-->
<!--        javaType Ja 类的完全限定名,或 个类型别名(通过 typeAlias 配置或者-->
<!--        默认的类型)。如果映射到 JavaBean,mybatis通常可以自动判断属性的类型。如-->
<!--        果映射到 HashMap ,则需要明确地指定 av a Type 属性-->
<!--        jdbcType 列对应的数据库类型。 JDB 类型仅仅需要对插入、更新、删除操作可能-->
<!--        为空的列进行处理。这是 JDB j dbcType 的需要,而不是 My atis 的需要-->
<!--        typeHandler :使用这个属性可以覆盖默认的类型处理器。这个属性值是类的完全限-->
<!--        定名或类型别名。-->
    </resultMap>
<!--    XML 中的 select 标签的 id 属性值和定义的接口方法名是 样的ρMyBatis
就是通过这种方式将接口方法和 XML 定义的 SQL 语句关联到 起的,如果接口方法没有和
XML 中的 id 属性值相对应,启动程序便会报错。-->
    <select id="selectById" resultMap="userMap">
<!--        select 映射查询语句使用的标签。
id :命名空间中的唯 标识符,可用来代表这条语句。
resultMap :用于设置返回值的类型和映射关系
-->
        select * from sys_user where id = #{id}
<!--        # {id} : MyBatis SQL 中使用预编译参数的一种方式,大括号中的 id 是传入的参数名。
在上面的 elect 中,使用 resultMap 设置返回值的类型,这里的 userMap 就是上面
<res ultMap 中的 id 属性值,通过 id 引用需要的<resultMap >。-->
    </select>
<!--    当只使用 XML 而不使用接 口的时候 names pace 的值可以设置为任意不重复的名称
        标签的 id 属性值在任何 候都不能出现英文句号“.”
        并且同 个命名 间下不能现重复的 id
        因为接口方法是可以重载的,所以接口中可以出现多个同名但参数不同的方法,但是XML id 的值不能重复,
        因而接口中的所有同名方法会对应着 XML 中的同 id的方法。
        最常见的用法就是,同名方法中其中一个方法增加 RowBound 类型的参数用于实现分页查询。-->
    <select id="selectAll1" resultType="tk.mybatis.simple.model.SysUser" >
    select id,
    user_name userName,
    user_password userPassword,
    user_email userEmail,
    user_info userInfo ,
    head img headImg,
    create_time createTime
    from sys_user
</select>
<!--  selectByid selectAll 的区别 selectByid 中使用
resultMap 来设置结果映射,而 selectAll 中则通过 resultType 直接指定了返回结果
的类型。可以发现,如果使用 result Type 来设置返回结果的类型,需要在 SQL 中为所有列
名和属性名不 致的列设置别名,通过设置别名使最终的查询结果列和 result Type 指定对象
的属性名保持 致,进而实现自动映射。  -->

    <select id= "selectAll2" resultType="tk.mybatis.simple.model.SysUser" >
    select id, user_name , user_password, user_email , user_info, head_img, create_time from sys_user
</select>
</mapper>

6.BaseMapperTest

package tk.mybatis.simple.mapper;

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.BeforeClass;

import java.io.IOException;
import java.io.Reader;

public class BaseMapperTest {
    private static SqlSessionFactory sqlSessionFactory;
    @BeforeClass
    public static void init () {
        try {
            Reader reader = Resources.getResourceAsReader ("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            reader.close();
        } catch (IOException ignore) {
            ignore.printStackTrace();
        }
    }
    public SqlSession getSqlSession () {
        return sqlSessionFactory.openSession();
    }
}

7.CountryMapperTest

package tk.mybatis.simple.mapper;

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.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import tk.mybatis.simple.model.Country;
import tk.mybatis.simple.model.SysUser;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

public class CountryMapperTest extends BaseMapperTest {
    private static SqlSessionFactory sqlSessionFactory;

//    @BeforeClass
//    public static void init() {
//        try {
            通过 Resources 工具类将 ti -config.xm 配置文件读入 Reader
//            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            再通过 SqlSessionFactoryBuilder 建造类使用 Reader 创建 SqlSessionFactory工厂对象。
            在创建 SqlSessionFactory 对象的过程中
            首先解 mybatis-config.xml 配置文件,读取配置文件中的 mappers 配置后会读取全部的 Mapper xml 进行具体方法的解析,
            在这些解析完成后, SqlSessionFactory 就包含了所有的属性配置和执行 SQL 的信息。
//            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            使用时通过 SqlSessionFactory 工厂对象获取 splSession
//            reader.close();
//        } catch (IOException ignore) {
//            ignore.printStackTrace();
//        }
//    }
//
//    private void printCountryList(List<Country> countryList) {
//        for (Country country : countryList) {
//            System.out.printf("%-4d%4s%4s\n", country.getId(), country.getCountryname(), country.getCountrycode());
//        }
//    }

    @Test
    public void testSelectByid() {
        SqlSession sqlSession = getSqlSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            SysUser user = userMapper.selectById((long) 1);
            Assert.assertNotNull(user);
            Assert.assertEquals("admin", user.getUserName());
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void testSelectAll() {
        SqlSession sqlSession = getSqlSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<SysUser> userList = userMapper.selectAll();
            Assert.assertNotNull(userList);
            Assert.assertTrue(userList.size() > 0);
        } finally {
            sqlSession.close();
        }
    }
}

8.运行结果

9.总结

(1)mapper接口存放在java下的mapper包里,mapper.xml存放在资源包下面!

namespace的值是对应的mapper接口的全限定名称

 

(2)实体类用驼峰命名法,sql 里的映射

1.用别名法映射

2.自动映射

配置:

 3.使用 resultMap

 

 

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

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

相关文章

manjaro 记录 1 安装流程

manjaro 记录 1 安装流程 初manjaro 记录 1 安装流程下载好镜像镜像写入U盘重启电脑&#xff0c;进入U盘安装进入界面&#xff1a;找到 launch installer 进行安装安装流程设置语言设置位置与时区设置键盘磁盘分区设置用户与管理员密码安装初 希望能写一些简单的教程和案例分享…

Flink JobManager 内存占用大 问题

Flink JobManager 内存占用大问题 问题描述 当在 本地启动一个 flink 简单的 job 时候&#xff0c;发现出现了 heap outMemeory 问题&#xff0c; 然后就不假思索的 调整了 jvm 的 heap -Xms1000m -Xmx16000m 参数&#xff0c;就可以正常的启动了。 通过 jvisualvm 连接上 这…

实验七 循环神经网络(3)LSTM的记忆能力实验

目录6.3 LSTM的记忆能力实验6.3.1 模型构建6.3.1.1 LSTM层6.3.1.2 模型汇总6.3.2 模型训练6.3.2.1 训练指定长度的数字预测模型6.3.2.2 多组训练6.3.2.3 损失曲线展示6.3.3 模型评价6.3.3.1 在测试集上进行模型评价6.3.3.2 模型在不同长度的数据集上的准确率变化图6.3.3.3 LSTM…

robfig/cron-go cron定时任务库架构剖析

Cron深度解析 思想 对于cron 这个三方库来说&#xff0c;他可以说是做两件事&#xff0c;其一是&#xff1a;解析cron string&#xff0c;生成一个定时器&#xff0c;达到循环时间发送信号。其二是核心&#xff08;引擎&#xff09;&#xff1a;用以执行&#xff0c;判断&…

Spring基础篇:Spring简介

第一章&#xff1a;Spring简介 SpringIOC工厂是Spring所有特性的基础&#xff0c;Spring所有的特性都是基于IOC控制反转特性而来的。 当今微服务已经成为主流&#xff0c;微服务依赖于SpringBoot和SpringCloud&#xff0c;而SpringBoot和SpringCloud是衍生于Spring&#xff0c…

贺利坚汇编课程笔记2 访问寄存器和内存

贺利坚汇编课程笔记2 访问寄存器和内存 文章目录贺利坚汇编课程笔记2 访问寄存器和内存0201 寄存器及数据存储CPU的组成寄存器是CPU内部的信息存储单元通用寄存器--以AX为例“字”在寄存器中的存储0202 mov 和 add指令0203 确定物理地址的方法物理地址8086CPU给出物理地址的方法…

pytorch模型网页部署——Flask

一、Flask用法 Flask是python的轻量级web框架&#xff0c;可用来做简单的模型部署。Flask的基本用法如下&#xff1a; step1&#xff1a;定义Flask类的对象&#xff0c;即创建一个基于Flask的服务器 step2&#xff1a;定义公开的路由及路由对应的调用函数 step3&#xff1a…

分享新零售系统商城小程序开发制作功能介绍_商城小程序开发好处

小编主要专注于新零售系统开发商城的领域&#xff0c;新零售系统开发商业模式有哪些&#xff1a; ① 多种销售模式&#xff1a;邀请有奖、销售业绩奖、团队业绩奖、区域分红&#xff0c;分销模式等。 ② 团队协作功能&#xff1a;立即邀约分销模式&#xff0c;清楚搜索直属代…

大型ERP生产制造管理系统源码

&#x1f353;&#x1f353;【淘源码】&#xff1a;一个专业提供高品质源码免费下载的资源共享平台&#x1f353;&#x1f353; &#x1f447;&#x1f447;&#x1f447;以下是博主整理的淘源码网站内大家都比较感兴趣的一些源码&#xff0c;需要源码学习的朋友可以私信博主哦…

Exception | ShardingSphere | ShardingSphere引发的IndexOutOfBoundsException

ShardingSphere引发的IndexOutOfBoundsException一、异常二、 原因三、解决方法四、总结一、异常 ### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 ### The error may exist in file [D:\JetBrains\Idea\workspace\zohe\bjxz\ru…

N-gram和NNLM语言模型

背景&#xff1a; one-hot:缺点&#xff1a;1.高维稀疏&#xff0c;2.不能体现句子中词的重要性&#xff0c;3.不能体现词与词之间的关系。 embedding:1.解决了高维稀疏 tf-idf&#xff1a;2.解决了one-hot中不能体现句子中词的重要性这一特点。 语言模型&#xff1a;3.解决不能…

【20221201】【每日一题】划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 思路&…

协程Part1-boost.Coroutine.md

首先&#xff0c;在计算机科学中 routine 被定义为一系列的操作&#xff0c;多个 routine 的执行形成一个父子关系&#xff0c;并且子 routine 一定会在父 routine 结束前结束&#xff0c;也就是一个个的函数执行和嵌套执行形成了父子关系。 coroutine 也是广义上的 routine&a…

网页JS自动化脚本(五)修改文字元素的内容和大小

今天的网页打开全是灰色的,顺便缅怀一下伟人,那么我我们今天定位换成按钮文字 window.onloadfunction(){var theElementdocument.querySelector("input[typesubmit]");theElement.value"爱我中华";theElement.style"font-size:25px"; }这一次的…

提分必练!中创教育PMP全真模拟题分享来喽

湖南中创教育每日五题分享来啦&#xff0c;“日日行&#xff0c;不怕千万里&#xff1b;常常做&#xff0c;不怕千万事。”&#xff0c;每日五题我们练起来&#xff01; 1、一个项目正在实行敏捷方法&#xff0c;在迭代过程中&#xff0c;团队成员互相合作&#xff0c;解决了一…

【机器学习】核函数

核方法 核技巧 非线性分类问题是指通过利用非线性模型才能很好地进行分类的问题。如图 111 所示&#xff0c;“●”表示正样本&#xff0c;“”表示负样本&#xff0c;显然无法用直线&#xff08;线性模型&#xff09;将正负样本正确分开&#xff0c;但是可以用一条椭圆曲线&…

记一次大事务优化历程(短信发送)

问题背景 短信服务数据库连接数告警&#xff0c;grafana查看数据库连接池被打满。 问题分析 在这段时间内&#xff0c;通过链路分析&#xff0c;发现最终调用第三方短信发送服务偶然耗时过长&#xff0c;分析了原有发送逻辑的代码&#xff0c;该实现在入口send处加了事务&am…

leetcode4. 寻找两个正序数组的中位数python_二分查找和递归(困难)

题目 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.00000 解释…

第二证券|疫情扰动叠加需求不足,11月制造业PMI回落至48%

国家统计局周三称&#xff0c;11月&#xff0c;受国内疫情点多面广频发&#xff0c;世界环境更趋复杂严峻等多重要素影响&#xff0c;我国制造业收购经理人指数&#xff08;PMI&#xff09;较上月回落1.2个百分点至48.0%。制造业PMI接连两个月低于临界点&#xff0c;制造业下行…

第4季2:并口、MIPI、LVDS的简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、并口的简介 1、并口的含义 并口的含义&#xff0c;可以从AR0130或OV9712的原理图中形象地理解。 如下图所示&#xff0c;AR0130采用12bit的并口向SoC传输图像数据信息&#xff0c;而SoC和AR0130…