Mybatis中的#和$有何區別。
#相當於對數據加了雙引號,$相當於直接顯示數據。
1、#將傳入的數據都當做一個字符串,會對自動傳入的數據加雙引號。如:order by #id#。如果傳入的id值爲11,則解析sql爲order by “11”。如果傳入的值是id,則解析爲order by “id”
2、$將傳入的數據直接顯示生成在sql中,如:order by #id#。如果傳入的值id爲11,則解析爲order by 11。如果傳入值爲id,則解析爲order by id。
3、#方式能很大程度防止sql注入
$無法防止sql注入。
4、 $一般用於傳入數據庫對象,例如傳入表名。
5、一般能用#的就不用 $。
Mybatis的編程步驟
- 創建SqlSessionFactory
- 通過SqlSessionFactory創建SqlSession
- 通過SqlSession執行數據庫操作
- 通過SqlSession.commit()。提交事務
- 調用SqlSession.close()。關閉會話。
JDBC編程有哪些不足之處,MyBatis是如何解決的
- 數據庫連接創建、釋放頻繁,造成系統資源浪費從而影響系統性能。如果使用數據庫連接池可以解決此問題。
解決:在SqlMapConfig.xml中配置數據庫連接池,使用連接池管理數據庫連接。 - Sql語句寫在代碼中不易維護,實際應用sql變化可能較大,sql變動時需要改寫代碼。
解決:將sql語句配置在***mapper.xml文件中,與Java代碼剝離。 - 向sql語句傳參麻煩,因爲sql語句where條件不一定,可能多也可能少,佔位符需要和參數一一對應。
解決:Mybatis自動將Java對象映射到sql語句中,並可以通過< if >標籤來決定是否使用某些條件等。 - 對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果將查詢結果封裝爲pojo對象則解析比較方便,
解決:MyBatis將sql查詢結果自動映射至Java對象。
使用 MyBatis 的 mapper 接口調用時有哪些要求?
- Mapper 接口方法名和 mapper.xml 中定義的每個 sql 的 id 相同
- Mapper 接口方法的輸入參數類型和 mapper.xml 中定義的每個 sql 的 parameterType 的類型相同
- Mapper 接口方法的輸出參數類型和 mapper.xml 中定義的每個 sql 的 resultType 的類型相同
- Mapper.xml 文件中的 namespace 即是 mapper 接口的類路徑。