配置上mybatis,增加dao層后,重新寫查詢頁面,結果又遇到不少坑,全是學費。代碼結構如下:

1、Invalid bound statement (not found)
報錯界面如下。mybatis好久不寫,重溫一下使用。明顯是Mapper.xml與同名的Dao接口映射出現問題導致。

排查過程如下:
1)檢查xml文件所在package名稱是否和Mapper interface所在的包名
2)<mapper namespace="me.tspace.pm.dao.UserDao"> 命名空間是否正確
3)UserDao的方法在UserDao.xml中沒有,然后執行UserDao的方法會報此
4)UserDao的方法返回值是List<User>,而select元素沒有正確配置ResultMap,或者只配置ResultType!
可是排查完上述過程,都沒有解決掉。后來經同事點播。終於解決
解決辦法:
在spring的配置文件中,配置掃描地址。前者配置掃描mapper,后者配置掃描dao層,然后相互關聯對應。

2、輸入查詢條件,查詢不出來對應的結果
頁面出來了,默認展示全部的結果。輸入查詢條件后,篩選出對應的值。但無論怎么輸入,查詢結果就是篩選不出來。
debug后,返回的List結果還是空。

排查思路:
1)mybatis中sql語句寫錯了嗎
將mapper.xml中的sql語句,專門摘出來,放到mysql中查詢,可以得到正確的結果。說明語句沒有問題。
為了排查問題,特意將語句寫的簡單些。仍未果

2)傳錯參數了?
springMvc+mybatis,參數傳遞綁定,有比較成熟的一套邏輯。
前台頁面輸入String類型的name值,controller獲取后,根據name值(可以自定義)自動綁定到entity實體類的屬性中
經過controller層,service層,dao層,將對象實例,逐步傳遞到dao層。然后傳入mapper.xml
mapper.xml根據傳入的參數類型parameterType為實體類,將對應的表,表的字段與實體類的參數挨個綁定。並根據查詢的參數#{name},從傳入的實體類取出對應的屬性值。
核對了一下之后,沒有問題,排查未果。
3)又是亂碼的問題嗎?
挨個排查,spring框架中,對於前端頁面輸入和后台返回的值編碼,有專門的filter配置。在web.xml中已經配置過了。
配置內容如下:
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
且根據debug的值,傳入的值屬性也是正確的編碼,問題出在哪里呢?
目光繼續聚焦在sql語句上,打印一下mapper中執行的sql語句吧。
配置方法如下:
a)首先在resources中的conf中,新建xml文件,內容如下:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 打印查詢語句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> <!-- mapper已經在spring-mybatis.xml中的sqlSessionFactory配置,這里不再需要配置 --> <!-- <mappers> --> <!-- <mapper resource="com/a/b/c/dao/BusinessInfoDaoMapper.xml" /> --> <!-- </mappers> --> </configuration>
再回到spring的配置文件中。

<!--4、持久化操作需要sqlSession,來自spring和mybatis的整合包--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--數據源--> <property name="dataSource" ref="dataSource"/> <!--指定別名--> <property name="typeAliasesPackage" value="com.fruitsalesplatform.entity"/> <property name="mapperLocations" value="classpath:com.fruitsalesplatform.dao/*.xml"/> <property name="configLocation" value="classpath:conf/mybatis-config.xml"/> </bean>
配置完成后,查看打印的結果,並沒有什么異常。
b) 在查詢的表中,插入一下記錄,為英文。英文可以查詢出來!還是亂碼的問題!
只能再認真看一下數據庫的配置,元凶出現了。在properties文件中用的&

果斷改為
jdbc.url=jdbc:mysql://localhost:3306/fruit_manage?useUnicode=true&characterEncoding=utf-8
好,問題到此為止了 。::>_<::
