mybatis中parameterType为string和其他自定义封装对象的区别

本文详细解析了MyBatis中使用不同参数类型时的处理方式,包括字符串参数和对象参数的具体应用,以及如何在mapper接口和XML配置中正确设置参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、parameterType为String时,需要在mapper接口中定义@Param要传入的字符串名

xxMappper.xml

 <!--获取动态指标明细数据接口-->
    <select id="tableName" parameterType="String" resultMap="DynaResultMap">
        SELECT
         *
        FROM
            t_dynatable_fields
        WHERE
            DYNA_KEY = #{dynaKey,jdbcType=VARCHAR}
    </select>

xxMapper接口

List<DynaTableField> tableName(@Param("dynaKey") String dynaKey);
2、parameterType为对象时,因为已经在对象中定义了属性,所以在mapper接口中就不要添加了@Param或者什么标注了

xxmap.xml文件

<insert id="insert" parameterType="com.jsptpd.gayg.modules.cloud.model.EnterpriseBase">
        insert into t_enterprise_base_info (ENTERPRISE_ID, ENTERPRISE_NAME, ENTERPRISE_USCC,
        GD_INFO, HG_CODE, ESTABLISH_DATE,
        REGIST_CAPITAL, ENTERPRISE_ADDRESS, ENTERPRISE_SCOPE,
        LEGAL_NAME, CONTACT_PHONE, IS_INVEST,
        PARK_TYPE, WORKSHOP_POS, WORKSHOP_AREA,
        INDUSTRY_CLASS, INDUSTRY_CATEGORY, TRIAL_TIME,
        INVEST_TIME, PRODUCT_TIME, BUSI_INFO,
        ENTERPRISE_TYPE, REMARK, STATUS,
        OPERATOR, OPERATE_TIME)
        values (#{enterpriseId,jdbcType=VARCHAR}, #{enterpriseName,jdbcType=VARCHAR}, #{enterpriseUscc,jdbcType=VARCHAR},
        #{gdInfo,jdbcType=VARCHAR}, #{hgCode,jdbcType=VARCHAR}, #{establishDate,jdbcType=DATE},
        #{registCapital,jdbcType=DECIMAL}, #{enterpriseAddress,jdbcType=VARCHAR}, #{enterpriseScope,jdbcType=VARCHAR},
        #{legalName,jdbcType=VARCHAR}, #{contactPhone,jdbcType=VARCHAR}, #{isInvest,jdbcType=INTEGER},
        #{parkType,jdbcType=INTEGER}, #{workshopPos,jdbcType=VARCHAR}, #{workshopArea,jdbcType=DECIMAL},
        #{industryClass,jdbcType=INTEGER}, #{industryCategory,jdbcType=INTEGER}, #{trialTime,jdbcType=DATE},
        #{investTime,jdbcType=DATE}, #{productTime,jdbcType=DATE}, #{busiInfo,jdbcType=INTEGER},
        #{enterpriseType,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER},
        #{operator,jdbcType=VARCHAR}, #{operateTime,jdbcType=TIMESTAMP})
    </insert>

xxmap接口

int insert(EnterpriseBase record);

本文转载自:https://www.jianshu.com/p/db20f3224038

<think>我们正在讨论MyBatis框架中mapper.xml文件中的parameterType属性。根据引用[1][2][3],我们可以总结如下: 1. **parameterType的作用**: parameterType属性用于指定传递给SQL语句的参数类型。它告诉MyBatis执行SQL语句时需要使用的Java数据类型。这样MyBatis就能知道如何正确地处理参数,例如设置预处理语句(PreparedStatement)中的参数。 2. **使用位置**: 该属性用在mapper.xml文件中的SQL语句标签上,如`<select>`, `<insert>`, `<update>`, `<delete>`等。 3. **参数类型**: - 当SQL语句只有一个参数时,可以使用基本数据类型(如int, String)或它们的包装类(如Integer)。 - 当SQL语句有多个参数时,通常使用Java实体类(POJO)或者Map类型。这样可以将多个参数封装在一个对象中传递。 - 也可以使用MyBatis内置的别名(如`int`代替`java.lang.Integer`),这些别名不区分大小写。 4. **示例**: 假设有一个根据用户ID查询用户信息的操作: ```xml <select id="selectUser" parameterType="int" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ``` 这里`parameterType="int"`表示传入的参数是一个整数类型(对应Java中的int或Integer)。 再比如,插入一个用户对象: ```xml <insert id="insertUser" parameterType="com.example.User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> ``` 这里`parameterType="com.example.User"`表示传入的是一个User类型的对象。 5. **别名**: 为了简化,可以在MyBatis配置文件中使用`<typeAliases>`为Java类型设置别名,这样在mapper.xml中就可以使用别名代替全限定类名。例如: ```xml <typeAliases> <typeAlias alias="User" type="com.example.User"/> </typeAliases> ``` 然后在mapper.xml中: ```xml <insert id="insertUser" parameterType="User"> ... </insert> ``` 6. **注意事项**: - 当使用注解方式(如@Param)传递多个参数时,在mapper.xml中可以不指定parameterType,而是直接通过参数名引用(需要MyBatis 3.4.1以上版本支持)。 - 如果只有一个参数且是基本类型或String,可以省略parameterType,因为MyBatis可以自动推断。 总结:parameterType属性用于指定SQL语句的参数类型,它可以是基本类型、String、JavaBean或Map等。正确使用它可以帮助MyBatis正确地映射参数到SQL语句中。 §§相关问题§§ 1. MyBatis中resultTyperesultMap的区别是什么? 2. 如何在MyBatis中传递多个参数? 3. MyBatis有哪些内置的类型别名?</think>### MyBatis XML mapper文件中parameterType属性的作用及用法 #### 一、parameterType的作用 `parameterType`属性用于指定传递给SQL语句的参数类型,它告诉MyBatis执行SQL时需要使用的Java数据类型。主要作用包括: 1. **类型映射**:将Java数据类型与SQL参数类型正确映射 2. **参数处理**:指导MyBatis如何解析`#{}`占位符中的参数 3. **安全校验**:确保传入参数与SQL语句所需类型匹配[^1][^2] #### 二、基本用法 ##### 1. 基本数据类型 ```xml <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> ``` - `int`是`java.lang.Integer`的别名 - 适用于单个基本类型参数(int, String, long等) ##### 2. JavaBean对象 ```xml <insert id="insertUser" parameterType="com.example.User"> INSERT INTO users(name, email) VALUES(#{name}, #{email}) </insert> ``` - `#{}`中的名称需与JavaBean属性名一致 - MyBatis会自动通过getter方法获取值[^2] ##### 3. Map类型参数 ```xml <update id="updateUser" parameterType="map"> UPDATE users SET name=#{name} WHERE id=#{userId} </update> ``` - 适用于动态参数场景 - `#{}`中的key需与Map的key对应 #### 三、高级用法 ##### 1. 类型别名简化 在`mybatis-config.xml`中配置: ```xml <typeAliases> <typeAlias alias="User" type="com.example.User"/> </typeAliases> ``` mapper.xml中使用别名: ```xml <select id="selectUser" parameterType="User" ...> ``` ##### 2. 多参数处理(无需parameterType) ```java // Mapper接口方法 User selectUser(@Param("id") int id, @Param("name") String name); ``` ```xml <select id="selectUser" resultType="User"> SELECT * FROM users WHERE id=#{id} AND name=#{name} </select> ``` - 通过`@Param`注解命名参数 - MyBatis会自动封装为Map类型[^3] #### 四、注意事项 1. **可选性**:当方法只有一个参数且是基本类型时,可省略`parameterType` 2. **类型匹配**:确保Java类型与数据库字段类型兼容 3. **性能优化**:复杂对象建议使用别名减少全限定名解析开销 4. **动态SQL**:在`<if>`, `<where>`等标签中可直接使用参数属性 ```xml <select id="findUsers" parameterType="map"> SELECT * FROM users <where> <if test="name != null">AND name = #{name}</if> <if test="minAge != null">AND age >= #{minAge}</if> </where> </select> ``` #### 五、最佳实践 1. 单参数使用基本类型别名(如`int`, `string`) 2. 多参数使用`@Param`注解或封装为DTO对象 3. 常用领域对象配置类型别名 4. 复杂查询建议使用Map传递动态参数 5. 更新操作优先使用JavaBean保持一致性[^2] > 示例:带条件的更新操作 ```xml <update id="updateUserSelective" parameterType="User"> UPDATE users <set> <if test="name != null">name=#{name},</if> <if test="email != null">email=#{email},</if> </set> WHERE id=#{id} </update> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值