参数获取和参数传递

1、SQL语句中获取参数的两种方式

    1) #{key}:获取参数的值,预编译到SQL中。安全。相当于PreparedStatement,利用通配符.
    2) ${key}获取参数的值,拼接到SQL中。有SQL注入问题🔗。相当于Statement,涉及到字符串的拼接,字符串部分一定要注意单引号问题。

    select eid,ename,age,sex from emp where eid = ${eid} and ename = '${ename}'

    3) 建议大部分情况下使用 #{},在特殊情况下:①批量删除;②模糊查询,需要使用 ${}

2、不同的参数类型 #{} 和 ${} 的不同取值方式:

  1)当传输参数为单个String或者基本数据类型和其包装类

    #{}:可以以任意的名字获取参数;

    ${}:只能以${value}或者${_parameter}获取

    <!-- Emp getEmpByEid(String eid); -->
    <select id="getEmpByEid" resultType="Emp">
        <!-- select eid,ename,age,sex from emp where eid = #{eid} -->
        select eid,ename,age,sex from emp where eid = ${_parameter}
    </select>

  2)当传输参数为JavaBean时

    #{} 和${} 都能够通过属性名直接获取属性值,但还是要注意${} 的单引号问题。

    <insert id="insertEmp" useGeneratedKeys="true" keyProperty="eid">
        <!-- insert into emp values(null, #{ename}, #{age}, #{sex}) -->
        insert into emp values(null, '${ename}', ${age}, '${sex}')
    </insert>

  3)当传输多个参数时(以两个参数为例子),mybatis会默认将这些参数放在map集合中:

    ①键为0,1,2,3...,N-1,以参数为值

    ②键为param1,param2,param3,....,paramN,以参数为值

 

    #{}:#{0} 、#{1}; 或者 #{param1}、#{param2};

    ${}:${param1}、${param2},注意${} 的单引号问题

    <!-- Emp getEmpByEidAndEname(String eid, String ename); -->
    <select id="getEmpByEidAndEname" resultType="Emp">
        select eid,ename,age,sex from emp where eid = ${param1} and ename = '${param2}'
    </select>

  4)当传输Map参数时

    #{}和${} 都可以通过键的名字直接获取值,但注意${} 的单引号问题(需要手动创建map键值对传入)

    <!-- Emp getEmpByMap(Map<String, Object> map); -->
    <select id="getEmpByMap" resultType="emp">
        select eid,ename,age,sex from emp where eid = ${eid} and ename = '${ename}'
    </select>

  5)命名参数

    可以通过 @Param("key") 在参数上加上注解,指定键的名字。

    #{}和${} 都可以通过键的名字直接获取值,但注意${} 的单引号问题。

    <!-- Emp getEmpByEidAndEnameByParam(@Param("eid")String eid, @Param("ename")String ename); -->
    <select id="getEmpByEidAndEnameByParam" resultType="Emp">
        select eid,ename,age,sex from emp where eid = #{eid} and ename = #{ename}
    </select>

  6)Collection/Array
    会被MyBatis封装成一个map传入, Collection对应的key是collection,Array对应的key是array. 如果确定是List集合,key还可以是list.

package com.atguigu.mapper;

import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.atguigu.bean.Emp;

public interface ParamMapper {

    //添加员工信息
    void insertEmp(Emp emp);
    
    //根据eid获取员工信息
    Emp getEmpByEid(String eid);
    
    //根据eid和ename查询员工信息
    Emp getEmpByEidAndEname(String eid, String ename);
    
    //根据map查询员工信息
    Emp getEmpByMap(Map<String, Object> map);
    
    //根据eid和ename查询员工信息
    Emp getEmpByEidAndEnameByParam(@Param("eid")String eid, @Param("ename")String ename);
    
    
}
package com.atguigu.test;

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

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 org.junit.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper;
import com.atguigu.mapper.ParamMapper;

public class TestParam {

    @Test
    public void testCRUD() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务
        ParamMapper mapper = sqlSession.getMapper(ParamMapper.class);
        
    
//        1
        Emp emp = mapper.getEmpByEid("1");
        System.out.println(emp);
        
        
//        2
        Emp emp = new Emp(null, "admin", 23, "男");
        mapper.insertEmp(emp);
        System.out.println(emp.getEid());
        

//        3
        Emp emp = mapper.getEmpByEidAndEname("1", "张三");
        System.out.println(emp);
        
        
//        4
        Map<String, Object> map = new HashMap<>();
        map.put("eid", "1");
        map.put("ename", "张三");
        Emp emp = mapper.getEmpByMap(map);
        
        
//        5
        Emp emp = mapper.getEmpByEidAndEnameByParam("1", "张三");
        System.out.println(emp);
    }
    
}

 

posted @ 2020-05-24 22:23  kkzhang  阅读(952)  评论(0编辑  收藏  举报