知了堂Java | Java基礎(chǔ)面試題(11)
3.什么是sql注入?如何防止sql注入?
sql注入:
通過在 Web 表單中輸入(惡意)SQL 語句得到一個存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫,而不是 按照設(shè)計者意圖去執(zhí)行 SQL 語句。例如:當(dāng)執(zhí)行的 sql 為 select * from user where username = "admin" or "a"="a"時,sql 語句恒成立,參數(shù) admin 毫無意義?
防止 sql 注入的方式:
1. 預(yù)編譯語句:如,select * from user where username = ?,sql 語句語義不會發(fā)生改變,sql 語 句中變量用?表示,即使傳遞參數(shù)時為"admin or 'a'= 'a'",也會把這整體當(dāng)做一個字符創(chuàng)去查詢。
2. Mybatis 框架中的 mapper 方式中的 # 也能很大程度的防止 sql 注入($無法防止 sql 注入)。
4.有哪些sql優(yōu)化方法??
當(dāng)只要一行數(shù)據(jù)時使用 limit 1?
查詢時如果已知會得到一條數(shù)據(jù),這種情況下加上 limit 1 會增加性能。因為 mysql 數(shù)據(jù)庫引 擎會在找到一條結(jié)果停止搜索,而不是繼續(xù)查詢下一條是否符合標(biāo)準(zhǔn)直到所有記錄查詢完 畢。?
選擇正確的數(shù)據(jù)庫引擎 ,Mysql 中有兩個引擎 MyISAM 和 InnoDB,每個引擎有利有弊
MyISAM 適用于一些大量查詢的應(yīng)用,但對于有大量寫功能的應(yīng)用不是很好。甚至你只需要 update 一個字段整個表都會被鎖起來。而別的進程就算是讀操作也不行要等到當(dāng)前 update 操作完成之后才能繼續(xù)進行。另外,MyISAM 對于 select count(*)這類操作是超級快的。
InnoDB 的趨勢會是一個非常復(fù)雜的存儲引擎,對于一些小的應(yīng)用會比 MyISAM 還慢,但是 支持“行鎖”,所以在寫操作比較多的時候會比較優(yōu)秀。并且,它支持很多的高級應(yīng)用,例 如:事務(wù)。
用 not exists 代替 not in?
Not exists 用到了連接能夠發(fā)揮已經(jīng)建立好的索引的作用,not in 不能使用索引。Not in 是 最慢的方式要同每條記錄比較,在數(shù)據(jù)量比較大的操作時不建議使用這種方式?
對操作符的優(yōu)化,盡量不采用不利于索引的操作符?
如:in not in is null is not null <>等
某個字段總要拿來搜索,
為其建立索引:Mysql 中使用 alter table 語句來為表中的字段添加 索引:alter table 表明 add index (字段名)