天天看點

SQLServer 2008 MyBatis+聯合主鍵+批量插入+忽略重複資料+聯合外鍵

需求:批量添加裝置,每一個裝置,都從屬于各自網絡節點下的某個控制器。裝置有多條定時資訊。

分析:1.批量插入裝置資料,在裝置數量較多時可以提升效率。

           2.該裝置隻能通過網絡節點id,控制器id和自身id确認唯一性。是以需要使用聯合主鍵。

           3.可能有重複資料存在,如節點1_控制器1_裝置1多次嘗試添加自己。需要忽略重複資料。

           4.定時資訊表需要外鍵映射裝置表,裝置表示聯合主鍵,是以定時資訊表需要添加聯合外鍵。本例中,定時表外鍵關聯隻關心删除功能,即,删除某個裝置後,會自動将外鍵關聯的定時資訊一起删除。

該問題可以在建表時解決。

           1.設定聯合主鍵确定一個裝置。

           2.MyBatis批量插入的xml寫法,必須所有元素均不得為空

           3.使用IGNORE_DUP_KEY=ON忽略重複資料。避免批量插入發生重複時抛出異常,資料復原。

           4.給定時資訊表添加外鍵,關聯删除

逐個解決:

1.建表

裝置表:建表和設定聯合主鍵,聯合主鍵的組成元素都要設定不得為null。如下建表,設定了“IGNORE_DUP_KEY = ON”,即可忽略重複資料

if exists (select * from sysobjects where id = OBJECT_ID('[SysDevice]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [SysDevice]


CREATE TABLE [SysDevice] (
[Id] [int]  IDENTITY (1, 1)  NOT NULL,
[Station_Address] [varchar]  (100) NOT NULL,
[Controller_Addr] [varchar]  (100) NOT NULL,
[Device_Addr] [varchar]  (100)NOT NULL,
)


alter table [SysDevice] add constraint PK_Id primary key(Station_Addressasc,Controller_Addr asc,Device_Addr asc)WITH (IGNORE_DUP_KEY = ON);
           

定時表:建表和添加外鍵關聯裝置表

if exists (select * from sysobjects where id = OBJECT_ID('[Timing]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [Timing]

CREATE TABLE [Timing] (
[Id] [int]  IDENTITY (1, 1)  NOT NULL,
[Start_Time] [datetime]  NULL,
[End_Time] [datetime]  NULL,
[Create_Time] [datetime]  NULL,
[Station_Address] [varchar]  (100) NOT NULL,
[Controller_Addr] [varchar]  (100) NOT NULL,
[Device_Addr] [varchar]  (100)NOT NULL,
CONSTRAINT Timing_fk FOREIGN KEY ([Station_Address], [Controller_Addr],[Device_Addr]) REFERENCES SysDevice ([Station_Address], [Controller_Addr],[Device_Addr]) on delete cascade
)

ALTER TABLE [Timing] WITH NOCHECK ADD  CONSTRAINT [PK_Timing] PRIMARY KEY  NONCLUSTERED ( [Id] )
           

MyBatis批量插入寫法。

mapper.java

int insertBatch(@Param("list") List<Device> list);
           

mapper.xml

<insert id="insertBatch" parameterType="java.util.List">
    insert into SysDevice
    (Station_Address,Controller_Addr,Device_Addr,Device_Type)
    values
    <foreach collection="list" item="item" index="index" separator=",">
      (#{item.stationAddress},#{item.controllerAddr},#{item.deviceAddr},#{item.deviceType})
    </foreach>
  </insert>
           

除了id自增長,其餘屬性都不得為空

繼續閱讀