MyBatis複習(四):#{}佔位符與SQL傳參

參數類型

1. MyBatis的parameterType參數類型可以是基本數據類型、String、包裝類型、java.util.Map、java.util.LinkHashMapd等


${}和#{}的區別

1. ${}和#{}都是MyBatis的XML文件中的佔位符

2. MyBatis處理#{},是通過PreparedStatement的set方法來賦值(Stirng類型參數在解析時會自動加上雙引號,其它數據類型則不加雙引號),可以有效的防止SQL注入,提高系統安全性

3. MyBatis處理${},會直接將其替換成傳入的變量的值,即傳入的值是什麼就替換成什麼

例如:User queryUserByName(String userName); 傳入的userName變量值爲小橙

  • #{}
       SELECT *FROM t_user WHERE username = #{userName}
          會被解析成
       SELECT *FROM t_user WHERE username = “小橙”

  • ${}
       SELECT *FROM t_user WHERE username = ${userName}
          會被解析成
       SELECT *FROM t_user WHERE username = 小橙

總結:

  • ${}一般用來傳入數據庫對象,例如數據庫表

  • 其它類型參數(基本數據類型、String、包裝類型、java.util.Map、java.util.LinkHashMapd等)建議使用#{}


SQL傳參

單參數傳遞
<!--單參數傳遞:使用parameterType指定參數數據類型即可,SQL中#{value}會自動提取變量值-->
<select id="queryUserByName" parameterType="String" resultType="User">
    SELECT *FROM t_user WHERE username = ${userName}
</select>
多參數傳遞
<!--多參數傳遞:使用parameterType指定java.util.Map接口,SQL中#{key}會自動提取變量值-->
<select id="queryUsers" parameterType="java.util.Map" resultType="User">
    select *from t_user
    where
      age between #{max} and #{min}
    order by age
    
</select>
package com.cd.blog.config;

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 java.io.IOException;
import java.io.InputStream;

/**
 * @Author: 落葉無痕
 * @Date: 2020/5/15 16:45
 */
public class MyBatisUtils {

    /*MyBatisUtils工具類,目的是創建全局唯一的SqlSessionFactory對象*/


    //static屬於類不屬於對象,且全局唯一
    private static SqlSessionFactory sqlSessionFactory = null;

    //利用靜態塊在初始化類時初始化SqlSessionFactory
    static {
        InputStream input = null;
        try {
            // 使用字節流方式加載classpath下的mybatis-config.xml核心配置文件
            input = Resources.getResourceAsStream("mybatis-config.xml");
            // 初始化SqlSessionFactory對象,並解析mybatis-config.xml文件
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
        } catch (IOException e) {
            e.printStackTrace();
            //初始化錯誤時,拋出ExceptionInInitializerError異常通知調用者
            throw new ExceptionInInitializerError(e);
        }
    }

    // 創建SqlSession對象(SqlSession是JDBC的擴展類,專門用於與數據庫交互)
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }

    // 釋放一個有效的SqlSession對象
    public static void closeSession(SqlSession sqlSession){
        if(sqlSession != null){
            sqlSession.close();
        }
    }

}

package com.cd.blog.config;

import com.cd.blog.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: 落葉無痕
 * @Date: 2020/5/17 21:42
 */
public class TestMyBatisUtils {

    @Test
    public void demo(){
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtils.openSession();
            Map param = new HashMap();
            param.put("min", 25);
            param.put("max", 50);
            List<User> userList = sqlSession.selectList("queryUsers", param);
            for(User u : userList){
                System.out.println(u.getUserName() + ": " + u.getAge() + "歲");
            }
        }catch (Exception e){
            throw e;
        }finally {
            MyBatisUtils.closeSession(sqlSession);
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章