1. 程式人生 > >MyBatis學習總結(14)——Mybatis使用技巧總結

MyBatis學習總結(14)——Mybatis使用技巧總結

1、 區分 #{} 和 ${}的不同應用場景

1)#{} 會生成預編譯SQL,會正確的處理資料的型別,而${}僅僅是文字替換。
對於SQL: select * from student where xCode = ‘S123456’;
如果使用#{}
那麼生成的SQL為:
select * from student where xCode = ? 傳的值為’S123456’;
如果使用${}
那麼生成的SQL為:select * from student where xCode = S123456
如果xCode的資料型別為varchar,那麼使用${}就會報錯。
2)${}一般用在order by, limit, group by等場所。
假設我們使用#{} 來指定order by欄位,比如
select * from student order by #{xCode},
那麼產生的SQL為
select * from student order by ?, 替換值後為
select * from student order by ‘xCode’
Mybatis對xCode加了引號導致排序失敗

2、Spring環境用Mybatis-Spring的介面而不是Mybatis的原生介面

在spring 環境使用mybatis-spring的好處有:
1)我們可以使用Sping的宣告式事務處理模型(@Transactional),而不用手動迴歸事務。
2)mybatis-spring會優雅的關閉SqlSession,而不用手動關閉
3)可以將資料庫連線池交給spring管理,當程式停止的時候,spring會合適的關閉連線

3、返回Map<ID, Entity>而不是List便於查詢

有時太多的表連線(join)效能太差,我們會將該SQL拆為多個SQL,然後在程式碼中組裝起來。比如學生表和班級表,需要查詢的結果為”學號,班級,姓名”,我們可以先查詢“學號,班級ID,姓名”以及“班級ID,班級名次”,我們可以在查詢班級表的時候返回Map<班級ID, 班級>, 然後迭代學生表的結果集,用班級ID到Map<班級ID, 班級>中查詢對應的班級資訊,然後用班級名稱替換班級ID。
介面宣告為SqlSession.selectMap(String statement, String mapKey)

4、使用Map封裝查詢的結果

有時我們厭倦了為每個查詢寫一個Entity類,這時Map開始發揮它的功效。
對於要返回“學號,班級,姓名”結果的查詢,可以這樣寫Mapper:

12345<select id="selectStudent">selects.code as sNo,s.name as sName,c.name as cNamefrom xStudents,xClasscwheres.cID=c.ID</select>

如下宣告我們的dao方法:

1 2 3 publicList<
Map<String,Object>>selectStudent(Map<String,Object>parameter){
returngetSqlSession().selectList(getStatement("selectStudent"),parameter); }

如果要將該查詢結果轉為JSON字串返回,那麼我們就可以直接將List<Map<String, Object>轉為JSON,邏輯層不需要任何程式碼。
如果返回的結果集需要按select中的欄位順序返回,那麼將resultType=”java.util.HashMap” 換為resultType=”java.util.LinkedHashMap”

5、使用Map封裝查詢結果時注意資料的型別對映

對於如下的Mapper

1234<select id="selectStudent">selects.code as sNo,concat(s.firstName,s.lastName)as sNamefrom xStudents</select>

Mybatis會傻傻的將sName的資料型別對映為byte[], 因為我們沒有提供entity,mybatis也不知道我們想要什麼型別,而sName是計算出來的值,mybatis也沒有辦法從資料庫中獲取欄位的值,所以它就將其封裝為byte[],解決辦法很簡單,加一個cast 函式

1 2 3 4 <selectid="selectStudent"> selects.codeassNo,cast(concat(s.firstName,s.lastName)ASCHAR)assName fromxStudents </select>

6、正確的配置Mybatis 的Log

1)一個應用一般會使用很多的jar,各個jar依賴的log 實現不一樣,Mybatis查詢Log的順序為(SLF4J,Apache Commons Logging,Log4j 2,Log4j,JDK logging),如果classpath中有slf4j記得新增相應的橋接jar,比如slf4j-log4j。許多web 伺服器的classpath 會含有Apache Commons Logging,因此如果要使用Log4j,要麼使用SLF4J橋接Log4j,要麼在配置中強制指定使用Log4J。

1234567<configuration><settings>...<setting name="logImpl"value="LOG4J"/>...</settings></configuration>

7、警惕Mybatis的Foreach的的副作用

對於如下SQL:
假設有如下的mapper:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <selectid=testForeachparameterType=mapresultType=Student> Select*fromstudent <where> <iftest=ID!=nullandID!=‘’”> ID=#{ID} </if> <iftest=IDArr!=nullandIDArr.size()>0> AndIDIN <foreachcollection="IDArr"open="(" separator=","close=")"item="ID"> ${ID} </foreach> </if> </where> </select>

當我們傳入的IDArr時,最後產生的SQL為:
Select * from student where ID = ‘998’ AND ID IN ( ‘123’, ’234’,…..,’998’)
解決辦法:
解決辦法有
1) 將紅色的ID 換成別的名稱,比如“item”。
2) 這兩個if 是對同一個欄位判斷,改為choose… when 結構

相關推薦

MyBatis學習總結14——Mybatis使用技巧總結

1、 區分 #{} 和 ${}的不同應用場景 1)#{} 會生成預編譯SQL,會正確的處理資料的型別,而${}僅僅是文字替換。 對於SQL: select * from student wher

MyBatis學習筆記mybatis-config.xml都有哪些配置之環境配置與對映器

