mybatis的sql語句as
『壹』 如何實現基於註解mybatis動態拼寫sql語句
您好,在spring中配置
<!-- 通過掃描的模式,掃描目錄在com.mrorder.目錄下,所有的mapper都繼承SqlMapper介面的介面 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mrorder."/>
<property name="markerInterface" value="com.mrorder..SqlMapper"/>
</bean>
自己寫層方法的介面
public interface OrderMapper extends SqlMapper{
@Select("select * from tbl_order where room like #{room} and mydate like #{mydate}")
public List<Order> getbyroom(OrderPara op);
}
這樣整個語句是寫死的,必須有2個參數,在這種模式下,如何能實現根據room和mydate是否為空來動態的拼寫sql語句
比如當mydate=""
Select("select * from tbl_order where room like #{room} ")
public List<Order> getbyroom(OrderPara op);
如果用xml來配置語句的話,可以用<when test="title != null">
and mydate= #{mydate}
</when>
如果是用@Select 這種 改如何做呢?
利用自定義註解,通過反射,拼出SQL語句。
『貳』 Mybatis源碼解析(1) 如何獲得SQL語句
筆者只能說會使用Mybtis,並沒有具體研究過源碼,站在一個使用者的角度記錄解決的問題。
跳過大部分源碼,從一個功能點開始入手。
以 Select 操作為例,研究如何獲取經過 Mybatis 中 動態語句 轉換後的的 SQL語句 。
我們這里不涉及復雜的過程原理(如:讀取配置文件、Mapper代理等( 我也不懂 )),只說明一下具體流程。
發現studentMapper被MapperProxy實現。
好奇的同學肯定會問studentMapper是如何創建MapperProxy實例的呢?
一路跟隨瞎點。會發現一個配置類,裡面東西很多,目前只看和Mapper有關系。
我們繼續下一步
到此關於Mapper的運行過程已經分析完了,下面繼續分析SelectOne過程。
selectOne 其實只是 selectList 取第一個元素(這點是沒有想到的)。
源碼解析,這還是第一次寫這類文章,確實這些框架的原理,並沒有研究過只是知道一點概念,Mapper動態代理之類的。網上的博客從大方向出發,框架設計、設計模式之類的,對於我這種基礎薄弱的人看的雲里霧里。我准備從一個一個功能開始初步了解、研究此類框架原理。
參考 https://blog.csdn.net/luanlouis/article/details/40422941
『叄』 mybatis中sql語句怎麼寫
<select id="queryUsers" parameterType="map" resultType="xx.xx.xx.bean.UserBean">
<![CDATA[
select
ID,
LOGIN_NAME AS loginName,
PASSWORD,
REAL_NAME AS realName,
POSITION,
(SELECT D.POSITION_NAME FROM UNIT_POSITION D WHERE D.POSITION_CODE=T.POSITION) POSITIONNAME,
USER_TYPE AS userType,
SEX,
PID,
TO_CHAR(T.BIRTHDAY,'YYYY-MM-DD') BIRTHDAY,
EMAIL,
CONTACT_TEL AS contactTel,
CONTACT_MOBILE AS contactMobile,
CONTACT_FAX AS contactFax,
CONTACT_ZIP AS contactZip,
CONTACT_ADDR AS contactAddr,
STATUS,
EDUCATION,
(SELECT D.EDUCATION_NAME FROM UNIT_EDUCATION D WHERE D.EDUCATION_CODE=T.EDUCATION AND D.STATUS=0) EDUCATIONNAME,
NATION,
POLITICAL,
REMARK,
TO_CHAR(T.CREATE_DATE,'YYYY-MM-DD HH24:MI:SS') createDate,
(SELECT D.REAL_NAME FROM UNIT_USER D WHERE D.ID= T.CREATE_USER_ID) createUserId,
TO_CHAR(T.UPDATE_DATE,'YYYY-MM-DD HH24:MI:SS') updateDate,
(SELECT D.REAL_NAME FROM UNIT_USER D WHERE D.ID= T.UPDATE_USER_ID) updateUserId
from UNIT_USER T
]]>
<where>
T.STATUS='1'
<if test="realName !=null and realName !=''">
and T.REAL_NAME like '%${realName}%'
</if>
<if test="nexusDpartment !=null">
AND T.ID IN (SELECT DISTINCT D.USER_ID FROM UNIT_USER_DEPT D WHERE D.DEPT_CODE IN (${nexusDpartment}))
</if>
<if test="deptCode !=null and deptCode !=''">
AND T.ID IN (SELECT DISTINCT D.USER_ID FROM UNIT_USER_DEPT D WHERE D.DEPT_CODE = #{deptCode})
</if>
</where>
<if test="sort != null and sort != ''">
order by ${sort}
<if test="direction != null and direction != ''">
${direction}
</if>
</if>
</select>
『肆』 mybatis怎麼在控制台列印sql語句
mybatis默認使用log4j,當有self4j這個日誌jar包存在時會無法列印sql,請移除或者在工程啟動時顯示設置mybatis使用的日誌類
log4j.logger.org.apache.ibatis=debug,stdout
log4j.logger.java.sql=debug,stdout
『伍』 如何在mybatis中調試查看生成的sql語句
mybatis的源碼中查看生成的sql語句,參考執行以下代碼即可。具體代碼如下:
把裡面PooledDataSource類的log輸出部分,換成log.warn之後,重新打jar包,放到項目中,日誌級別改為info,如:
log4j.rootLogger=info,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[service]%d-%c-%-4r[%t]%-5p%c%x-%m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../logs/service.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[service]%d-%c-%-4r[%t]%-5p%c%x-%m%n
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug