⑴ mybatis級聯查詢,sql語句是怎麼執行的
你的語句拼錯了,密碼的查詢前面多了一個where,應該是
1
String
sql
=
"select
*
from
users
where
readername='"+name+"'"+"and
password='"+password+"'";
⑵ 如何在mybatis中調試查看生成的sql語句
用過Hibernate的人都知道,hibernate 是可以配置 show_sql 顯示 自動生成的SQL 語句,用format_sql 可以格式化SQL 語句,但如果用 mybatis 怎麼實現這個功能呢, 在網上搜索了下,基本都是通過配置日誌來實現的,比如配置我們最常用的 log4j.properties 來實現。
log4j.properties 內容
程序代碼
log4j.rootCategory=info, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:/my_log.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %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,stdout
有人在網上說不能用 slf4j.jar ,這個說法應該是錯誤的, slf4j 只是提供了很多介面,可以供很多日誌系統用,並不是具體的解決方案,我的jar 包用到
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
log4j-1.2.15.jar
貌似版本比較老,但可以使用,可以參考一下。
通過這種方式mybatis 就可以在控制台列印出sql語句,並且也可以寫到日誌文件中去。但是還沒有format sql, 我也在研究,不過目前沒進展,應該mybatis 不支持吧。
⑶ Mybatis查詢自連接的SQL語句怎麼寫
在對應的.xml中添加insert標簽,換掉中間的insert語句
insert
into
user(username,userage,useraddress)
values(#{username},#{userage},#{useraddress})
⑷ 如何在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
⑸ 如何在mybatis中調試查看生成的sql語句
最常用的 log4j.properties 來實現。
log4j.properties 內容如下:
log4j.rootCategory=info, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:/my_log.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %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,stdout
有人在網上說不能用 slf4j.jar ,這個說法應該是錯誤的, slf4j 只是提供了很多介面,可以供很多日誌系統用,並不是具體的解決方案,我的jar 包用到
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
log4j-1.2.15.jar
貌似版本比較老,但可以使用,可以參考一下。
通過這種方式mybatis 就可以在控制台列印出sql語句,並且也可以寫到日誌文件中去。但是還沒有format sql, 我也在研究,不過目前沒進展,應該mybatis 不支持吧。
⑹ 如何在mybatis中調試查看生成的sql語句
您好:
要在控制台查看生成的sql語句,需要配置日誌,這里以lo4j2為例子;
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
⑺ Mybatis查詢自連接的SQL語句怎麼寫
select t1.* from tb_vocation_category t1,tb_vocation_category t2 where t1.vocation_category_id = t2.vocation_category_parent_id(+)
⑻ 如何MyBatis中使用動態SQL查詢與注釋
如何MyBatis中使用動態SQL查詢與注釋
靜態 SQL:靜態 SQL 語句一般用於嵌入式 SQL 應用中,在程序運行前,SQL 語句必須是確定的,例如 SQL 語句中涉及的列名和表名必須是存在的。靜態 SQL 語句的編譯是在應用程序運行前進行的,編譯的結果會存儲在資料庫內部。而後程序運行時,資料庫將直接執行編譯好的 SQL 語句,降低運行時的開銷。靜態SQL在編譯時已經確定了引用的表和列。 宿主變數不改變表和列信息。 可以使用主變數改變查詢參數值, 但是不能用主變數代替表名或列名。
動態 SQL:動態 SQL 語句是在應用程序運行時被編譯和執行的,不在編譯時確定 SQL 的表和列,而是讓程序在運行時提供,並將SQL 語句文本傳給 DBMS 執行。 靜態 SQL 語句在編譯時已經生成執行計劃。 而動態 SQL 語句,只有在執行時才產生執行計劃。動態 SQL 語句首先執行 PREPARE 語句要求 DBMS 分析、確認和優化語句,並為其生成執行計劃。例如,使用 DB2 的互動式工具 CLP 訪問資料庫時,用戶輸入的 SQL 語句是不確定的,因此 SQL 語句只能被動態地編譯。動態 SQL 的應用較多,常見的 CLI 和 JDBC 應用程序都使用動態 SQL。
⑼ mybatis 查詢 動態sql語句怎麼寫
mybatis的sql和你在資料庫客戶端執行的sql是一樣的,但是在mybatis中調用的sql一般都是動態的,所以用到了參數傳遞。這個mybatis有對應的標簽以及相應的變數來實現。你可以搜索下mybatis標簽。同時給你一個參考的你看看,這個是一個查詢用戶的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<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 查詢 orderby
https://blog.csdn.net/xiaofanren1111/article/details/79470930
https://www.cnblogs.com/200911/p/5869097.html
在mybatis進行sql查詢時,如果要用到排序功能,語句應該寫成 order by ${user_id} 而不是 order by #{user_id} 。因為
但是,正因為 $ 會照原樣傳遞參數,所以:
而 # 在底層是JDBC中的 PreparedStatement 類在起作用, PreparedStatement 是我們很熟悉的 Statement 的子類,它的對象包含了編譯好的SQL語句。這種「准備好」的方式不僅能提高安全性, 防止sql注入 ,而且在多次執行同一個SQL時,能夠提高效率。原因是SQL已編譯好,再次執行時無需再編譯。
如果堅持要用 $ ,最好對輸入的參數進行過濾,只允許白名單內的參數進行查詢。