映射文件的使用

在WIN32种,通过使用映像文件在进程间实现共享文件或内存共享,如果利用相同的映像名字或文件句柄,则不同的进程可以通过一个指针来读写同一个文件或者同一内存数据块,并把他们当成该进程内存空间的一部分。
    内存映像文件可以映射一个文件、一个文件中的指定区域或者指定的内存块,其中的数据就可以用内存读取指令来直接访问,而不用频繁的使用操作文件的I/O系统函数,从而提高文件的存取速度和效率。
    映像文件的另一个重要作用就是用来支持永久命名的共享内存。要在两个应用程序之间共享内存,可以在一个应用程序中创建一个文件并映射,然后另外一个程序通过打开和映射此文件,并把它当作自己进程的内存来使用。事实上,此内存是所有进程共享的。 
    下面将先描述一下几个操作内存的API函数
1、创建内存映射的API函数
This function creates a named or unnamed file-mapping object for the specified file.
HANDLE CreateFileMapping(
//通过调用fileopen or FileCreate后返回的文件句柄,如果是内存,则//$FFFFFFFF
  HANDLE hFile, 
   //安全性结构,一般null
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes, 
   //文件试图的保护类型,PAGE_READONLY,PAGE_READWRITE,
  DWORD flProtect, 
  //文件大小的高32位,一般设置为0,除非文件大于4G
  DWORD dwMaximumSizeHigh, 
  //文件大小低32位
  DWORD dwMaximumSizeLow, 
  //映射的名字
  LPCTSTR lpName 
);
2、打开一个映射文件
HANDLE OpenFileMapping(
  //访问数据模式:FILE_MAP_ALL_ACCESS,FILE_MAP_COPY,FILE_MAP_READ,  //FILE_MAP_WRITE
  DWORD dwDesiredAccess,
  //子进程是否可以继承
  BOOL bInheritHandle,
  //映射文件名
  LPCTSTR lpName
);
3、将映射文件映射到本进程的API函数
LPVOID MapViewOfFile( 
  //通过CreateFileMapping或OpenFileMapping返回的文件句柄
  HANDLE hFileMappingObject, 
  //访问的数据模式:FILE_MAP_WRITE,FILE_MAP_READ,FILE_MAP_ALL_ACCESS
  DWORD dwDesiredAccess, 
  //指定数据在映射文件中起始位置的高32位
  DWORD dwFileOffsetHigh, 
  //低32位
  DWORD dwFileOffsetLow, 
  //需要映射的大小,0表示全部
  DWORD dwNumberOfBytesToMap 
);
4、关闭映射的api函数
BOOL UnmapViewOfFile( 
  //由MapViewofFile产生的映射文件的地址
  LPCVOID lpBaseAddress 
);
5、下面例子中还会用到的几个api函数
创建互斥对象
HANDLE WINAPI CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  BOOL bInitialOwner,
  LPCTSTR lpName
);
DWORD WaitForSingleObject( 
  HANDLE hHandle, 
  DWORD dwMilliseconds 
); 
     上文中曾经提到我们使用内存映射的方式来在多个程序或DLL中共享数据。下面就通过一个程序来介绍。
    虽然我要描述的是再两个应用程序之间共享数据,不过为了省事,我将所有的内容都写在一个程序中,你只需要把此程序打开两次就可以了。一个程序用来建立内存映射文件,另外一个程序用来打开内存映射文件。并通过对公共内存的读写操作来演示信息共享。
    程序的窗体单元代码如下:
object Form1: TForm1
  Left = 236
  Top = 147
  Width = 327
  Height = 412
  Caption = ’MyMapForm_1’
  Color = clBtnFace
  Font.Charset = ANSI_CHARSET
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = ’宋体’
  Font.Style = []
  OldCreateOrder = False
  OnClose = FormClose
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object GroupBox1: TGroupBox
    Left = 0
    Top = 0
    Width = 319
    Height = 121
    Align = alTop
    Caption = ’共享内存的信息[发送]’
    TabOrder = 0
    object Label1: TLabel
      Left = 16
      Top = 24
      Width = 26
      Height = 13
      Caption = ’数据’
    end
    object Label2: TLabel
      Left = 16
      Top = 48
      Width = 39
      Height = 13
      Caption = ’修改者’
    end
    object Label3: TLabel
      Left = 16
      Top = 80
      Width = 52
      Height = 13
      Caption = ’修改时间’
    end
    object edData: TEdit
      Left = 75
      Top = 21
      Width = 230
      Height = 21
      TabOrder = 0
    end
    object edModifyUser: TEdit
      Left = 74
      Top = 49
      Width = 231
      Height = 21
      TabOrder = 1
    end
    object edModifyTime: TEdit
      Left = 74
      Top = 73
      Width = 231
      Height = 21
      Enabled = False
      TabOrder = 2
    end
  end
  object Panel1: TPanel
    Left = 0
    Top = 242
    Width = 319
    Height = 121
    Align = alClient
    BevelOuter = bvNone
    TabOrder = 1
    object btnCreate: TButton
      Left = 32
      Top = 8
      Width = 113
      Height = 25
      Caption = ’新建内存映射’
      TabOrder = 0
      OnClick = btnCreateClick
    end
    object btnOpen: TButton
      Left = 160
      Top = 8
      Width = 113
      Height = 25
      Caption = ’打开已存在映射’
      TabOrder = 1
      OnClick = btnOpenClick
    end
    object btnRead: TButton
      Left = 160
      Top = 45
      Width = 113
      Height = 25
      Caption = ’读取映射信息’
      TabOrder = 2
      OnClick = btnReadClick
    end
    object btnSet: TButton
      Left = 32
      Top = 45
      Width = 113
      Height = 25
      Caption = ’设置内存信息’
      TabOrder = 3
      OnClick = btnSetClick
    end
    object btnClose: TButton
      Left = 32
      Top = 85
      Width = 113
      Height = 25
      Caption = ’关闭映射’
      TabOrder = 4
      OnClick = btnCloseClick
    end
    object btnClear: TButton
      Left = 160
      Top = 85
      Width = 113
      Height = 25
      Caption = ’清空编辑狂’
      TabOrder = 5
      OnClick = btnClearClick
    end
  end
  object StatusBar1: TStatusBar
    Left = 0
    Top = 363
    Width = 319
    Height = 19
    Panels = <
      item
        Width = 200
      end>
  end
  object GroupBox2: TGroupBox
    Left = 0
    Top = 121
    Width = 319
    Height = 121
    Align = alTop
    Caption = ’共享内存的信息[接收]’
    Enabled = False
    TabOrder = 3
    object Label4: TLabel
      Left = 16
      Top = 24
      Width = 26
      Height = 13
      Caption = ’数据’
    end
    object Label5: TLabel
      Left = 16
      Top = 48
      Width = 39
      Height = 13
      Caption = ’修改者’
    end
    object Label6: TLabel
      Left = 16
      Top = 80
      Width = 52
      Height = 13
      Caption = ’修改时间’
    end
    object edRData: TEdit
      Left = 75
      Top = 21
      Width = 230
      Height = 21
      TabOrder = 0
    end
    object edRUser: TEdit
      Left = 74
      Top = 49
      Width = 231
      Height = 21
      TabOrder = 1
    end
    object edRTime: TEdit
      Left = 74
      Top = 73
      Width = 231
      Height = 21
      Enabled = False
      TabOrder = 2
    end
  end
end
   程序的代码主要分为两部分,comm.pas单元中定义几个对操作内存映射的函数,以及共享内存的结构信息。代码如下:
...{
      作者:           wudi_1982
      联系方式:       wudi_1982@hotmail.com
      开发工具以及平台:DELPHI7+WINXP
      转载请注明出处
}
unit comm;
interface
uses
  Windows,SysUtils;
