多条插入拼接

本文介绍了一种使用C#和SQL结合的方式来自动生成更新语句的方法。通过遍历菜单实体集合,动态构建SQL语句来更新数据库表中的字段。此方法适用于需要批量更新相似结构数据的场景。
  string sql = @"update a 
                            set a.M_ParentID=b.M_ParentID,
                            a.M_Name=b.M_Name,
                            a.M_Seq=b.M_Seq,
                            a.M_IsDel=b.M_IsDel
                            from SysMenu_BySchool a
                            inner join (";
            foreach (SysMenu_BySchoolEntity m in lstMenu)
            {
                sql += string.Format("select {0} ID,{1} as M_ParentID,'{2}' as M_Name,{3} as M_Seq,{4} as M_IsDel union ", m.ID, m.M_ParentID, Utils2.ValidChar(m.M_Name), m.M_Seq,m.M_IsDel.ToString());
            }
            sql = sql.TrimEnd(" union ".ToCharArray());
            sql += ") b on a.ID=b.ID";
            return dal.UpdateCommand(sql, null);

 

转载于:https://www.cnblogs.com/muxueyuan/p/5413572.html

### 批量插入数据到数据库中的方法 在数据库操作中,批量插入是一种高效的方式,可以显著减少与数据库的交互次数,从而提高性能。以下是几种常见的批量插入数据的方法。 #### 方法一:使用 JDBC 的批处理功能 通过 JDBC 的 `addBatch()` 和 `executeBatch()` 方法,可以将多条 SQL 语一次性发送给数据库执行,避免每条数据单独与数据库交互的问题[^1]。 ```java import cn.itcast.utils.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class Demo03_批量插入数据2 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; try { // 获取连接对象 conn = JDBCUtils.getConnection(); // 定义 SQL 语 String sql = "insert into account(name) values(?)"; // 创建 PreparedStatement 对象 pstmt = conn.prepareStatement(sql); for (int i = 1; i <= 20000; i++) { pstmt.setObject(1, "name" + i); pstmt.addBatch(); // 添加到批处理中 if (i % 1000 == 0) { // 每 1000 条提交一次 pstmt.executeBatch(); pstmt.clearBatch(); } } pstmt.executeBatch(); // 提交剩余的数据 } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(pstmt, conn); } } } ``` 此方法通过 `addBatch()` 将多条 SQL 语加入批处理队列,并通过 `executeBatch()` 一次性发送给数据库执行。这样可以大幅减少与数据库的交互次数,提升性能[^1]。 --- #### 方法二:使用 `UNION ALL` 拼接批量数据 对于 Oracle 数据库,可以通过拼接多条 `INSERT INTO ... VALUES` 语并使用 `UNION ALL` 合并成一条 SQL 语,然后一次性执行插入操作[^2]。 ```sql INSERT INTO oracle_table (id, code) SELECT 1, '1' FROM dual UNION ALL SELECT 2, '2' FROM dual UNION ALL SELECT 3, '3' FROM dual UNION ALL SELECT 4, '4' FROM dual; ``` 这种方法适合需要一次性插入少量数据的情况。如果数据量较大,则可能需要结合程序动态生成 SQL 语[^2]。 --- #### 方法三:使用存储过程批量插入 通过编写存储过程,可以在数据库端直接实现批量插入操作。以下是一个示例: ```sql BEGIN INSERT INTO oracle_table (id, code) VALUES (1, '1'); INSERT INTO oracle_table (id, code) VALUES (2, '2'); INSERT INTO oracle_table (id, code) VALUES (3, '3'); INSERT INTO oracle_table (id, code) VALUES (4, '4'); END; ``` 这种方法的优点是所有插入操作都在数据库端完成,减少了网络传输开销。但需要注意存储过程的编写和调用复杂度[^3]。 --- #### 方法四:使用 SSM 框架的批量插入 在基于 SSM(Spring、Spring MVC、MyBatis)框架的应用中,可以通过 MyBatis 的批量插入功能实现高效的数据插入[^3]。 ##### DAO 层接口定义 ```java @Repository public interface SysUserDao { // 批量插入数据 public int insertSysUserBatch(List<SysUser> sysUserList); } ``` ##### Mapper XML 配置 ```xml <insert id="insertSysUserBatch" parameterType="java.util.List"> INSERT INTO sys_user (name, age) VALUES <foreach collection="list" item="user" separator=","> (#{user.name}, #{user.age}) </foreach> </insert> ``` 此方法利用 MyBatis 的 `<foreach>` 标签将列表数据动态拼接成批量插入语,适合大规模数据插入场景[^3]。 --- ### 性能优化建议 1. **关闭自动提交**:在 JDBC 中,可以通过 `conn.setAutoCommit(false)` 关闭自动提交,手动控制事务提交时间。 2. **合理设置批处理大小**:根据实际需求调整每次批处理的数据量,通常 500-1000 条为一组较为合适。 3. **使用索引优化**:确保目标表的主键和唯一约束不会导致插入失败或性能下降。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值