mybatis——参数传递

本文展示了如何在MyBatis中进行参数传递,包括传递单个参数、对象参数和Map参数。通过示例代码解释了XML映射文件中的参数配置以及Java测试类中的调用方法,帮助理解MyBatis的参数处理机制。

一、Flowermapper2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--参数传递-->
<mapper namespace="com.company.mapper.Flowermapper2">
    <!--parameterType是传的参数的数据类型-->
    <select id="selectOne" resultType="flower" parameterType="int">
        <!--id的值可以进行参数传递  普通类型使用#{prama1}-->
        select * from flower where id=#{param1}
    </select>

    <!--传递多个参数  使用数组或者对象-->
    <select id="selectOne2" resultType="flower" parameterType="flower">
        <!-- id的值可以进行参数传递  对象使用属性名,其实是自动调用get方法-->
        select * from flower where id=#{id} and name = #{name}
    </select>

    <!--传递map存储参数    属性不属于同一个对象时-->
    <select id="selectMap" resultType="flower" parameterType="map">
        <!-- id的值可以进行参数传递  对象使用属性名,其实是自动调用get方法-->
        select * from flower where id=#{a} and name = #{b}
    </select>
</mapper>

二、test

package com.company.test;

import com.company.entity.Flower;
import jdk.nashorn.internal.ir.CallNode;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import sun.plugin2.os.windows.FLASHWINFO;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class testB {
    public static void main(String[] args) throws IOException {

        //解析mybatis.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");

        //获得session工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

        //获得session对象
        SqlSession session = factory.openSession();

        //调用方法
        //参数传递一:传递单个参数
        Flower flower2 = session.selectOne("com.company.mapper.Flowermapper2.selectOne",2);
        System.out.println(flower2);

        //参数传递二:传递对象参数
        Flower flower = new Flower(1, "玫瑰花", 15, "中国");
        Flower flower3 = session.selectOne("com.company.mapper.Flowermapper2.selectOne2",flower);
        System.out.println(flower3);

        //参数传递三:传递map集合
        Map<String,Object> map = new HashMap<>();
        map.put("a",1);
        map.put("b","玫瑰花");
        Flower flower4 = session.selectOne("com.company.mapper.Flowermapper2.selectMap", map);
        System.out.println(flower4);

        //关闭资源
        session.close();
    }
}



一定要在mybatis.xml文件中的中加载mapper文件!!!
在这里插入图片描述