const
  FILEMAPPINGNAME = ’MyFileMapping’; // 指定内存映射的名字
  MUTEXNAME= ’MutexName’; //互斥对象的名字
type
TShareMem = record //共享内存的结构信息
  Data       : array[0..255] of char;  //描述共享数据信息
  ModifyUser : array[0..255] of char;  //对数据的修改者
  ModifyTime : array[0..7] of char;    //数据最近一次的修改时间
end;
PShareMem = ^TShareMem;
var
  FileMapHandle : THandle;  //建立映射的句柄
  MutexHandle : THandle;  // 互斥对象的句柄
  ShareMem : PShareMem;  //一个指向共享内存的指针
function OpenMap:THandle; //打开一个映射文件并映射到本进程中
function CreateMap:THandle; //新建一个映射文件并映射到本进程中
function LockMap:boolean;   //加锁
procedure UnLockMap;        //解锁
procedure CloseMap;         //关闭映射
function ReadCommData:TShareMem;  //从共享信息中读取数据
procedure WriteCommData(data,user,time : string);//对共享内存进行写操作
implementation
function OpenMap:THandle;
begin
  //打开映射文件
  FileMapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, //所有权限
              false,   //子进程不可继承
              FILEMAPPINGNAME
  );
  if FileMapHandle <> 0 then  //如果映射文件打开成功
  begin
     //将映射文件映射到本进程
     ShareMem := pSharemem(MapViewOfFile(FileMapHandle,FILE_MAP_ALL_ACCESS,0,0,0));
     if ShareMem = nil then
     begin
       CloseHandle(FileMapHandle);
       Result := 0;
     end else begin
       //初始化共享区域
       FillChar(ShareMem^,sizeof(TSharemem),0);
       Result := FileMapHandle;
     end;
  end else Result := 0;
end;
function CreateMap:THandle;
begin
  FileMapHandle := CreateFileMapping($FFFFFFFF,//内存映射
  nil,
  PAGE_READWRITE,//读写操作
  0,//高32位 ,一般为0,除非要映射的文件大于4G
  sizeof(TShareMem),
  FILEMAPPINGNAME
  );
  if FileMapHandle <> 0 then
  begin
    ShareMem := pSharemem(MapViewOfFile(FileMapHandle,FILE_MAP_ALL_ACCESS,0,0,0));
    if ShareMem = nil then
    begin
      CloseHandle(FileMapHandle);
      Result := 0;
    end else Result := FileMapHandle;
  end else Result := 0;
end;
function LockMap:boolean;
begin
   //创建一个互斥对象并加锁
   MutexHandle := CreateMutex(nil,false,MUTEXNAME);
   if MutexHandle <> 0 then
   begin
     if WaitForSingleObject(MutexHandle,1000)= WAIT_FAILED then Result := false
     else Result := true;
   end else Result := false;
end;
procedure UnLockMap;
begin
  //释放资源
  if MutexHandle <> 0 then
  begin
     ReleaseMutex(MutexHandle);
     CloseHandle(MutexHandle);
  end;
end;
procedure CloseMap;
begin
   // 关闭映射并释放资源
   if ShareMem <> nil then UnmapViewOfFile(ShareMem);
   if FileMapHandle <> 0 then CloseHandle(FileMapHandle);
end;
function ReadCommData:TShareMem;
var
  tm : TShareMem;
begin
  with tm do
  begin
    Data := ShareMem^.Data;
    ModifyUser := ShareMem^.ModifyUser;
    ModifyTime := ShareMem^.ModifyTime;
  end;
  Result := tm;
end;
procedure WriteCommData(data,user,time : string);
begin
   StrCopy(ShareMem^.Data,pchar(data));
   StrCopy(ShareMem^.ModifyUser,pchar(user));
   StrCopy(ShareMem^.ModifyTime,pchar(time));
