參數獲取和參數傳遞


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);
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM