SpringMVCDemo中,遇到的問題(二)之mybatis中的mapper映射


配置上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文件中用的&amp;

果斷改為

jdbc.url=jdbc:mysql://localhost:3306/fruit_manage?useUnicode=true&characterEncoding=utf-8

好,問題到此為止了 。::>_<::


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM