需求:批量添加裝置,每一個裝置,都從屬于各自網絡節點下的某個控制器。裝置有多條定時資訊。
分析: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自增長,其餘屬性都不得為空