end;
end.
代码的另一个部分就是根据需要调用这些函数的FirstTest.pas,即上面窗体单元对应的代码
...{
      作者:           wudi_1982
      联系方式:       wudi_1982@hotmail.com
      开发工具以及平台:DELPHI7+WINXP
      转载请注明出处
}
unit FirstTest;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
const
  WM_MYMESSAGE=WM_USER+1024; //一个自定义消息,用来通知接受程序数据到达
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edData: TEdit;
    edModifyUser: TEdit;
    edModifyTime: TEdit;
    Panel1: TPanel;
    btnCreate: TButton;
    btnOpen: TButton;
    btnRead: TButton;
    btnSet: TButton;
    btnClose: TButton;
    btnClear: TButton;
    StatusBar1: TStatusBar;
    GroupBox2: TGroupBox;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    edRData: TEdit;
    edRUser: TEdit;
    edRTime: TEdit;
    procedure btnCreateClick(Sender: TObject);
    procedure btnOpenClick(Sender: TObject);
    procedure btnSetClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure btnReadClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnClearClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    atm : TAtom; //一个原子
    nextwindow : string; //被发送消息程序的标题信息
    procedure MyMessage(var msg : TMessage);message WM_MYMESSAGE; //自定义消息的处理
  public
  end;
var
  Form1: TForm1;
implementation
uses comm;
...{$R *.dfm}
procedure TForm1.btnCreateClick(Sender: TObject);
begin
  if CreateMap = 0 then
    ShowMessage(’内存映射建立失败’)
  else begin
    btnCreate.Enabled := false;
    btnOpen.Enabled := false;
    StatusBar1.Panels[0].Text := ’内存映射文件新建立完毕’
  end;
end;
procedure TForm1.btnOpenClick(Sender: TObject);
begin
   if OpenMap = 0 then
     ShowMessage(’内存映射打开失败’)
   else begin
     btnCreate.Enabled := false;
     btnOpen.Enabled := false;
     StatusBar1.Panels[0].Text := ’内存映射文件打开完毕’
   end;
end;
procedure TForm1.btnSetClick(Sender: TObject);
var
  hd : THandle;
begin
   if (edData.Text = ’’) or (edModifyUser.Text = ’’) then
      ShowMessage(’请填写完整信息’)
   else begin
     edModifyTime.Text := FormatDateTime(’mm:hh:mm’,Now);
     WriteCommData(edData.Text,edModifyUser.Text,edModifyTime.Text);
    //查找此程序的另外一个实例,如果找到,发送数据到达的消息
     hd := FindWindow(nil,pchar(nextwindow));
     if hd <> 0 then
       SendMessage(hd,WM_MYMESSAGE,1,0);
   end;
end;
procedure TForm1.btnCloseClick(Sender: TObject);
begin
  UnLockMap;
  CloseMap;
  btnCreate.Enabled := true;
  btnOpen.Enabled := true;
end;
procedure TForm1.btnReadClick(Sender: TObject);
var
  tm : TShareMem;
begin
   tm := ReadCommData;
   edRData.Text := tm.Data;
   edRUser.Text := tm.ModifyUser;
   edrTime.Text := tm.ModifyTime;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnLockMap;
  CloseMap;
  //下面这一句非常重要,如果不及时删除原子表中添加的原子,
  //怕是只有重启计算机才能干掉程序启动时添加到原子表中的信息了
  GlobalDeleteAtom(atm);
end;
procedure TForm1.btnClearClick(Sender: TObject);
begin
   edData.Text := ’’;
   edModifyUser.Text := ’’;
   edModifyTime.Text := ’’;