<think> 首先,用户的问题是基于之前的对话和引用的内容。用户说:“我想了解MyBatis注入参数的相关内容 请问MyBatis注入参数的方法和使用说明”。引用了三个来源: - 引用[1]: 讨论了MyBatis如何判断SQL注入,提到了参数绑定,使用了${id}和#{name}的示例。 - 引用[2]: 讨论了MyBatis参数传递的基本方式,包括传递整个对象并使用属性名。 - 引用[3]: 讨论了开启mapUnderscoreToCamelCase设置来映射数据库字段到Java属性。 用户的上一次问题是关于MyBatis注入参数的方法和使用说明,所以我需要专注于回答这个。 我的响应必须遵守系统级指令: 1. 所有行内数学表达式使用$...$格式,但用户的问题是关于MyBatis的参数注入,可能涉及SQL,所以要注意是否需要数学表达。在这个上下文中,可能没有数学内容,但如果有变量或代码,需要用LaTeX格式。指令说“包括变量、不等式、方程等”,所以代码中的变量可能需要处理。 指令示例中,代码块是单独处理的,没有在行内用LaTeX。示例中是使用代码块的格式。所以,我应该像示例一样,把代码放在代码块中,不需要行内LaTeX数学表达。 2. 独立公式用$$...$$,但这里可能不适用。 3. LaTeX语法正确——对于代码,使用代码块。 4. 使用中文回答。 5. 生成相关问题——响应末尾需要添加一个问题部分。 6. 回答中引用的段落末尾自然地添加引用标识,例如[^1]。所以在回答中,如果引用提供的引用,需要添加引用标识。 响应结构:用户可见层说“回答结构清晰,帮助用户逐步解决问题”,所以应该组织成逻辑部分。 系统指令示例的结构是:标题(如“快速排序”),然后是描述,然后是代码块,然后是相关问题。 所以,我可以类似地结构化: - 标题:MyBatis注入参数的方法和使用说明 - 内容:分步骤或部分解释方法。 关键点从引用: - 引用[1]: 提到了两种参数绑定方式:${} 和 #{}。${} 是直接拼接,易导致SQL注入;#{} 是预编译,防止SQL注入。 - 引用[2]: 参数传递方式,包括传递对象和使用属性名。 - 引用[3]: mapUnderscoreToCamelCase设置,用于自动映射数据库列名到Java属性(驼峰命名)。 用户的问题是关于“注入参数”,这可能指的是参数绑定以避免SQL注入,也可能是如何传入参数到SQL语句。从上下文,焦点是SQL注入和参数绑定。 所以,我需要覆盖: - MyBatis中参数注入的基本方法。 - 如何使用#{}和${}。 - 如何传递简单参数、对象参数。 - SQL注入的预防。 - 自动映射设置。 逐步回答: 1. 介绍MyBatis参数注入的概念。 2. 解释两种参数占位符:#{} 和 ${}: - #{}:预编译,安全,防止SQL注入。 - ${}:直接拼接,不安全,仅在必要时使用。 3. 参数传递方式: - 传递单个参数。 - 传递多个参数:使用@Param注解或Map。 - 传递对象属性:直接使用属性名在SQL中。 4. 预防SQL注入:推荐使用#{}。 5. 自动映射:提到mapUnderscoreToCamelCase设置。 在回答中,自然地添加引用标识。例如,当提到${}和#{}时,参考引用[1]。 生成相关问题:在末尾添加“相关问题”部分,如示例。 最终响应结构: - 主标题:MyBatis注入参数的方法和使用说明 - 内容段落,解释细节。 - 代码块:展示示例代码。 - 相关问题:1. ... 2. ... 3. ... 代码块:从引用中提取或创建示例。 引用[1]有示例SQL:<select id="select" parameterType="String" resultType="com.demo.bean.User"> select * from sqldemo.user where id = '${id}' or name = #{name} </select>[^1] 我可以使用类似代码。 引用[2]提到对象传递。 引用[3]有配置示例。 响应用中文。 </think> ### MyBatis注入参数的方法和使用说明 MyBatis 是一款流行的持久层框架,其核心功能之一是通过参数注入将 Java 对象或值动态绑定到 SQL 语句中,从而高效地执行数据库操作。参数注入不仅可以简化代码,还能有效预防 SQL 注入攻击。下面我将基于引用内容,逐步解释 MyBatis 注入参数的基本方法、使用说明和最佳实践。 #### 1. **参数注入的基本方法** 在 MyBatis 中,参数注入主要通过两种占位符实现:`#{}` 和 `${}`。它们的区别在于处理方式和安全性: - **`#{}` 占位符**:这是推荐的方式,它会将参数预编译为 PreparedStatement,自动处理类型转换和转义,从而防止 SQL 注入攻击。适用于大多数场景。 - 示例:在 SQL 映射文件(如 XML)中,使用 `#{propertyName}` 引用参数值。 ```xml <!-- 引用[1] 中的示例 --> <select id="selectUser" parameterType="String" resultType="com.demo.bean.User"> SELECT * FROM user WHERE name = #{name} </select> ``` 这里,`#{name}` 会根据传入的字符串参数进行安全绑定,MyBatis 会自动将其转换为预编译语句中的占位符[^1]。 - **`${}` 占位符**:这种方式是直接字符串拼接,不进行预编译,因此存在 SQL 注入风险。仅当需要动态插入 SQL 关键字(如表名或列名)时使用,且应确保参数值可信。 - 示例:在引用[1] 中,`${id}` 被直接拼接到 SQL 中,可能导致注入漏洞。 ```xml <select id="select" parameterType="String" resultType="com.demo.bean.User"> SELECT * FROM user WHERE id = '${id}' OR name = #{name} </select> ``` 这里,`${id}` 是硬编码拼接,如果 `id` 来自用户输入,可能被恶意利用;而 `#{name}` 是安全的[^1]。 参数注入的核心是确保动态 SQL 的可控性,推荐优先使用 `#{}` 以避免安全风险。 #### 2. **参数传递的方式** MyBatis 支持多种参数传递方法,方便根据需求灵活选择: - **传递单个基本类型参数**:直接使用参数变量名在 SQL 中引用。 - 示例:如果方法参数是 `String name`,在 XML 中直接写 `#{name}`。 ```java // Java 方法 User selectUser(String name); ``` ```xml <select id="selectUser" resultType="User"> SELECT * FROM user WHERE name = #{name} </select> ``` - **传递多个参数**:使用 `@Param` 注解或 Map 集合来指定参数名。 - 使用 `@Param` 注解:在 Java 方法中为每个参数添加注解。 ```java // Java 方法 User selectUser(@Param("id") int id, @Param("name") String name); ``` ```xml <select id="selectUser" resultType="User"> SELECT * FROM user WHERE id = #{id} AND name = #{name} </select> ``` - 使用 Map 集合:将参数放入 Map 中,key 作为 SQL 引用名。 ```java Map<String, Object> params = new HashMap<>(); params.put("userId", 1); params.put("userName", "Alice"); ``` ```xml <select id="selectUser" parameterType="map" resultType="User"> SELECT * FROM user WHERE id = #{userId} AND name = #{userName} </select> ``` - **传递对象参数**:如果参数是一个 Java 对象(如实体类),MyBatis 会自动映射属性名到 SQL 中。 - 示例:引用[2] 中提到,传递整个对象时,直接在 SQL 中使用对象的属性名(如 `user.name`),前提是数据库字段名与对象属性名一致。 ```java // Java 方法,传入 User 对象 void updateUser(User user); ``` ```xml <update id="updateUser" parameterType="com.demo.bean.User"> UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id} </update> ``` 这里,`#{name}`、`#{email}` 会自动从 User 对象的属性中取值[^2]。 #### 3. **自动映射和配置** MyBatis 提供自动映射功能,简化数据库列名与 Java 属性名的对应: - **驼峰命名映射**:在引用[3] 中,通过配置 `mapUnderscoreToCamelCase` 设置,自动将数据库的下划线命名(如 `user_name`)映射到 Java 的驼峰命名(如 `userName`)。 - 在配置文件 `mybatis-config.xml` 中添加: ```xml <!-- 引用[3] 中的配置 --> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> ``` 启用后,SQL 查询结果会自动匹配到 Java 对象的属性,无需手动指定别名[^3]。 #### 4. **使用说明和最佳实践** - **安全性建议**: - 始终优先使用 `#{}` 来预防 SQL 注入攻击,尤其当参数来自用户输入时。 - 仅在必要时使用 `${}`,例如动态表名或列名,并严格控制参数来源。 - **性能优化**: - 对于复杂参数,使用对象传递减少代码冗余。 - 启用驼峰映射(如上)提升开发效率。 - **常见场景**: - 查询操作:结合 `WHERE` 子句使用 `#{}` 绑定条件。 - 插入或更新:直接在 SQL 中引用对象属性。 - 批量操作:通过 Map 或 List 传递多个参数。 通过合理使用这些方法,MyBatis 的参数注入可以显著提升数据库操作的灵活性和安全性。如果需要更多细节,建议参考 MyBatis 官方文档或相关教程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值