1. 程式人生 > >Mybatis #和$的區別

Mybatis #和$的區別

#會進行預編譯,其實現是通過JDBC的PreparedStatement類,mybatis啟用了預編譯功能,在sql執行前,會先將上面的sql傳送給資料庫進行編譯,執行時,直接使用編譯好的sql,替換佔位符“?”就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題,在mybatis中,”${xxx}”這樣格式的引數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用“${xxx}”這樣的引數格式,所以,這樣的引數需要我們在程式碼中手工進行處理來防止注入。

結論:在編寫mybatis的對映語句時,儘量採用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的引數,要手工地做好過濾工作,來防止

sql注入攻擊。

不使用預編譯:

package com.test.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlInner {
    public static void main(String[] args) {
        //Read("zhangsan"); // 如果普通查詢可以
        Read("' or 1 or'");
    }
    public static void Read(String name) {
        Statement st = null;
        ResultSet rs = null;
        Connection conn = null;
        try {
            conn = DBUtils.getConnection();
            st = conn.createStatement();
            String sql = "select * from users where lastname = '" + name + "'"; // 主要注入發生地
            System.out.println("sql: " + sql); // 列印SQL語句
            rs = st.executeQuery(sql); 
            System.out.println("age\tlastname\tfirstname\tid");
            while (rs.next()) {
                System.out.println(rs.getInt(1) + "\t" + rs.getString(2)
                        + "\t\t" + rs.getString(3) + "\t\t" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.free(rs, st, conn);
        }
    }
}

使用預編譯:
package com.test.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SqlInner {
    public static void main(String[] args) {
        Read("' or 1 or'");
    }
    public static void Read(String name) {
        PreparedStatement st = null;
        ResultSet rs = null;
        Connection conn = null;
        try {
            conn = DBUtils.getConnection();
            String sql = "select * from users where lastname = ?"; // 這裡用問號        
            st = conn.prepareStatement(sql);
            st.setString(1,name); // 這裡將問號賦值
            rs = st.executeQuery(); 
            System.out.println("age\tlastname\tfirstname\tid");
            while (rs.next()) {
                System.out.println(rs.getInt(1) + "\t" + rs.getString(2)
                        + "\t\t" + rs.getString(3) + "\t\t" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.free(rs, st, conn);
        }
    }
}


相關推薦

HIbernateMybatis區別優劣勢[轉載]

統計 算法 高版本 抓取 一級緩存 mybatis sql優化 hiberna 優秀 第一章 Hibernate與MyBatis Hibernate 是當前最流行的O/R mapping框架,它出身於sf.net,現在已經成為Jboss的一部分。 Mybatis 是

hibernatemybatis區別(不看後悔,看了必懂)

①hibernate是一個標準的orm(物件關係對映)框架,通過JavaBean和資料庫的對映結構來自動生成sql;mybatis是不完全的orm框架,專注於sql本身,需要程式設計師自己寫sql; ②hibernate對sql的優化和修改比較困難,適合於需求變化不多的中小型專案,如ERP(

mybatis ${} #{}

                mybatis#{}和¥{}區別 ${} :是做字串拼接不能防止sql注入。並且單個引數時${這裡面必須是value},   如果引數時字串時需要在${}前後加上單引號。               假設通過名稱查詢user 表         注入漏洞sq

ibatismybatis區別

     iBatis 自從在 Apache 軟體基金會網站上釋出至今,和他的明星兄弟們(Http Server,Tomcat,Struts,Maven,Ant 等等)一起接受者萬千 Java 開發者的敬仰。然而在今年六月中旬,幾乎是釋出 3.0 版本的同時

Mybatis # $的區別

#{....}  相當於PreparedStatement 中的預編譯佔位符?,如 select * from table where id = ? 這樣能避免SQL拼接,從而避免SQL注入,  而且預編譯之後,語句會快取,下次執行速度更快。 在進行替換的時候 #{}會自動

badSQL,myBatis中#$區別

badSQL,myBatis中#$區別 在這裡插入程式碼片#{}是預編譯處理, $ {}是字串替換。mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值;mybatis在處理 $ {}時,就是把 $ {}替換成變數的值。使

hibernate與mybatis區別

sql方面: 1.mybatis的sql語句是由程式設計師是自己編寫相比hibernate更加靈活,sql調優更加簡單 2.。hibernate他把增刪改查的sql語句都封裝好了 ,開發效率高,如果是比較大型複雜的專案的話, 開發效率就不會很高,因為他的sql語

mybatis#{}與${}區別總結

一、總結:      #{ }:佔位符,防止sql注入      ${ }:sql拼接符號 二、分析:     動態sql是mybatis的強大的特性之一。mybatis在對sql語句進行預編譯之前會對sql進行動態解析,解析為一個BoundSql物件,也是在此處對動態S

HIbernateMybatis區別優劣勢

第一章     Hibernate與MyBatis Hibernate 是當前最流行的O/R mapping框架,它出身於sf.net,現在已經成為Jboss的一部分。 Mybatis 是另外一種優秀的O/R mapping框架。目前屬於apache的一個子專案。

Hibernate與Mybatis區別、Hibernate一級快取與二級快取之間的區別

Hibernate對資料庫提供了較為完整的封裝,不需要手寫SQL語句,自動生成、自動執行,持久層框架,開源的物件關係對映,對JDBC的進一步封裝。 Mybatis著力點在於JAVA物件與SQL之間的對映關係,需要編寫sql語句,半自動,需要注意的細節更多,但是

hibernate與mybatis區別優缺點對比

我是一名java開發人員,hibernate以及mybatis都有過學習,在java面試中也被提及問道過,在專案實踐中也應用過,現在對hibernate和mybatis做一下對比,便於大家更好的理解和學習,使自己在做專案中更加得心應手。 第一方面:開發速度的對比 就開

hibermate與mybatis區別

1.都是物件關係對映型框架,hibermate是pojo與資料庫表的對映,mybatis是pojo與sql語句的對映。2.mybatis開發上手比較容易,hibermate有一點難度3.Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不

mybatis----#{}${}

工作中有個點選排序的功能除錯了許久,終尋因,總結之。  需求是這樣的,頁面有個table,有一列的上下箭頭可點選並排序。對於這種需求,我的mybatis.xml的sql配置寫成了如下: <if test="map.ColumnNameSort!=null and m

JPA、Hibernate、Mybatis區別

4.查詢區別: 簡單查詢:Hibernate 提供了基礎的查詢方法,也可以根據具體的業務編寫相應的SQL; Mybatis需要手動編寫SQL語句,Spring Data 繼承基礎介面,可使用內建的增刪改查方法。 高階查詢:Hibernate通過物件對映機制,開發者無需關心SQL的生成與結果對映

mybatis中的#$的區別

背景 插入 trac sql註入 -m .com article 參數 -s 1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析成sql時的值為order by "111", 如果傳

Hibernate 與 mybatis 區別

精通 targe man 做的 select read 持久層 定義 順序 JAVA面試中問及HIBERNATE與 MYBATIS的對比,在這裏做一下總結 我是一名java開發人員,hibernate以及mybatis都有過學習,在java面試中也被提及問道過,在項

MyBatis Mapper.xml文件中 $#的區別

優先 註入 sql註入 jdb 防止 自動 || myba 由於 1.優先使用#{paramName,jdbcType=VARCHAR} 寫法,除了可以防止sql註入以外,它還能在參數裏含有單引號的時候自動轉義, 而${paramName}由於是類似於拼接sql的寫法,不具

mybatis mapper xml文件配置resultmap時,id行result行有什麽區別

什麽 column invoice 配置 app nbsp ava customer entity mybatis mapper xml文件配置resultmap時,id行和result行有什麽區別? <resultMap id = "CashInvoiceMap"

mybatis.xml文件中#與$符號的區別以及數學符號的處理

文件 integer order by rep select map 以及 方式 動態 1. #{}表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql註入。 #{}可以接收

mybatis 於 mybit 區別

簡化 成本 字段 myba bit 轉換 jdbc 高效 決定 兩者區別是還是非常大的,結合至今為止的經驗,總結出以下幾點:  1. hibernate是全自動,而mybatis是半自動。  hibernate完全可以通過對象關系模型實現對數據庫的操作,擁有完整的JavaB