配置上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
好,问题到此为止了 。::>_<::