mybatis之参数与返回值

本文详细解析了MyBatis中字段映射的多种方式,包括使用resultType、resultMap进行实体类映射,以及解决字段名大小写问题的方法。同时介绍了如何通过Map类型返回查询结果,以及insert、delete、update操作的返回值含义。

返回值

字段名大写问题

mybatis如果不做区分大小写的设置的话,默认是不会区分大小写的,执行出的sql字段全部大写。

  • 加上字段别名加上双引号
Select name as "name" from v_zhyl_zxzf_hqyzflb
  • 返回字段映射到实体类型:

以“com.demo.pojo.User”为例:设置select语句的返回类型为

<select resultType="com.demo.pojo.User"></select>
  • 返回字段使用resultMap

select语句中的字段名称要和map中的对应上, 

   <resultMap id="mapDemo" type="java.util.map">
         <result column="userName" property="userName" />
         <result column="userAge" property="userAge" />
  </resultMap>

在select语句中设置返回map类型:

<select resultMap="mapDemo"></select>

参考:mybatis用Map返回的字段全变大写的问题_k524274865的博客-优快云博客

mybatis-查询返回的map中部分字段不区分大小写_查询sql用map接收的字段都是小写的吗_w2006009的博客-优快云博客

返回map

<!-- 返回HashMap结果 类型-->  
<!-- 如果想返回JavaBean,只需将resultType设置为JavaBean的别名或全限定名 -->  
<!-- TypeAliasRegistry类初始化时注册了一些常用的别名,如果忘记了别名可以在这里面查看 -->  
<select id="selectBlogRetHashMap" parameterType="int" resultType="map">  
   SELECT id AS "id", title AS "title", content AS "content" FROM Blog WHERE id = #{id}  
</select> 

insert ,delete,update操作返回值

操作返回类型返回值意义
insert int插入的数据的条数(失败返回的是exception
deleteint删除的数据的条数(失败返回的是exception

 注:update 操作明确的返回受影响的记录条数,JDBC URL添加useAffectedRows=true

传参

传递多个参数

顺序传参

#{}里面的数字代表你传入参数的顺序,索引从0开始

public List<XXXBean> getXXXBeanList(String xxId, String xxCode); 
<select id="getXXXBeanList" resultType="XXBean">
  select t.* from tableName where id = #{0} and name = #{1}  
</select>

 @Param注解传参

#{}里面的名称对应的是注解@Param括号里面修饰的名称。

注意,使用了@param注解的,在mapper.xml不加parameterType。

public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code);  
<select id="getXXXBeanList" resultType="XXBean">
    select t.* from tableName where id = #{id} and name = #{code}  
</select>  

Map封装多参数

#{}里面的名称对应的是Map里面的key名称。

public List<XXXBean> getXXXBeanList(HashMap map);  
<select id="getXXXBeanList" parameterType="hashmap" resultType="XXBean">
    select 字段... from XXX where id=#{xxId} code = #{xxCode}  
</select>  

Java Bean传参

#{}里面的名称对应的是User类里面的成员属性。

<select id="selectUser" parameterType="com.test.User" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>

### MyBatis Foreach 批量更新时返回值固定为1的原因分析 在 MyBatis 中,`<foreach>` 标签用于实现批量操作。当使用 `<foreach>` 实现批量 `UPDATE` 操作时,可能会遇到返回值始终为 1 的情况。这种现象的根本原因在于 SQL 数据库的行为以及 MyBatis 对其返回值的处理方式。 #### 原因分析 1. **SQL 分号分隔多条语句的影响** - 使用 `<foreach>` 动态生成多条独立的 `UPDATE` 语句并通过分号 (`;`) 分隔时,某些数据库(如 MySQL)可能只将第一条语句的结果作为整个批处理的返回值[^3]。 - 即使实际有多条数据被更新,但由于数据库驱动仅返回第一条语句的结果,因此 MyBatis 接收到的返回值总是固定的 1 或其他单一值。 2. **JDBC 驱动行为差异** - 不同数据库的 JDBC 驱动对批量更新的支持程度不同。例如,在 Oracle 数据库中,默认情况下返回的是匹配到的行数而非真正受影响的行数[^5]。 - 如果未显式配置 JDBC 参数(如 `useAffectedRows=true`),则可能导致返回值不符合预期。 3. **MyBatis 处理机制** - MyBatis 并不直接干预底层数据库的操作逻辑,而是依赖于 JDBC 驱动返回的结果。这意味着如果 JDBC 驱动未能正确反映所有语句的实际影响,则 MyBatis 将无法提供准确的返回值[^4]。 --- ### 解决方案 以下是几种常见的解决方法: #### 方法一:调整 JDBC URL 参数 通过设置特定参数让 JDBC 驱动返回更精确的结果。例如,在 MySQL 数据库中可以通过如下方式启用 `useAffectedRows` 参数: ```properties jdbc:mysql://localhost:3306/test?useAffectedRows=true ``` 此参数的作用是确保每次执行 DML 操作时都返回真实的受影响行数而不是匹配行数。 #### 方法二:改用存储过程或批量绑定模式 利用数据库原生支持的批量更新功能替代逐条拼接的方式。下面是一个基于预编译语句的例子: ```xml <update id="batchUpdate"> UPDATE test_table SET column_name = CASE WHEN id = #{item.id} THEN #{item.newValue} ELSE column_name END WHERE id IN <foreach collection="list" item="item" open="(" separator="," close=")"> #{item.id} </foreach> </update> ``` 这种方式能够一次性完成全部更新并获得总的受影响行数。 #### 方法三:手动统计受影响行数 如果不希望更改现有代码结构或者受限于环境约束,也可以考虑在业务层面上单独验证每一项是否成功更新。比如循环调用单次更新接口并将结果累加起来计算最终总数。 --- ### 示例代码 以下展示了一种改进后的批量更新 XML 定义及其对应的 Java 调用片段: **XML Mapper 文件定义** ```xml <update id="batchUpdateWithCaseWhen" parameterType="java.util.List"> UPDATE form_def_dos SET status = CASE <foreach collection="list" item="item" index="index"> WHEN id=#{item.id} THEN #{item.status} </foreach> ELSE status END, updated_at = NOW() WHERE id IN ( <foreach collection="list" item="item" open="(" separator="," close=")"> #{item.id} </foreach> ) </update> ``` **Java 调用示例** ```java List<FormDefDO> listToUpdate = new ArrayList<>(); // ...填充列表... int affectedRows = mapper.batchUpdateWithCaseWhen(listToUpdate); if (affectedRows != listToUpdate.size()) { throw new RuntimeException("部分记录更新失败"); } ``` --- ### 总结 针对 MyBatis `<foreach>` 更新返回值固定为 1 的问题,主要原因是由于 SQL 数据库和 JDBC 驱动的行为特性所致。推荐优先尝试调整 JDBC URL 参数以改善兼容性;其次可采用更加高效的存储过程或批量绑定策略减少性能开销的同时提升准确性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值