end;
procedure TForm1.MyMessage(var msg: TMessage);
begin
  if msg.WParam = 1 then
  begin
    Application.BringToFront;
    StatusBar1.Panels[0].Text := ’新数据到代’;
    btnReadClick(nil);
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   //下面的代码将在程序启动时执行,主要是通过原子表检查此程序是否运行,
   //本程序运行运行两个实例,一个用来建立映射文件,
   //一个用来打开映射文件,你完全可以用两个不同的程序来处理,这里为了方便
   //以及演示原子表的使用而采用一个程序执行两次的方法来做
   if GlobalFindAtom(pchar(’wudi_1982’)) <> 0 then//查找原子表如果第一个窗体已经存在
   begin
      if GlobalFindAtom(pchar(’jingyang’)) <> 0 then//如果第二个窗体也存在
      begin
        Application.Terminate;
      end else begin
        //添加原子到原子表,以记录此程序的第二个实例已经运行,并做相应操作
        atm := GlobalAddAtom(pchar(’jingyang’));
        Application.Title := ’MyMapForm_2’;
        Form1.Caption := ’MyMapForm_2’;
        nextwindow := ’MyMapForm_1’;
      end;
   end else begin
     //添加原子到原子表,以记录此程序的第一个实例已经运行,并做相应操作
     atm := GlobalAddAtom(pchar(’wudi_1982’));
     Application.Title := ’MyMapForm_1’;
     Form1.Caption := ’MyMapForm_1’;
     nextwindow := ’MyMapForm_2’;
   end;
end;
end.
程序运行效果图:

例程的使用方法:
        编译之后,运行此程序的两个实例,在其中一个实例中,点击按钮【新建内存映射】,另一个实例使用【打开已存在的映射】,然后在窗体的发送部分,填写相应信息,然后点击【设计内存信息】,就可以看到效果了。
       注:WINXP+D7;

转载于:https://www.cnblogs.com/railgunman/archive/2010/12/08/1900699.html

【项目实战】如何创建和使用MyBatis的映射文件 在 MyBatis 中,映射文件是用于定义 SQL 语句和映射结果集的 XML 文件。映射文件通常包含一个或多个或元素,每个元素定义了一个 SQL 语句和一个或多个参数映射。映射文件还可以包含元素,用于定义结果集的映射关系。要在 MyBatis 中使用映射文件,需要在配置文件中指定映射文件的位置。 阅读详情

相关推荐

1.1.4 运用防火墙实现入侵防御

摘要:本文详细介绍了某公司网络拓扑中防火墙FW1的配置过程。主要内容包括:1)通过web界面登录防火墙;2)配置三个接口的IP地址及所属安全区域;3)创建两个入侵防御配置文件(anti_untrust和anti_trust);4)配置安全策略untrust2dmz和trust2dmz,分别允许公网/内网访问WWW服务器;5)保存配置。操作步骤配有详细截图说明,涉及接口配置、安全区域划分、入侵防御策略设定等关键环节,最终实现内外网对服务器Server1的安全访问控制。(149字)

Ljs040411的博客 2130

Delphi 内存映射实现两个进程间通信

写入方代码 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type PShareMem = ^TShareMem; TShareMem = Record id:strin...

黑色小番茄的博客 941

【Linux 驱动开发】STM32MP1 LCD 显示系统完整实践指南

STM32MP1 LCD显示系统实践指南 本文全面介绍STM32MP1平台实现MIPI DSI LCD显示的完整流程,涵盖硬件连接、设备树配置、显示原理和驱动实现。主要内容包括: 硬件连接:详细说明MIPI DSI差分对、背光PWM、复位/供电管脚的连接方式 设备树配置: PWM背光控制节点设置 LTDC与DSI端口映射关系 Panel节点参数定义 显示基础:讲解LCD/OLED显示原理、常见接口类型(RGB/LVDS/MIPI/HDMI)及信号时序 驱动实现。

猫猫的小茶馆 493

内存映射文件、虚拟内存

Windows提供了3种进行内存管理的方法: •虚拟内存,最适合用来管理大型对象或结构数组。 •内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。 • 内存堆栈,最适合用来管理大量的小对象。 1.什么是内存映射文件,有啥作用 http://bbs.youkuaiyun.com/topics/340238673 通俗点,就是ReadFile和WriteFile这样的I/O系统函数, 在文件里来回地读、写、移动文件指针效率低 速...

八荒六合唯我独尊 452

LEC/FORMAL --- PARTIII debug

