【MyBatis】特殊SQL的执行

文章介绍了MyBatis中进行模糊查询、批量删除和动态设置表名的SQL示例,以及如何在插入操作后获取自增主键来更新关联数据。示例代码包括了注解和XML配置。

7、特殊SQL的执行

7.1、模糊查询

/**
* 测试模糊查询
* @param mohu
* @return
*/
List<User> testMohu(@Param("mohu") String mohu);
<!--List<User> testMohu(@Param("mohu") String mohu);-->
<select id="testMohu" resultType="User">
    <!--select * from t_user where username like '%${mohu}%'-->
    <!--select * from t_user where username like concat('%',#{mohu},'%')-->
    select * from t_user where username like "%"#{mohu}"%"
</select>

7.2、批量删除

/**
* 批量删除
* @param ids
* @return
*/
int deleteMore(@Param("ids") String ids);
<!--int deleteMore(@Param("ids") String ids);-->
<delete id="deleteMore">
	delete from t_user where id in (${ids})
</delete>

7.3、动态设置表名

/**
* 动态设置表名,查询所有的用户信息
* @param tableName
* @return
*/
List<User> getAllUser(@Param("tableName") String tableName);
<!--List<User> getAllUser(@Param("tableName") String tableName);-->
<select id="getAllUser" resultType="User">
	select * from ${tableName}
</select>

7.4、添加功能获取自增的主键

场景模拟:

t_clazz(clazz_id,clazz_name)

t_student(student_id,student_name,clazz_id)

1、添加班级信息

2、获取新添加的班级的id

3、为班级分配学生,即将某学的班级id修改为新添加的班级的id

/**
* 添加用户信息
* @param user
* @return
* useGeneratedKeys:设置使用自增的主键
* keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参
数user对象的某个属性中
*/
int insertUser(User user);
<!--int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
	insert into t_user values(null,#{username},#{password},#{age},#{sex})
</insert>

本文章参考B站 【尚硅谷】SSM框架全套教程,MyBatis+Spring+SpringMVC+SSM整合一套通关,仅供个人学习使用,部分内容为本人自己见解,与尚硅谷无关。

### 在 MyBatis 中针对达梦数据库执行多行 SQL 的配置与示例 在 MyBatis 中,支持多种方式来执行复杂的 SQL 操作,包括嵌套查询、存储过程以及动态 SQL 片段。对于达梦数据库而言,其语法与其他主流关系型数据库略有不同,因此需要特别注意适配性和兼容性。 #### 1. 使用 `<script>` 标签编写多行 SQL MyBatis 提供了 `<script>` 标签用于定义复杂的动态 SQL。以下是基于达梦数据库的一个简单示例: ```xml <select id="executeMultiRowSql" resultType="java.util.Map"> <script> BEGIN INSERT INTO test_table (id, name) VALUES (#{id}, #{name}); UPDATE another_table SET status = 'completed' WHERE id = #{id}; COMMIT; END; </script> </select> ``` 上述代码展示了如何在一个 `BEGIN...END` 块中执行多个 SQL 语句[^1]。需要注意的是,在达梦数据库中,所有的 DML 和控制流语句都必须包裹在 PL/SQL 块中才能一次性提交给数据库引擎执行。 --- #### 2. 调用存储过程 为了更好地管理复杂业务逻辑,推荐将多条 SQL 封装成存储过程并由 MyBatis 进行调用。以下是一个完整的例子: ##### 存储过程定义(假设已存在于达梦数据库) ```sql CREATE OR REPLACE PROCEDURE process_data(p_id IN NUMBER) AS BEGIN DELETE FROM temp_table WHERE user_id = p_id; INSERT INTO log_table(log_time, action) VALUES(SYSDATE, 'Data Processed'); EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20001, 'Error occurred during data processing.'); END; / ``` ##### MyBatis 映射文件中的调用方法 ```xml <insert id="callProcessDataProcedure" statementType="CALLABLE"> { CALL process_data(#{userId}) } </insert> ``` 此部分利用了 MyBatis 的 `statementType="CALLABLE"` 属性来声明这是一个可调用的存储过程。 --- #### 3. 动态 SQL 实现批量更新或插入 如果希望直接在 MyBatis 中完成类似 MERGE INTO 的功能,则可通过拼接动态 SQL 来实现。下面提供了一个简单的模板: ```xml <update id="batchUpdateOrInsert" parameterType="list"> <foreach collection="items" item="item" separator=";"> MERGE INTO target_table t USING dual d ON (t.id = #{item.id}) WHEN MATCHED THEN UPDATE SET t.name = #{item.name} WHEN NOT MATCHED THEN INSERT (id, name) VALUES (#{item.id}, #{item.name}) </foreach> </update> ``` 这里的关键在于使用 `<foreach>` 标签遍历传入参数列表,并通过分号 (`;`) 分隔每一条独立的 SQL 语句[^2]。然而,请务必确认目标数据库允许在同一会话下连续运行多条命令。 --- #### 4. 结合 PL/SQL 单元增强灵活性 考虑到某些场景下的特殊需求,可以直接采用 PL/SQL 编写更灵活的过程化脚本。例如: ```xml <insert id="complexPlSqlBlock" statementType="CALLABLE"> { DECLARE v_count INTEGER := 0; BEGIN SELECT COUNT(*) INTO v_count FROM source_table WHERE condition_column = #{conditionValue}; IF v_count > 0 THEN -- 更新现有记录 UPDATE destination_table SET field_a = value_b WHERE key_field = #{keyField}; ELSE -- 插入新记录 INSERT INTO destination_table(field_x, field_y) VALUES(value_z, value_w); END IF; COMMIT; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN NULL; -- 忽略重复键错误 END; } </insert> ``` 这段 XML 定义了一种混合模式,既包含了条件分支又实现了异常捕获机制[^3]。 --- #### 注意事项 - **事务管理**:无论是单条还是多条 SQL,都需要明确指定何时启动和结束事务。 - **性能优化**:尽量减少不必要的网络往返次数;优先考虑本地缓存策略以降低延迟。 - **安全性考量**:始终验证用户输入的数据合法性以防潜在的安全隐患如 SQL 注入攻击等问题发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值