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