W5500常见问题汇总(二)- 建议保存
大家好,又见面了,我是全栈君。
W5500自去年9月推出。已经有一年的时间。一年间。不乏非常多客户纷纷将目光投向了W5500这颗性价比非常高的全新硬件TCP/IP以太网芯片,不管是在工控、安防、交通,还是在智能医疗、智能家居等众多领域中,得到了广泛应用及认可。同一时候,也收到了非常多客户在使用过程中的问题反馈,比方W5500中断问题、切换port问题,及W5500做server。多port连接等常见问题。
这些,我们都一一帮助大家分析。一同解决!那么。为了提高技术支持效率。也特此将这些问题再次整理给大家,以供分享!期待能有所帮助!
1.
W5500作为server时,怎样获取来自连接方的IP地址及port
问题描写叙述:w5500作为server时,怎样获取来自连接方的IP地址及port?我怎么没有找到寄存器呢
读DIPR 和SIPR都不正确。
是不是没有查询方法呀?
UDP和TCP模式我都试过了,整了一天也没找出明堂来,假设实在不行。仅仅能依靠,谁来连接W5500,谁就在DATA区自报家门了。但这样做感觉有点不是非常爽,按说是能够获取到来自连接方的IP地址及port的
比方W5500接在网络上,要对它进行搜索和设置,那么就要UDP广播包,眼下能够收到广播包,但量回应的包。去对方收不到,仅仅能怀疑是目标地址和port没有更新在dipr寄存器了,请支招儿,谢谢!。
答1:TCP Server模式下。在连接建立后,由硬件更新目标IP和port值。
答2:收到信息的前面6个字节即为对方IP地址和port号。
答3:TCP Server 模式下,能够读取Sn_DIPR和Sn_DPORT来确定连接方的IP及port。这个是能够。你能够打印这个地址里的信息来查看。
W5500 As TCP Server
原帖来自:9MCU
2.
W5500一个独立port作为Server模式能够支持多少个client连接
问题描写叙述1:W5500一个独立portport作为TCP Server模式打开一个port。此port已经映射到外网,如今可能有多个client连接过来,能够支持多少个client连接?经測试,仅仅能支持一个连接。连接上一个client后,后连的client根本连接不上;而採用ENC28J60採用uip协议时,利用TCP方式监听port。是能够支持client多连接的。不知w5500内部的硬件协议栈是否能支持作为server,多个client连接过来?
答1:能够这样用,可是要把5500的Socket都设置成TCP Server。然后port都一致。这样就能够有8个客户连接进来了。
问题描写叙述2:就是说。每一个独立port实际上相应的是一个连接,最多仅仅能有8个连接,对吧?
答2:是的
答3:依照你初始化第一个Socket 0为TCP Server的方式。将其它Socket 1~7 配置成參数一致的TCP Server就可以
原帖来自:9MCU
3.
W5500无法清中断
问题描写叙述:这几天一直在调试W5500,MCU用的是STM32F205。
能够正常的收发,非中断方式。
如今改用中断模式,无法清除中断。
用户手冊上写。Sn_IR,清除需相应位写1。但此寄存器为仅仅读寄存器。每次对此寄存器进行写操作都会导致看门狗复位。
有没有人遇到类似情况,求教
注:UDP方式
答:问题已解决,是回环測试后又产生了SEND_OK中断。终于因超时引起看门狗复位。
屏蔽发送中断后一切正常。
原帖来自:9MCU
4.
问一下:不管是通用寄存器中断IR还是socket中断寄存器SN_IR中断的清除都是我们使用MCU对该寄存器进行手动写0XFF么?谢谢哦。 期待回信。。 。
问题描写叙述:W5500的中断是不是能够理解成二级中断?首先推断是不是通用寄存器IR的中断。假设不是然后推断中断是不是来自SN_IR。假设来自SN那么进行检測SN的中断触发。。检測到中断之后,须要手动的向产生中断的IR寄存器写入0XFF进行中断的清除?
请问是这样的思路么?
答1:请看看 W5500中断寄存器的理解
http://www.9mcu.com/9mcubbs/foru … ead&tid=1062343
答2:首先,能够类似的说成是二级中断。通用寄存器的中断和Socket中断的细分不同。
其次。清中断就是往相应位上写1。
原帖来自:9MCU
5.
W5500中断寄存器的理解
W5500中断寄存器的理解
W5500中文手冊V1.0 写的不够清楚。该文是本人结合中英文手冊及自己理解。整理出有关中断部分的理解。如有不对的请指正。
一:引脚 INTn 为中断输出(Interrupt output)
低电平:W5500的中断生效。
高电平:无中断或者处于中断生效等待中
二:中断相关寄存器
2.1 IR (连接中断寄存器) [R/W] [0x0015] [0x00]
该寄存器主要指示网络连接错误或唤醒引起当的中断。
某位为1 且 该位中断没有被屏蔽就能够引发中断。INTn引脚将会被拉低,中断处理完成后,能够由主机写为‘1’清除该位中断. IR 为‘0×00’时,INTn引脚将会被拉高。
2.2 IMR (连接中断屏蔽寄存器) [R/W][0x0016][0x00]
中断屏蔽寄存器(IMR)是用来屏蔽中IR中断的,某位写‘1’,则开启中断;写‘0’。关闭中断。
每一个中断屏蔽位相应中断寄存器(IR)中的一个位. 假设IMR某位写0,即使IR中相应位为1了。也不会引发中断。INTn引脚不会被拉低。
2.3 SIR ( Socket 中断寄存器) [R/W] [0x0017] [0x00]
SIR就是指示哪个Socket发生的中断的。
假设某个Socket发生的中断,该寄存器的相应位将被置为1 ,直到被主机置‘1’清除。假设Sn_IR不等于‘0×00’, 就会引发中断。INTn引脚将被拉低。
2.4 SIMR (Socket 中断屏蔽寄存器) [R/W] [0x0018] [0x00]
SIMR寄存器来屏蔽中SIR中断的。某位写‘1’。则开启中断。写‘0’,关闭中断。
每一个中断屏蔽位相应中断寄存器(SIR)中的一个位. 假设SIMR某位写0。即使IR中相应位为‘1’了,也不会引发中断。INTn引脚不会被拉低。
2.5 Sn_IR (Socket n 中断寄存器) [R] [0x0002] [0x00]
Sn_IR 寄存器用于提供给Socket n 中断类型信息,如建立(Establishment)、终止(Termination)、接收数据(Receiving data)和超时(Timeout)。当触发一个中断即Sn_IMR的相应位是’1′的时候,Sn_IR的相应位也将会变成‘1’。
假设想把Sn_IR位清零的话,主机应该将该位置‘1’
这里的[R],而不是[R/W] 表示不能由主机写‘1’让W5500产生中断。仅仅能由主机设置‘1’ ,清除某一位中断。
2.6 Sn_IMR (Socket n 中断屏蔽寄存器) [R/W] [0x002C] [0xFF]
Sn_IMR 负责屏蔽Socket n的中断。某位写‘1’,则开启中断;写‘0’,屏闭中断。
每一位都相应了Sn_IR寄存器的相应位。Socket n的中断触发而且Sn_IMR的相应位为‘1’时,Sn_IR的相应位变为‘1’。假设Sn_IMR和Sn_IR的相应位均为‘1’且SIR 寄存器的相应为‘1’。INTn 引脚便会拉低并使主机产生中断。
2.7 INTLEVEL (低电平中断定时器寄存器) [R/W] [0x0013 – 0x0014] [0x0000]
该寄存器用于设置中断生效等待的时间(IAWT)。
当下一个中断触发。中断引脚将会在INTLEVEL时间后。拉低中断引脚(INTn)。
A. 当Socket 0的超时中断被触发,S0_IR[3] & SIR[0]设置为‘1’,然后 INTn 引脚才被拉低。
B. 当Socket 1的连接中断在前一个中断未处理完毕之前被触发,则INTn 引脚仍然为低,S1_IR[0] & SIR[1]位设置为‘1’。
C. 假设主机是通过全然清理S0_IR[3]位来完毕中断清除。则INTn引脚被拉高。可是此时S1_IR[0] & SIR[1]仍然保持为‘1’。
D. 即使S1_IR[0] & SIR[1]位被设置为‘1’。可是在 INTLEVEL 期间。INTn不能被拉低。仅仅有过了INTLEVEL时间,INTn才干被拉低。
三:中断方式设计程序
通过以上介绍,可知几个寄存器之间有例如以下关系:
A:3个中断寄存器 IR,SIR 。Sn_IR。它们相应的3个中断屏蔽寄存器IMR,SIMR。Sn_IMR(也能够觉得是中断使能寄存器)。仅仅有使能相应位中断,该位为‘1’时才干引发中断,拉低INTn。
B:一次中断处理结束,清除相应状态位后,都会拉高INTn,假设还有别的中断状态寄存器为‘1’,就等待一定时间再拉低INTn。这个时间是由INTLEVEL寄存器来设定的。对于主机来说来一次中断,仅仅能处理一个事件。
C :IR寄存器与网络连接状态有关的寄存器,跟SIR,Sn_IR 没有关系。
而SIR 和Sn_IR 是同一时候出现的,SIR 指出是Socket n发生了中断事件。Sn_IR指出了Socket n 发生了什么中断事件,如收到数据 超时等。
因此假设主机採用中断方式,检測到INTn才干被拉低了,进入中断服务函数能够採用先推断是不是IR中断,不是就读取SIR状态,找到触发中断的那个Socket n。然后读取 对应的Sn_IR 进行处理。
每次处理完,就对对应寄存器的对应位清除。
原帖来自: 6.
问题描写叙述1:我如今使用CC2530单片机和MCU通过SPI接口和W5500连接。使用W5500库函数,下载进去程序之后,在电脑中能够ping 通W5500设备。在电脑中打开TCP工具,程序中设置MCU自己主动上传数据和接收到什么数据就返回什么数据,可是这两个数据都出现错误,不能接收到正常的数据,这个数据通过串口发送出来。都是正常的数据,在TCP工具中偶尔能够见到几包正确的数据,可是大多数时候都是错误数据包,搞不清楚哪里设置错误,请大神指点一下。 答1:你好,你能够用Wireshark抓包看看有无丢包。 假设没有丢包的话,就是说裸数据阶段就出现故障了。 看一下你SPI的速率,试着提升一下SPI速率试一下。 有可能你SPI处理数据太慢了导致的。 问题描写叙述2:我单步运行的时候,数据还是错误的。可是没有出现丢包的现象,在内部数据还是正确的,可是运行到W5500发送出来的时候,就是错误的。 //SCK时钟4MHZ,时钟频率/8 U1BAUD = 0×00; // BAUD_M = 0 U1GCR |= 0×11; // BAUD_E = 17 SPI的速率我这是设置的4M,我也尝试着提高了速率,可是没什么效果。降低速率也是不行,大多数数据都是错误的,中间偶尔会出现几包正确数据。 答2:问题已经解决。是库函数没设置好,send_data_processing()和recv_data_processing()中,ptr一開始是16位,由于移位使数据溢出,能够设置成32位,或者在移位的时候。进行强制类型转换的时候。多使用括号,不要由于优先级不同,不能安装自己想要实现的功能来执行。 原帖来自:9MCU 7.
W5500作为client直接连接电脑和交换机失败。通过路由器能够
问题描写叙述:/*********************************************
* 函数名 : Detect_Gateway
* 描写叙述 : 检查网关server
* 输入 : 无
* 输出 : 无
* 返回值 : 成功返回TRUE(0xFF),失败返回FALSE(0×00)
* 说明 : 无
******************************************************/
unsigned char Detect_Gateway(void)
{
unsigned char ip_adde[4];
ip_adde[0]=IP_Addr[0]+1;
ip_adde[1]=IP_Addr[1]+1;
ip_adde[2]=IP_Addr[2]+1;
ip_adde[3]=IP_Addr[3]+1;
//检查网关及获取网关的物理地址
Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//向目的地址寄存器写入与本机IP不同的IP值
Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//设置socket为TCP模式
Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//打开Socket
os_dly_wait (100);//Delay(5);//延时5ms
if(Read_W5500_SOCK_1Byte(0,Sn_SR) != SOCK_INIT)//假设socket打开失败
{
Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//打开不成功,关闭Socket
return FALSE;//返回FALSE(0×00)
}
Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//设置Socket为Connect模式
do
{
u8 j=0;
j=Read_W5500_SOCK_1Byte(0,Sn_IR);//读取Socket0中断标志寄存器
if(j!=0)
Write_W5500_SOCK_1Byte(0,Sn_IR,j);
os_dly_wait (10);//Delay(5);//延时5ms
if((j&IR_TIMEOUT) == IR_TIMEOUT)
{
return FALSE;
}
else if(Read_W5500_SOCK_1Byte(0,Sn_DHAR) != 0xff)
{
Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//关闭Socket
return TRUE;
}
}while(1);
}
直接连接电脑的时候死在了这个函数里。Read_W5500_SOCK_1Byte(0,Sn_DHAR) 的返回值一直是ff
答1:无法获取目标MAC地址。应该是W5500发出ARP请求,没有收到相应的回复。
你的交换机各个口之间是透明的吗?假设是的话,用PC连在一个port上,用Wireshark抓包看一下。
你也能够把抓包附上来看一下。
答2:问题找到了。用交叉网线就能够了
原帖来自: 8.
W5500工业方面有使用的吗
问题描写叙述:w5500抗干扰能力怎么样
答:你好,
W5500的抗干扰还是非常好的。工业客户还是蛮多的。事实上,光说的话也没有太大意义。你能够測试评估一下。
你能够给我一个邮箱,我发測试报告给你。
WIZnet的芯片都是工业级芯片。
原帖来自:9MCU
9.
问题描写叙述1:我是用的是自带协议栈的W5500+STM32F103。 我想要实现的功能:向多个client节点同一时候发出命令,然后每一个节点接收到命令后要開始数据的上传以及一些其它的节点操作。这种需求,依照常理,应该是server公布命令使用广播。也就是UDP,为保证数据可靠性。数传就使用TCP! 这中间就存在了一个协议的切换问题,那我是不是可以在port1使用UDP,在port2使用TCP?!想问一下各位,W5500可以轻松的实现切换吗?! 还有。UDP和TCP在切换中有什么须要注意的?! 补充一点。如今我使用的是在TCP中加了一个for();循环。来给各个节点公布命令。相当于模拟了一个UDP广播,可是这样就浪费了大量的时间,请问有什么好的改进方法!? 答1:w5500有8个socket,能够一个socket做UDP广播,一个socket做TCP Server。这样你能够使用socket_udp发送命令后,client节点收到命令后。将数据发到TCP Server。当然须要处理的是TCPServer接收缓冲区的数据。 不知道这种方案您能接收不。 当然同理client也是两个socket,仅仅只是除了udp。多了一个TCPClient。 另。你能够初始化2个socket,例: Socket 0 是UDP, Socket 1~7是TCP Server(參数配置成一样的,意味着同一时候有7个client能够连入)。使用Socket 0公布命令。使用Socket 1~7接收数传。 问题描写叙述2:再追加一个问题。您知道怎么做能够提高UDP广播的命令的可靠性!? 答2:首先udp就是面向不可靠连接,假设想做到可靠又想使用广播,那么你能够在udp的程序里自己加上一次握手。 比如server发送udp(地址255.255.255.255)广播后。每一个接收到广播的设备回复一个ack,server在得到ack后则觉得数据送达。这里有个问题就是server知道各个client的ip地址。这样收到的ack才有指向性。 可是这样好麻烦啊。 还有就是你能够一段时间T内多次广播命令,减少丢包概率。 问题描写叙述3:请问W5500+STM32103 多个socket同一时候发送数据时候出现丢包应该怎么处理啊 答3:这个主要看一下你SPI的读取速率,是不是太慢造成buff溢出导致的。你能够提高SPI速率。或者使用小包多发的形式,将大数据包拆分成小包来发送。 原帖来自: 10.
问题描写叙述1:W5500工作一段时间(大概几分钟),有时会出现双灯全亮的现象,此时,拔下网线,灯依然亮。重新启动断电后上电。依然灯全亮。须要过非常长时间才干恢复。 灯全亮阶段。网口显示断开状态。 各DX有遇到过此类问题的吗?如有,是什么原因,该怎样解决啊。谢谢。 答1:会不会是有个别的控制引脚悬空了?比較easy受到干扰。 比方reset之类的,状态进入随机,失去控制 问题描写叙述2:ARM和W5500的控制线确实走线较远,这样是不是应该在RESET等信号端加上拉或下拉电阻啊? 答2:但就RESET而言,是应该加一个上拉,给芯片一个上电默认状态! 问题描写叙述3:恩恩,很感谢!。 原帖来自:9MCU 11.
求助:W5500连续接收数据出错。。。 。。
问题描写叙述:做的測试是W5500做TCP服务端 然后PC做client,PC间隔50ms给 W5500 发 几个字节如1234, W5500接收后,把接收的数据发到PC端 。
经过大量測试。把问题锁定在 W5500接收数据,当接收一定量时。就会出现这样的情况:如 PC发送的是1234,这时候它仅仅能接收 1 后面几个字节都接收不到 (观察SPI寄存器),可是过一段时间又能够正常接收有时候还有出现,一个字节都不能接收。但都是过一会又正常。并且出现的频率比較规律。。。。。
各位有遇到过吗 求助。
。
。。
。
。
答1:有没有參考WIZnet 的TCP Server例程?建议你用Wireshark抓包看一下
答2:你这个是TCP Server Loopback。 W5500有这个例程。你能够參考一下(http://pan.baidu.com/s/1F7SzO)。
感觉是你的函数地址定义问题。
原帖来自:9MCU
12.
问题描写叙述1:W5500收到NBNS Quer包后发了NBNS的响应包(自己构造的)出去,抓包工具也能抓到,看内容也没有错误。可是询问端好像对响应包没反应。就和没有响应包一样,但实际上已经收到响应包了,不知问题出在哪里。另附上抓包文件(抓包工具为:Wireshark Version 1.12.1)谢谢大家。 答1:ARP的那部分,做个断点试试。是没收到,还是数据没对上? 问题描写叙述2:管理员,您好,关于ARP的部分,W5500(192.168.1.5)收到 PC(192.168.1.8)的MAC并且能将其自身的MAC发给PC,这个是由W5500自身硬件完毕的,这部分程序中未有涉及,程序中编写部分是接收137port消息并做出响应,那个响应包是程序构造的。不知道是不是这部分出了问题。我对了非常久也没对出哪里有问题。 答2:建议通过断点调试。在进入处理的位置開始就步步观察 问题描写叙述3:关于断点调试我不太清楚要调试那个部分,从抓包文件上看不出程序运行本身有什么错误 问题描写叙述4:我已找到问题,是TRANSACTION ID不匹配导致的,谢谢。 原帖来自:9MCU 13.
W5500 正常工作几天时间后,连不上。ping时候断断续续
问题描写叙述:W5500有的 用几天后 连接不上 ping时候 断断续续的,大侠们怎么破。
答:建议将W5500的板子与电脑直连,配置到一个网段内。然后‘ping ip –t’不停的ping下。偶尔的ping不通能够理解,可是假设常常ping 不通就要检查你的物理链路状态了。有可能导致的问题:1.RJ-45部分网线没有插好或者口松。2. 布板的时候信号线平行走线产生寄生电容电感。
原帖来自:9MCU
14.
怎样在W5500中实现HTTPS(http+ssl)client?
问题描写叙述:
怎样在W5500中实现HTTPSclient?跟HTTPclient实现的关键的差别?
HTTP/1.1 400 Bad Request
Server: nginx/1.2.0
Date: Thu, 24 Apr 2014 12:06:46 GMT
Content-Type: text/html
Content-Length: 270
Connection: close
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor=”white”>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.2.0</center>
</body>
</html>
答:这个须要你熟悉应用层的SSL协议,然后调用传输层及网络层的W5500协议。
这个可能兴许有演示样例代码开放出来,可是在这之前仅仅能各位朋友自己多摸索一下了。
原帖来自:9MCU
15.
问题描写叙述:有没有人会W5500与FPGA连接啊 答:有可是比較少,用FPGA一般总线资源足够并且线程够快,所以一般使用BUS接口。W5500是SPI接口。 依照经验来看,发部分FPGA的用户会用W5300。由于Buff够大,实际带宽高。尽管,W5300比W5500要贵,可是用FPGA的用户追求的还是简单高效通常是不会在乎这几块钱的。 原帖来自:9MCU 16.
答:DNS是应用层协议,W5500实现的是应用层下面的传输层及网络层协议。只是,W5500有DNS的演示样例代码(http://pan.baidu.com/s/1F7SzO)。你能够參考。 17.
W5500断开无法重联
问题描写叙述:CC2530单片机和W5500连接好能够正常通讯。断开网线或者关闭TCP工具,过一段时间再打开,TCP工具无法正常打开进行通讯。W5500的状态一直显示为连接状态,不能实现断开重联。
加入心跳检測包。也没有不论什么作用,IINCHIP_WRITE(Sn_KPALVTR(s),0×02); 这个是加入的心跳包检測语句。还须要其它地方进行设置吗
答:1.IINCHIP_WRITE(Sn_KPALVTR(s),0×02)注意你KPALVTR寄存器的地址是否正确加入了。详细能够參考W5500 Keepalive的演示样例代码http://pan.baidu.com/s/1F7SzO
2.加入心跳包能够实现断线后。N个周期(基于RTR和RCT)后。若仍没有收到对方的ACK信号,则会触发超时中断。并同一时候将Socket状态变为Closed。
程序里仅仅要加上监听Socket状态变为Closed之后就又一次开发Socket监听/连接就可以实现断线重连。
原帖来自:9MCU
18.
W5500自己主动协商PMODE工作模式,AVR64跑TCP透传能够吧?
问题描写叙述:打算用W5500做物联网比赛。
所以过来问个问题咯。
请知道的人指导下,歇歇咯。
N01:我将PMODE0 PMODE1 PMODE2接10k上拉电阻。
依据手冊配置成全部功能自己主动协商。
是不是W5500就能够自己主动协商PMODE的全部工作模式了呢?歇歇咯。
NO2:我使用AVR64跑TCP透传应该能够吧??我通过百度资料看到arduino硬件使用的ATMEGA芯片有跑20M带W5500。W5100实用51跑简单的网络连接。我用AVR64 8M跑应该没问题的吧?
答:1.是的。PMODE全为1时为自己主动协商
2.能够的,没有问题。
WIZnet的S2E透传模块都是8051+W5XXX或者W7100A(内置8051)
原帖来自:9MCU
19.
W5500怎样设置连接到外网server。不知怎样实现?
答:仅仅要你的PC能够訪问外网server。W5500就能够訪问外网server。假设你的外网server是在一个内网里面的,没有透明出来,须要设置路由使用port映射。将其透明出来,就可以訪问。
20.
W5500做server,通讯一段时间Client会断开
问题描写叙述:我用w5500作为server。用Client去连接。在通讯一段时间后会出现Client突然断开,继续进行连接一直连接不上,调试server端程序的时候发现出现这个情况的时候。SR寄存器读出来的值是0×17,即还是处于SOCK_ESTABLISHED状态,如今出现这个情况的频率比較高。大概执行十多分钟就会出现,求教?
答:这个是因为Client断开没有经过四次握手,非法断开连接,导致Socket被占用。无法恢复通信。
能够让客户增加断线重连机制,有下面方式:
(1) 检查PHY状态寄存器的Link位,假设Link down 则又一次初始化Socket;
主要针对网线插拔/断开。
(2) 假设TCP通讯中断,尝试又一次发起连接2-3次,若不能又一次连接,则又一次初始化Socket。
主要针对执行在TCP Client。
您这里是Server能够不予考虑;
(3) 设置Keep a live心跳包。若link断开会在RTR和RCR规定时间之后,触发超时中断;
TCP 模式下能够使用。
Server 或者Client都能够通过这样的方法检測。
21.
RTR值设定疑问
问题描写叙述1:你好!请问下在W5500中要设置keep alive心跳包,通过配置RTR和RCR的值,触发超时中断。依据文档的计算方法,最短时间是否仅仅能是RTR=32768 RCR=0的情况,这样算出来的时间是3.2s?是否能把触发时间设置的很短?大概在10ms左右,如今我keep alive心跳包是通过手动发送的。不是自己主动发送。发送的时间大概在1ms之内。
答1:关于您以下的问题。可能是您对我们的数据手冊有些误解。触发超时中断的时间(ms) = RTR的值除以10,即,假设你把RTR的值设置为2000时,产生中断的时间是200ms。
假设想把产生中断的时间设定为10ms。那么把RTR的值设定为100就可以。可是,不建议这么操作,假设网络反应过慢。会频繁的重传。依据10/100M以太网特性,200ms是一个比較通用的发送超时时间。请您參考。
问题描写叙述2:假设依照你这样说的,那RCR值设置代表的是什么意思? 超时时间不是通过这两个值来决定的吗?
答2:RCR(Retransmission Counter Register) 是重传次数,假设配置成3,表示发生超时中断时会重传一次,假设重传还不成功,又发生了超时中断,还会重传。但,总次数不超过3。
建议您先看看我们数据手冊,上面说明比較具体。
推荐阅读
-
W5500常见问题汇总(二)- 建议保存
-
SSM三大框架基础面试题-一、Spring篇 什么是Spring框架? Spring是一种轻量级框架,提高开发人员的开发效率以及系统的可维护性。 我们一般说的Spring框架就是Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。比如Core Container中的Core组件是Spring所有组件的核心,Beans组件和Context组件是实现IOC和DI的基础,AOP组件用来实现面向切面编程。 Spring的6个特征: 核心技术:依赖注入(DI),AOP,事件(Events),资源,i18n,验证,数据绑定,类型转换,SpEL。 测试:模拟对象,TestContext框架,Spring MVC测试,WebTestClient。 数据访问:事务,DAO支持,JDBC,ORM,编组XML。 Web支持:Spring MVC和Spring WebFlux Web框架。 集成:远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。 语言:Kotlin,Groovy,动态语言。 列举一些重要的Spring模块? Spring Core:核心,可以说Spring其他所有的功能都依赖于该类库。主要提供IOC和DI功能。 Spring Aspects:该模块为与AspectJ的集成提供支持。 Spring AOP:提供面向切面的编程实现。 Spring JDBC:Java数据库连接。 Spring JMS:Java消息服务。 Spring ORM:用于支持Hibernate等ORM工具。 Spring Web:为创建Web应用程序提供支持。 Spring Test:提供了对JUnit和TestNG测试的支持。 谈谈自己对于Spring IOC和AOP的理解 IOC(Inversion Of Controll,控制反转)是一种设计思想: 在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC在其他语言中也有应用,并非Spring特有。IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。 将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。在实际项目中一个Service类可能由几百甚至上千个类作为它的底层,假如我们需要实例化这个Service,可能要每次都搞清楚这个Service所有底层类的构造函数,这可能会把人逼疯。如果利用IOC的话,你只需要配置好,然后在需要的地方引用就行了,大大增加了项目的可维护性且降低了开发难度。 Spring中的bean的作用域有哪些? 1.singleton:该bean实例为单例 2.prototype:每次请求都会创建一个新的bean实例(多例)。 3.request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。 4.session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。 5.global-session:全局session作用域,仅仅在基于Portlet的Web应用中才有意义,Spring5中已经没有了。Portlet是能够生成语义代码(例如HTML)片段的小型Java Web插件。它们基于Portlet容器,可以像Servlet一样处理HTTP请求。但是与Servlet不同,每个Portlet都有不同的会话。 Spring中的单例bean的线程安全问题了解吗? 概念用于理解:大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。 有两种常见的解决方案(用于回答的点): 1.在bean对象中尽量避免定义可变的成员变量(不太现实)。 2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal(线程本地化对象)中(推荐的一种方式)。 ThreadLocal解决多线程变量共享问题(参考博客):https://segmentfault.com/a/1190000009236777 Spring中Bean的生命周期: 1.Bean容器找到配置文件中Spring Bean的定义。 2.Bean容器利用Java Reflection API创建一个Bean的实例。 3.如果涉及到一些属性值,利用set方法设置一些属性值。 4.如果Bean实现了BeanNameAware接口,调用setBeanName方法,传入Bean的名字。 5.如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader方法,传入ClassLoader对象的实例。 6.如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory方法,传入ClassLoader对象的实例。 7.与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。 8.如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执postProcessBeforeInitialization方法。 9.如果Bean实现了InitializingBean接口,执行afeterPropertiesSet方法。 10.如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。 11.如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization方法。 12.当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy方法。 13.当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。 Spring框架中用到了哪些设计模式? 1.工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。 2.代理设计模式:Spring AOP功能的实现。 3.单例设计模式:Spring中的bean默认都是单例的。 4.模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到了模板模式。 5.包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。 6.观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。 7.适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。 还有很多。。。。。。。 @Component和@Bean的区别是什么 1.作用对象不同。@Component注解作用于类,而@Bean注解作用于方法。 2.@Component注解通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用@ComponentScan注解定义要扫描的路径)。@Bean注解通常是在标有该注解的方法中定义产生这个bean,告诉Spring这是某个类的实例,当我需要用它的时候还给我。 3.@Bean注解比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候,就只能通过@Bean注解来实现。 @Configuration public class AppConfig { @Bean public TransferService transferService { return new TransferServiceImpl; } } <beans> <bean id="transferService" class="com.kk.TransferServiceImpl"/> </beans> @Bean public OneService getService(status) { case (status) { when 1: return new serviceImpl1; when 2: return new serviceImpl2; when 3: return new serviceImpl3; } } 将一个类声明为Spring的bean的注解有哪些? 声明bean的注解: @Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service层) @Repository 在数据访问层使用(dao层) @Controller 在展现层使用,控制器的声明 注入bean的注解: @Autowired:由Spring提供 @Inject:由JSR-330提供 @Resource:由JSR-250提供 *扩:JSR 是 java 规范标准 Spring事务管理的方式有几种? 1.编程式事务:在代码中硬编码(不推荐使用)。 2.声明式事务:在配置文件中配置(推荐使用),分为基于XML的声明式事务和基于注解的声明式事务。 Spring事务中的隔离级别有哪几种? 在TransactionDefinition接口中定义了五个表示隔离级别的常量:ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 Spring事务中有哪几种事务传播行为? 在TransactionDefinition接口中定义了八个表示事务传播行为的常量。 支持当前事务的情况:PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。 不支持当前事务的情况:PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。 其他情况:PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。 二、SpringMVC篇 什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。 Spring MVC的工作原理了解嘛? image.png Springmvc的优点: (1)可以支持各种视图技术,而不仅仅局限于JSP; (2)与Spring框架集成(如IoC容器、AOP等); (3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。 (4) 支持各种请求资源的映射策略。 Spring MVC的主要组件? (1)前端控制器 DispatcherServlet(不需要程序员开发) 作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。 (2)处理器映射器HandlerMapping(不需要程序员开发) 作用:根据请求的URL来查找Handler (3)处理器适配器HandlerAdapter 注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。 (4)处理器Handler(需要程序员开发) (5)视图解析器 ViewResolver(不需要程序员开发) 作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view) (6)视图View(需要程序员开发jsp) View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等) springMVC和struts2的区别有哪些? (1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。 (2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。 (3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。 SpringMVC怎么样设定重定向和转发的? (1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4" (2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com" SpringMvc怎么和AJAX相互调用的? 通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 : (1)加入Jackson.jar (2)在配置文件中配置json的映射 (3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。 如何解决POST请求中文乱码问题,GET的又如何处理呢? (1)解决post请求乱码问题: 在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8; <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> (2)get请求中文参数出现乱码解决方法有两个: ①修改tomcat配置文件添加编码与工程编码一致,如下: <ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> ②另外一种方法对参数进行重新编码: String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8") ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。 Spring MVC的异常处理 ? 统一异常处理: Spring MVC处理异常有3种方式: (1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; (2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器; (3)使用@ExceptionHandler注解实现异常处理; 统一异常处理的博客:https://blog.csdn.net/ctwy291314/article/details/81983103 SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决? 是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写成员变量。(此题目类似于上面Spring 中 第5题 有两种解决方案) SpringMVC常用的注解有哪些? @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。 @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。 @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。 SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代? 一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置? 可以在@RequestMapping注解里面加上method=RequestMethod.GET。 怎样在方法里面得到Request,或者Session? 直接在方法的形参中声明request,SpringMVC就自动把request对象传入。 如果想在拦截的方法里面得到从前台传入的参数,怎么得到? 直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象? 直接在方法中声明这个对象,SpringMVC就自动会把属性赋值到这个对象里面。 SpringMVC中函数的返回值是什么? 返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的。 SpringMVC用什么对象从后台向前台传递数据的? 通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以拿到数据。 怎么样把ModelMap里面的数据放入Session里面? 可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。 SpringMvc里面拦截器是怎么写的: 有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可: <!-- 配置SpringMvc的拦截器 --> <mvc:interceptors> <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 --> <bean id="myInterceptor" class="com.zwp.action.MyHandlerInterceptor"></bean> <!-- 只针对部分请求拦截 --> <mvc:interceptor> <mvc:mapping path="/modelMap.do" /> <bean class="com.zwp.action.MyHandlerInterceptorAdapter" /> </mvc:interceptor> </mvc:interceptors> 注解原理: 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池 三、Mybatis篇 什么是MyBatis? MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。 讲下MyBatis的缓存 MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有, 二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable序列化接口, 可在它的映射文件中配置<cache/> Mybatis是如何进行分页的?分页插件的原理是什么? 1)Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。 2)分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。 举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10 简述Mybatis的插件运行原理,以及如何编写一个插件? 1)Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、 Executor这4种接口的插件,Mybatis通过动态代理, 为需要拦截的接口生成代理对象以实现接口方法拦截功能, 每当执行这4种接口对象的方法时,就会进入拦截方法, 具体就是InvocationHandler的invoke方法,当然, 只会拦截那些你指定需要拦截的方法。 2)实现Mybatis的Interceptor接口并复写intercept方法, 然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可, 记住,别忘了在配置文件中配置你编写的插件。 Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不? 1)Mybatis动态sql可以让我们在Xml映射文件内, 以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。 2)Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。 3)其执行原理为,使用OGNL从sql参数对象中计算表达式的值, 根据表达式的值动态拼接sql,以此来完成动态sql的功能。 #{}和${}的区别是什么? 1)#{}是预编译处理,${}是字符串替换。 2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值(有效的防止SQL注入); 3)Mybatis在处理${}时,就是把${}替换成变量的值。 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里? Hibernate属于全自动ORM映射工具, 使用Hibernate查询关联对象或者关联集合对象时, 可以根据对象关系模型直接获取,所以它是全自动的。 而Mybatis在查询关联对象或关联集合对象时, 需要手动编写sql来完成,所以,称之为半自动ORM映射工具。 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? 1)Mybatis仅支持association关联对象和collection关联集合对象的延迟加载, association指的就是一对一,collection指的就是一对多查询。 在Mybatis配置文件中, 可以配置是否启用延迟加载lazyLoadingEnabled=true|false。 2)它的原理是,使用CGLIB创建目标对象的代理对象, 当调用目标方法时,进入拦截器方法, 比如调用a.getB.getName, 拦截器invoke方法发现a.getB是null值, 那么就会单独发送事先保存好的查询关联B对象的sql, 把B查询上来,然后调用a.setB(b), 于是a的对象b属性就有值了, 接着完成a.getB.getName方法的调用。 这就是延迟加载的基本原理。 MyBatis与Hibernate有哪些不同? 1)Mybatis和hibernate不同,它不完全是一个ORM框架, 因为MyBatis需要程序员自己编写Sql语句, 不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句, 并将java对象和sql语句映射生成最终执行的sql, 最后将sql执行的结果再映射生成java对象。 2)Mybatis学习门槛低,简单易学,程序员直接编写原生态sql, 可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发, 例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁, 一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性, 如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。 3)Hibernate对象/关系映射能力强,数据库无关性好, 对于关系模型要求高的软件(例如需求固定的定制化软件) 如果用hibernate开发可以节省很多代码,提高效率。 但是Hibernate的缺点是学习门槛高,要精通门槛更高, 而且怎么设计O/R映射,在性能和对象模型之间如何权衡, 以及怎样用好Hibernate需要具有很强的经验和能力才行。 总之,按照用户的需求在有限的资源环境下只要能做出维护性、 扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。 MyBatis的好处是什么? 1)MyBatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写, 给程序的维护带来了很大便利。 2)MyBatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象, 大大简化了Java数据库编程的重复工作。 3)因为MyBatis需要程序员自己去编写sql语句, 程序员可以结合数据库自身的特点灵活控制sql语句, 因此能够实现比Hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系? Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。 在Xml映射文件中,<parameterMap>标签会被解析为ParameterMap对象, 其每个子元素会被解析为ParameterMapping对象。 <resultMap>标签会被解析为ResultMap对象, 其每个子元素会被解析为ResultMapping对象。 每一个<select>、<insert>、<update>、<delete> 标签均会被解析为MappedStatement对象, 标签内的sql会被解析为BoundSql对象。 什么是MyBatis的接口绑定,有什么好处? 接口映射就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置. 接口绑定有几种实现方式,分别是怎么实现的? 接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加 上@Select@Update等注解里面包含Sql语句来绑定, 另外一种就是通过xml里面写SQL来绑定,在这种情况下, 要指定xml映射文件里面的namespace必须为接口的全路径名. 什么情况下用注解绑定,什么情况下用xml绑定? 当Sql语句比较简单时候,用注解绑定;当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多 MyBatis实现一对一有几种方式?具体怎么操作的? 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成; 嵌套查询是先查一个表,根据这个表里面的结果的外键id, 去再另外一个表里面查询数据,也是通过association配置, 但另外一个表的查询通过select属性配置。 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别? 能,Mybatis不仅可以执行一对一、一对多的关联查询, 还可以执行多对一,多对多的关联查询,多对一查询, 其实就是一对一查询,只需要把selectOne修改为selectList即可; 多对多查询,其实就是一对多查询,只需要把selectOne修改为selectList即可。 关联对象查询,有两种实现方式,一种是单独发送一个sql去查询关联对象, 赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询, 一部分列是A对象的属性值,另外一部分列是关联对象B的属性值, 好处是只发一个sql查询,就可以把主对象和其关联对象查出来。 MyBatis里面的动态Sql是怎么设定的?用什么语法? MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现, 但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有 内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or 开始,那么会自动把这个and或者or取掉。 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? 第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。 第二种是使用sql列的别名功能,将列别名书写为对象属性名, 比如T_NAME AS NAME,对象属性名一般是name,小写, 但是列名不区分大小写,Mybatis会忽略列名大小写,