環境配置(environments),其中還可以配置事物,專案中大概也不會用到。 <environments default="development"> <environment id="development"> <t

MyBatis學習筆記mybatis-config.xml都有哪些配置之typeAliases與plugins

類型別名(typeAlicases) 在mybatis-config.xml配置檔案中加入類描述 <typeAliases> <typeAlias type="org.mybatis.example.User" alias="User" />

mybatis學習筆記- MyBatis 對映檔案(select)

1. select 返回 List & 記錄封裝 map 介面 EmployeeMapper public interface EmployeeMapper { //多條記錄封裝一個map:Map<Integer,Employee>:鍵

mybatis學習筆記- MyBatis 對映檔案(引數處理)

注意:本篇筆記內容承接上一篇 引數處理 1. 單個引數&多個引數&命名引數 簡介 單個引數:mybatis不會做特殊處理, #{引數名/任意名}:取出引數值。 多個引數:mybatis會做特殊處理。

mybatis學習筆記- MyBatis 對映檔案(增刪改)

1. MyBatis 對映檔案章節的工程目錄 對映檔案指導著MyBatis如何進行資料庫增刪改查, 有著非常重要的意義 2. 增刪改的使用 2.1. 建立 Employee 類 注意:如果給類建立有參構造器時,一定給它一個無參構造器 package www.x

Mybatis學習筆記-Mybatis配置檔案與對映檔案詳解

一、Mybatis配置檔案詳解 以下是mybatis.xml檔案,提倡放在src目錄下,檔名任意 <?xml version="1.0" encoding="UTF-8"?> <

Mybatis 學習筆記——Mybatis 逆向工程的三種方法

Mybatis 逆向工程   逆向工程通常包括由資料庫的表生成 Java 程式碼 和 通過 Java 程式碼生成資料庫表。而Mybatis 逆向工程是指由資料庫表生成 Java 程式碼。   Mybaits 需要程式設計師自己編寫 SQL 語句,但是 Myba

MyBatis學習總結——MyBatis核心配置檔案與輸入輸出對映

在上一章中我們學習了《MyBatis學習總結(一)——ORM概要與MyBatis快速起步》,這一章主要是介紹MyBatis核心配置檔案、使用介面+XML實現完整資料訪問、輸入引數對映與輸出結果對映等內容。 一、MyBatis配置檔案概要 MyBatis核心配置檔案在初始化時會被引用,在配置檔案中定義了一些

MyBatis學習總結——MyBatis快取與程式碼生成

 一、MyBatis快取 快取可以提高系統性能,可以加快訪問速度,減輕伺服器壓力,帶來更好的使用者體驗。快取用空間換時間,好的快取是快取命中率高的且資料量小的。快取是一種非常重要的技術。 1.0、再次封裝SqlSessionFactoryUtils 為了配置快取的學習我們將工具類再次封裝。 原SqlS

MyBatis學習總結24——Mybatis常見問題彙總

1. #{}和${}的區別是什麼? #{}是預編譯處理,${}是字串替換。Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值;Mybatis在處理${}時,就是把${}替換成變數的值。使用#{}可以有效的防止SQL注入,提高系統安全

MyBatis學習總結17——Mybatis分頁外掛PageHelper

<!-- plugins在配置檔案中的位置必須符合要求,否則會報錯,順序如下: properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?,

MyBatis 學習總結——MyBatis 簡單介紹及快速入門

MyBatis 簡單介紹及快速入門 簡單介紹 MyBatis是支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置

myBatis學習筆記10——使用攔截器實現分頁查詢

條件 iba execute rri itl alias property gen func 1. Page package com.sm.model; import java.util.List; public class Page<T&g

軟件架構設計學習總結14:大型網站技術架構網站的安全架構

根據 知情 提交 pac 請求參數 用途 text 避免 信息加密 從互聯網誕生起,安全威脅就一直伴隨著網站的發展,各種Web攻擊和信息泄露也從未停止。常見的攻擊手段有XSS攻擊、SQL註入、CSRF、Session劫持等。 1、XSS攻擊 XSS攻擊即跨站點腳本攻擊(C

redis學習筆記14---redis基本命令總結

del diff lan 命令 列表 對象 很多 順序 reg http://doc.redisfans.com/ 網頁,對所有redis命令的用法與示例進行了詳細的描述 概述 Redis的鍵值可以使用物種數據類型:字符串,散列表,列表,集合,有序集合。本文詳細介紹這

Mybatis學習系列Mapper映射文件

tst 轉換 tin 是個 sql註入 eas 屬性。 object spl Mapper映射文件,作用是用來配置SQL映射語句,根據不同的SQL語句性質,使用不同的標簽,mapper文件中常用的標簽有<iselect>、<insert>、<

Mybatis學習系列緩存機制

emca value 不存在 memcach except input jedis 寫入 on() Mybatis緩存介紹 MyBatis提供一級緩存和二級緩存機制。 一級緩存是Sqlsession級別的緩存,Sqlsession類的實例對象中有一個hashmap用於緩

JavaEE--Mybatis學習筆記

一個數 border none 取出 bean 需要 table add 基金 一、簡介: MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為M

JavaEE--Mybatis學習筆記--單表的CURD 補充

動態代理 doctype bubuko 使用 rop 單表 one lse name 1.屬性名和字段名不一致 使用別名 <select id="selectAllStudents" resultType="Student"><!-- 需要