mybatis的几种传值方式

本文详细介绍MyBatis中各种参数传递方式,包括单个参数、按顺序传参、使用@Param注解、使用Map、实体对象及List传参,为开发者提供全面的SQL映射配置指导。

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

1.单个参数传参

User selectUserInfo(Integer userId);
<select id = "selectUserInfo" parameterType = "java.lang.Inte" resultMap="BaseResultMap" >
    select
    <include refid="Base_Column_List" />
    from user
    where userId = #{userId , jdbcType=INTEGER}
</select>

2. 按照顺序传参

User selectUserInfo(Integer userId, String userName, String userPass);
<select id = "selectUserInfo" resultMap="BaseResultMap" >
    select
    <include refid="Base_Column_List" />
    from user
    where userId = #{arg0} and userName = #{arg1} and userPass = #{arg2}
</select>

3. 使用@Param注解传参

User selectUserInfo(@Param("userName")String userName, @Param("userPass")String userPass);
<select id = "selectUserInfo" resultMap="BaseResultMap" >
    select
    <include refid="Base_Column_List" />
    from user
    where userName = #{userName} and userPass = #{userPass}
</select>

4. 使用Map传参 注意传参方式:parameterType="java.util.Map"

Map<String,Object> map = new HashMap();
map.put("userName","张三");
map.put("userPass","123");
User user = userMapper.selectUserInfo(map);
User selectUserInfo(Map<String,Object> map);
<select id="selectUserInfo" parameterType="java.util.Map" resultMap="BaseResultMap" >
    select
    <include refid="Base_Column_List" />
    from user
    where userName = #{userName} and userPass = #{userPass}
</select>

5. 实体对象传参

User user = new User();
user.setUserName("张三");
user.setUserPass("123");
User user = UserMapper.selectUserInfo(user);
User selectUserInfo(User record);
<select id="selectUserInfo" parameterType="com.LiuXu.bean.User" resultMap="BaseResultMap" >
    select
    <include refid="Base_Column_List" />
    from user
    where userName = #{userName} and userPass = #{userPass}
</select>

6. List传参

List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
List<User> userList = userMapper.selectUserInfo(list);
    
List<User> selectUserInfo(List<User> record);
<select id="selectUserInfo" resultMap="BaseResultMap" >
    select
    <include refid="Base_Column_List" />
    from user
    where userId in
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
<think>嗯,用户的问题是关于在Web开发中如何将递到SQL插入语句的value部分。我需要先回忆一下常见的方法,比如字符串拼接、预处理语句、ORM框架等。不过,用户可能更关注具体的技术实现,比如不同编程语言中的示例,或者如何防止SQL注入攻击。 首先,用户提到了Web开发,所以应该考虑前后端的数据流。通常,前端通过表单或API提交数据,后端接收后处理并构造SQL语句。这时候,安全是关键,必须避免SQL注入。预处理语句(参数化查询)应该是推荐的方法,因为它能有效防止注入。 然后,想到用户可能需要具体的示例,比如在Java中使用PreparedStatement,或者在Python中使用psycopg2的占位符。此外,ORM框架如Hibernate或Django的模型也是常见方式,但用户可能想要更底层的例子。 还要注意引用中的内容,比如用户提供的引用[2]和[3]提到了MyBatis中使用#{}占位符,这可能意味着用户对MyBatis感兴趣,或者想了解不同框架中的实现方式。需要结合这些引用给出示例,比如MyBatis的XML映射文件中的插入语句。 另外,用户提供的引用[1]提到SQL注入的检测和工具,所以在回答中必须强调安全性,说明为什么字符串拼接不安全,并推荐预处理语句或ORM来防止注入。可能需要对比两种方式的差异,比如直接拼接变量和参数化查询的区别。 还需要考虑不同编程语言的示例是否必要,比如PHP、Python、Java等,但用户的问题没有指定语言,所以应该保持通用,或者选择几个常见的语言作为例子。 总结一下,回答的结构应该是先介绍直接拼接的风险,然后讲解参数化查询及其在不同语言中的实现,接着提到ORM框架的使用,最后强调安全注意事项。同时,结合用户提供的引用,特别是MyBatis中的示例,给出具体的代码片段,如使用#{}的XML配置。 最后,生成相关问题时要围绕SQL方法、防止注入、框架使用等方面,帮助用户深入理解。</think>在Web开发中将安全递到SQL插入语句的value部分,主要有以下三种方法及示例: ### 一、直接拼接字符串(不推荐) ```python # 存在SQL注入风险示例 username = request.POST['user'] sql = f"INSERT INTO users VALUES ('{username}')" ``` 此方法易受SQL注入攻击,如输入`' OR '1'='1`会破坏SQL逻辑[^1] ### 二、参数化查询(推荐) #### 1. Python示例(使用psycopg2) ```python cursor.execute(""" INSERT INTO users (name,age) VALUES (%s,%s) """, (user_name, user_age)) ``` #### 2. Java示例(使用PreparedStatement) ```java String sql = "INSERT INTO user VALUES(?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, req.getParameter("userCode")); pstmt.setString(2, req.getParameter("userName")); ``` #### 3. MyBatis框架示例(XML映射文件) ```xml <insert id="insertUser"> INSERT INTO SMBMS_USER(id,userCode,userName) VALUES(default,#{userCode},#{userName}) </insert> ``` 使用`#{field}`会自动进行参数化处理[^2] ### 三、ORM框架方法 #### Django模型示例 ```python from .models import User User.objects.create( user_code=request.POST['code'], user_name=request.POST['name'] ) ``` ### 关键安全建议 1. 必须使用参数化查询替代字符串拼接 2. 验证输入格式(如邮箱正则校验) 3. 数型参数做类型转换 4. 使用LIMIT限制批量插入数量 5. 重要操作添加事务控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值