• 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

    好,问题到此为止了 。::>_<::

  • 相关阅读:
    Jvm年轻代复制到Survivor To区时,对象存放不下会发生什么?
    Jvm内存布局和Java对象内存布局
    ArrayList的removeIf和iterator.remove性能比较
    闲着没事做,用js做了一个冒泡排序的动画
    对象与this
    idea 简记
    线程按序交替
    大数阶乘
    序列化 与 反序列化
    人月神话
  • 原文地址:https://www.cnblogs.com/kunpengv5/p/9960185.html
Copyright © 2020-2023  润新知