lec(logic equivalence checking)又叫formal check,是对ic design的综合,PR前后的设计进行逻辑对比检查的工具/手段,保证综合不改变rtl原始的logic function。目前用的较多的就是C家的formal工具。接下来介绍一下lec过程中遇到的问题以及debug手段。...

sinat_27691203的博客 7708

一文详解Stata重复测量方差分析的概念、原理、适用情形以及操作命令实现、对结果的解读、操作注意事项 附零基础小白友好入门Stata统计学/计量经济学学习路径

重复测量方差分析(Repeated Measures ANOVA)适用于同一受试者在不同时间点或条件下的多次测量数据,如疗效跟踪和跨条件对比研究。其核心特征包括:数据结构为每个受试者多个观测值,数据具有相关性(违反独立性假设),变异分解为个体间和个体内变异。关键假设包括正态性、方差齐性和球形性(通过Mauchly检验验证)。适用场景包括纵向研究和小样本追踪,但不适用于存在滞留效应或学习效应显著的数据。操作步骤涉及数据准备(宽/长格式转换)、正态性与球形性检验、主分析命令(单/多因素)及事后检验。

m0_72274883的博客 1565

Mybatis映射文件元素的作用与用法

*映射文件的作用 可以通过读取映射文件调用相应的方法,获取SqlSessionFactoty工厂对象;sql语句都写在映射文件中(查询,插入,删除,更新等) 在映射文件中,&lt;mapper&gt;元素是映射文件的根元素,其他元素都是它的子元素 1.&lt;select&gt;元素用来映射查询语句,它可以帮助我们从数据库中读取出数据,并组装数据给业务开发人员 2.&lt;inser...

z_ssyy的博客 2万+

Vivado实战:UltraScale/UltraScale+器件eFUSE寄存器配置与安全编程全解析

本文详细解析了Xilinx UltraScale/UltraScale+器件中eFUSE寄存器的配置与安全编程方法。从芯片唯一身份标识到加密密钥烧录,再到用户寄存器的灵活应用和安全控制寄存器的配置技巧,全面介绍了如何利用eFUSE功能提升硬件安全性。文章还提供了JTAG接口安全管理和NKZ文件备份方案,帮助开发者避免常见陷阱,确保安全编程的可靠性。

weixin_42535703的博客 427

SQL映射文件

@[TOC] SQL映射文件

weixin_45496051的博客 782

通达信波段交易公式实战:如何用副图指标精准捕捉买卖点(附完整源码)

本文深入解析通达信波段交易副图指标的构建与应用,提供完整源码实现,帮助投资者精准捕捉买卖点。通过趋势强度度量、超买超卖判断及信号过滤机制,结合K线图分析,有效提升波段交易的成功率。

weixin_29306317的博客 604

最新版 Akamai 逆向 风控破解

经过测试,捷星 jetstar.com,德州仪器 ti.com,w6 wizzair.com,还有一些航空公司的都是可以实现一个并发的有需要的可以。

m0_72605044的博客 6617

MyBatis中映射文件的使用

MyBatis中映射文件的使用

m0_69044845的博客 9022

YOLOv12改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例

本文记录的是。SimAM注意力模块通过优化能量函数来获得每个神经元的三维权重,而或增加计算复杂度。若是有轻量化需求的小伙伴,无参的注意力模块也许是一个不错的选择。

Limiiiing的博客 2906

Mybatis-映射文件的使用

