當前位置:首頁 » 編程語言 » 獲取mybatissql語句
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

獲取mybatissql語句

發布時間: 2023-04-15 13:45:19

1. 請教Mybatis中如何在程序中獲取Mapper中定義的sql語句

把mybatis3.2的源碼下載之後,把裡面PooledDataSource類的log輸出沖叢部散攜櫻分,換成log.warn之後,重新打jar包,放到項目中,隱舉日誌級別改為info,如:

Java代碼
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

2. 請教Mybatis中如何在程序中獲取Mapper中定義的SQL語句

明知彎

sqlSessionFactory.getConfiguration().getMappedStatement("com..ResourceDao.save").getBoundSql(null).getSql()

com..ResourceDao為namespace

save為id

激悶猛戚

3. springmvc+mybatis 如何獲取sql語句

在web.xml配置文件中加咐螞入Log4j的配置,部分配置文件如下:

<!--Log4j配置-->
<context-param>
<衡衫埋param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<!-- 掃描spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/塌激application-*.xml</param-value>
</context-param>

<!-- 監聽器 -->
<listener>
<listener-class>com.hanvon.iface.web.listener.WebAppEventListener</listener-class>
</listener>
.......

4. 請教Mybatis中如何在程序中獲取Mapper中定義的SQL語句

我把mybatis3.2的源碼下載之後,把裡面PooledDataSource類的畢州log輸出部分,換成log.warn之後,重新打jar包,放到項目中,日誌級別改為info,如:

Java代棚羨碼
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

此手和蔽時,info級別能夠輸出warn級別的日誌,我的日誌顯示如下:

Java代碼
[service] 2013-04-19 10:30:57,982 - org.apache.ibatis.datasource.pooled.PooledDataSource -0 [main] WARN org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2013-04-19 10:30:57,985 - org.apache.ibatis.datasource.pooled.PooledDataSource -3 [main] WARN org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2013-04-19 10:30:57,986 - org.apache.ibatis.datasource.pooled.PooledDataSource -4 [main] WARN org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2013-04-19 10:30:57,996 - org.apache.ibatis.datasource.pooled.PooledDataSource -14 [main] WARN org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2013-04-19 10:30:59,025 - org.apache.ibatis.datasource.pooled.PooledDataSource -1043 [main] WARN org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 22323092.
[service] 2013-04-19 10:30:59,076 - org.apache.ibatis.datasource.pooled.PooledDataSource -1094 [main] WARN org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 22323092 to pool.

很明顯,這是顯示warn的日誌信息了。說明mybatis3隻是列印了debug級別的日誌。

5. 請教Mybatis中如何在程序中獲取Mapper中定義的SQL語句

<mappernamespace="AccountMapper">
<updateid="updateLoginTime"parameterType="int">
<![CDATA[
updatesys_accountsetlogin_date=now(),updatedate=now()whereid=#{accountId}
]]>
</update>
</mapper>

舉例如上面的xml定義的Mapper,在代碼中可以通過AccountMapper.updateLoginTime獲取到update sys_account set login_date = now(), updatedate = now() where id = #{accountId}這行sql

6. 怎麼獲取mybatis運行的sql語句

在項目中,使用的是mybatis3.0.5,但沒有採用其提供的DAO層介面映射的策略,而且在進行多種屬性聯合查找時,需要底層提供通用的解決方案,所以需要mybatis直接執行sql語句,各個Impl均可調用,減少了在每個mybatis文件中配置符合當前對象的select查詢。。
(在mybatis中,需要通過傳遞對象,在select中判斷對象屬性是否為空進行where語句的拼湊,對後期的維護工作帶來不小的考驗,所以採用直接執行sql策略)
先說一說配置時,遇到的異常:

Xml代碼
<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap">
${sql}
</select>
這樣配置時,會出現:there no getter sql in Java.lang.String 的異常

所以考慮:用一個適配器,將sql作為屬性加入其中
首先:

Xml代碼
<typeAlias alias="sqladapter" type="com.zj.logistics.util.SQLAdapter" />
其次:

Java代碼
public class SQLAdapter {
String sql;

public SQLAdapter(String sql) {
this.sql = sql;
}

public String getSql() {
return sql;
}

public void setSql(String sql) {
this.sql = sql;
}
}
最後:

Xml代碼
<select id="findRecords" parameterType="SQLAdapter" resultMap="orderTypeResultMap">
${sql}
</select>
注意,不要忘記在調用該select方法時,用new SqlAdapter("自己寫的sql語句")作為參數哦。。。

搞定。。

真能折騰人的,這個直接寫 value 不就可以了?

<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap">
${value}
</select>

7. 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 不支持吧。

8. 請教Mybatis中如何在程序中獲取Mapper中定義的SQL語句

可以用對應Mapper類,裡面的方法名是對應的sql語句的ID名,這個可以去調用;還有一種,就是不用Mapper類,可以直接用xml的文件名.id名獲取的方式,這個方式要有像SqlSessionTemplate這樣的類,提前定義好方法獲取方式,然後調用就可以了

9. java通過反射拿到mybatis中的sql語句並操作怎麼用什麼時候用

操作。具體的步驟如下:

  • 獲取 MyBatis 中的 MappedStatement 對象。可以通過 SqlSession 的 getConfiguration() 方法獲取 Configuration 對象,然後再通過 Configuration 對象的 getMappedStatement() 方法獲取 MappedStatement 對象。

  • 從 MappedStatement 對象中獲取 BoundSql 對象,即 SQL 語句綁定的參數對象。

  • 從 BoundSql 對象中獲取 SQL 語句字元串。可以通過調用 getSql() 方法獲取 SQL 語句字元串。

  • 對 SQL 語句進行相應的操作。例如,可以對 SQL 語句進行修改、輸出等操作。

  • Java 通過反射獲取 MyBatis 中的 SQL 語句的代碼示例兆皮鋒:

SqlSession sqlSession = sqlSessionFactory.openSession();

try {

// 獲取 MappedStatement 對象

MappedStatement mappedStatement = sqlSession.getConfiguration().getMappedStatement("com.example.mapper.selectUser"握並);

// 獲取 BoundSql 對象

BoundSql boundSql = mappedStatement.getBoundSql(paramObject);

// 獲取 SQL 語句字元串

String sql = boundSql.getSql();

// 對 SQL 語句進行相應的操作

// ...

} finally {

sqlSession.close();

}

需要注意的是,在使用反射獲族晌取 SQL 語句時,要注意保護用戶隱私和安全,以免發生 SQL 注入等問題。

10. 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