简单介绍一下映射文件吧,映射文件指导着MyBatis如何进行数据库增删改查,有着非常重要的意义 insert、update、delete元素 这里就体现一下增删改查的时候如何编写映射文件 EmployeeMapper 接口类 public interface EmployeeMapper { //多条记录封装一个map:Map<Integer,Employee>:键是这条记录的主键,值是记录封装后的javaBean //@MapKey:告诉mybatis封装这个map的时候使用哪个

瘦身狂魔的博客 400

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MyBatis映射文件的使用

0.前言

阿璐4r的博客 428

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MyBatis XML 映射文件使用详解

使用这种方式的时候我们需要在配置文件中配置 mybatis xml 的文件路径:这里需要注意的是:resources文件夹之下的这个mapper文件夹的名字要和配置文件中classpath后端mapper的名字要保持一致。同时以上述的配置信息为例,mapper文件夹之下的xml文件一定是要以Mapper为结尾。

wxy963的博客 455

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

4.接口与映射文件结合使用

1.接口与映射文件 1.接口中的方法名必须要和映射文件中的Id名字相同比如下面接口中方法名为“getUser” 1 package com.zhiyou100.wc.dao; 2 3 import java.util.List; 4 5 import org.apache.ibatis.annotations.Param; 6 7 import...

dizanchan3237的博客 424

MyBatis的使用(XML映射文件)

可以随着条件的改变随之发生改变的SQL语句就是动态SQL,在MyBatis中只有XML映射文件的方式支持动态SQL动态SQL使用-IF< if >标签的核心功能对条件进行判断,当条件为true,则标签中的内容参与SQL拼接,否则不参与if标签中有一个核心属性test,基于test传递条件可以进行判断(1)在test条件中可以直接获取本次参数的内容并且不需要加#{}(2)test条件中可以基于=、!=、>、>=、<、<=对数据进行判断,并且可以基于and或者or进行多条件连接</

m0_65462447的博客 861

MyBatis 中的 SQL 映射文件如何配置参数映射,如何使用

在 MyBatis 中,参数映射是一个非常重要的概念。通过配置参数映射,我们可以将 Java 对象的属性映射到 SQL 语句的参数中,在执行 SQL 语句时,MyBatis 会自动将参数的值设置到 SQL 语句中。在 MyBatis 中,参数映射可以通过 #{} 占位符、${} 占位符和参数类型别名来进行配置。在使用参数映射时,我们可以使用 Mapper 接口方法参数或者动态 SQL 标签来使用它们。

徐师兄的博客 1129

spring 使用classpath方式加载hibernate映射文件

转载自:http://blog.youkuaiyun.com/javaalpha/article/details/9150869 spring 使用classpath方式加载hibernate映射文件 对应的Spring的版本:spring3.0 [html] view plaincopy           property name="mappingLocations"

光华小丸子 740

在Eclipse下使用hibernate tool生成映射文件以及实体

在java项目搭建时,一般可以通过: 1.实体类加映射文件正向生成数据库中对应的表. 2.通过数据库中表反向生成java对应的映射文件以及实体类 首先,http://www.hibernate.org/subprojects/tools.html下载插件,把下载中的文档相对应的放入eclipse文件中.(做过安装插件的,看到文件夹一般都知道怎么做的). 安装好后,Windo

5313

使用spring查找hibernate映射文件

LocalSessionFactoryBean有好几个属性用来查找hibernate映射文件:mappingResources、mappingLocations、mappingDirectoryLocations与mappingJarLocations他们的区别:mappingResources:指定classpath下具体映射文件名&lt;property name="mappingResour...

分享经验 280

mybatis映射文件使用foreach标签

使用foreach标签实现数组查询数据 测试: //根据gid数组查询商品 @Test public void testGoodsByGids(){ GoodsDao mapper = session.getMapper(GoodsDao.class); //当数组为空,即长度为0时,全查 int[] gids = {2,4}; List<Goods> goods = mapper.selGoodsByGids(gi

qq_38152400的博客 427

mybtis使用映射文件进行数据库操作

使用映射文件 (1) 准备工作 ① 创建mappers目录 ② 在application.properties中配置 mybatis.mapper-locations = classpath:mappers/*.xml (2) 创建Mapper接口,编写对应的方法 ackage com.upc.mybatis_02.mapper; import com.upc.mybatis_02.po.Salgrade; import org.apache.ibatis.annotations.Mapper; imp

Luo_LA的博客 492
上一篇: Delphi实现对注册表的监视和扫描[转]
下一篇: 实时的监控一个目录
aowo7144
博客等级 码龄10年 5粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值