org.apache.ibatis.binding.BindingException问题解决

这个是在整合MyBatis的时候出现的,当前用到的是基于xml去处理数据的,也有人用注解去操作数据,不过不太灵活,简单的数据可以搞搞,复杂还是写sql好些

项目概述

1、先介绍下大概的情况,首先工程目录说明:

essys_parent为父工程,
essys_base和essys_common为子工程,由于采用了maven多模块开发,并且用到了springboot
org.apache.ibatis.binding.BindingException问题解决_第1张图片

2、以essys_base为demo来编写启动测试页面

其目录结构如下图所示:
org.apache.ibatis.binding.BindingException问题解决_第2张图片
关于各层代码内容


1.bean下的实体
类名:Staff.java,所在包bean

package cn.paygun.essys.bean;
import java.util.Date;
/**
 * 对应数据库中的员工数据表
 */
public class Staff {
  private Long id;//主键id
  private String userNo;//用户编号
  // ... 省略其他的属性
  public Staff() {} // 提供无参构造方法,为了后面可以加入有参构造以提供基础对象初始化调用
  
  // 取得id
  public Long getId() {
    return id;
  }
  // 设置id
  public void setId(Long id) {
    this.id = id;
  }
  // 取得userNo
  public String getUserNo() {
    return userNo;
  }
  // 设置userNo
  public void setUserNo(String userNo) {
    this.userNo = userNo;
  }
  // 省略其他的属性getter和settger方法

2.mapper的操作数据库
类名:StaffDao.java,所在包mapper

package cn.paygun.essys.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import cn.paygun.essys.bean.Staff;

@Mapper
public interface StaffDao {
  // 取所有数据
  public List<Staff> getAll();
}

StaffDao类的映射文件,名称为:StaffDao.xml,所在包mapper,与StaffDao同路径



<mapper namespace="cn.paygun.essys.mapper.StaffDao">
  <select id="getAll" resultType="cn.paygun.essys.bean.Staff">
		SELECT * FROM staff
	select>
mapper>

3.service业务操作
类名:StaffService.java,所在包service

package cn.paygun.essys.service;

import cn.paygun.essys.bean.Staff;
import cn.paygun.essys.mapper.StaffDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class StaffService {
  @Autowired
  StaffDao staffDao;
  public List<Staff> getList(){
    return staffDao.getAll();
  }
}

4.controller跳转
类名:MyController.java,所在包controller
本类为浏览器路径路由类,提供了一个从数据库里取数据并返回数据至页面显示的方法,和一个直接返回字符串数据的方法

package cn.paygun.essys.controller;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.paygun.essys.bean.Staff;
import cn.paygun.essys.service.StaffService;

@RestController
public class MyController {
  @Autowired
  private StaffService staffService;
  @RequestMapping("/show1")
  public List<Staff> getAll1() {
    List<Staff> list = staffService.getList();
    return list;
  }
  @RequestMapping("/aa")
  public String getA() {
    return "aa";
  }
}

5.配置文件
主配置文件 application.properties

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql:///test?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
server.port=8087

日志打印配置:

log4j.rootLogger=DEBUG,stdout
log4j.logger.org.mybatis=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n 

pom.xml配置

使用到了maven,进行项目依赖的管理。由于采用maven的多模块整合形式搭建项目,先介绍下essys_parent的pom.xml吧

以下是essys_parent的pom里的配置内容


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>

  <groupId>cn.paygungroupId>
  <artifactId>essys_parentartifactId>
  <version>1.0-SNAPSHOTversion>
  <modules>
    <module>essys_commonmodule>
    <module>essys_basemodule>
  modules>
  <packaging>pompackaging>
  <name>essys_parentname>
  <description>项目描述内容:description>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    <java.version>1.8java.version>
  properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.0.1.RELEASEversion>
        <type>pomtype>
        <scope>importscope>
      dependency>
    dependencies>
  dependencyManagement>

  <dependencies>
    
    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-testartifactId>
    dependency>
    
    <dependency>
      <groupId>org.apache.commonsgroupId>
      <artifactId>commons-lang3artifactId>
      <version>3.4version>
    dependency>
    
    <dependency>
      <groupId>org.jsoupgroupId>
      <artifactId>jsoupartifactId>
      <version>1.10.1version>
    dependency>
  dependencies>
  
  <repositories>
    <repository>
      <id>spring-snapshotsid>
      <name>Spring Snapshotsname>
      <url>https://repo.spring.io/snapshoturl>
      <snapshots>
        <enabled>trueenabled>
      snapshots>
    repository>
    <repository>
      <id>spring-milestonesid>
      <name>Spring Milestonesname>
      <url>https://repo.spring.io/milestoneurl>
      <snapshots>
        <enabled>falseenabled>
      snapshots>
    repository>
  repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>spring-snapshotsid>
      <name>Spring Snapshotsname>
      <url>https://repo.spring.io/snapshoturl>
      <snapshots>
        <enabled>trueenabled>
      snapshots>
    pluginRepository>
    <pluginRepository>
      <id>spring-milestonesid>
      <name>Spring Milestonesname>
      <url>https://repo.spring.io/milestoneurl>
      <snapshots>
        <enabled>falseenabled>
      snapshots>
    pluginRepository>
  pluginRepositories>
project>

以下是essys_base的pom里的配置内容:



<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>
  <artifactId>essys_baseartifactId>
  <name>essys_basename>

  <parent>
    <artifactId>essys_parentartifactId>
    <groupId>cn.paygungroupId>
    <version>1.0-SNAPSHOTversion>
  parent>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    <java.version>1.8java.version>
  properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
      <groupId>org.mybatis.spring.bootgroupId>
      <artifactId>mybatis-spring-boot-starterartifactId>
      <version>1.3.1version>
    dependency>
    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
    dependency>
    <dependency>
      <groupId>commons-iogroupId>
      <artifactId>commons-ioartifactId>
      <version>2.5version>
    dependency>
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>druidartifactId>
      <version>1.0.29version>
    dependency>
  dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-maven-pluginartifactId>
        <configuration>
          <executable>trueexecutable>
        configuration>
      plugin>
    plugins>
  build>
project>

开始启动项目

1、打开浏览器,输入localhost:8087,先请求/aa路径
有信息,出现了aa,请求状态200,没毛病。。。
org.apache.ibatis.binding.BindingException问题解决_第3张图片
2.那我们再来请求一下/show路径吧,一请求吓一跳,返回了500,如下图
org.apache.ibatis.binding.BindingException问题解决_第4张图片
我们转到idea的console界面,发现了下面的输出内容
文字报错内容

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.paygun.essys.mapper.StaffDao.getAll
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:225) ~[mybatis-3.4.5.jar:3.4.5]
	at org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:48) ~[mybatis-3.4.5.jar:3.4.5]
	at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65) ~[mybatis-3.4.5.jar:3.4.5]
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58) ~[mybatis-3.4.5.jar:3.4.5]
	at com.sun.proxy.$Proxy62.getAll(Unknown Source) ~[na:na]
	at cn.paygun.essys.service.StaffService.getList(StaffService.java:18) ~[classes/:na]

图片截图(错误的内容是一样的):
org.apache.ibatis.binding.BindingException问题解决_第5张图片
错误为BindingException,于是找了一下相关的百度搜索。
这个还可以,总结了日常容易出现的(跟BindingExceptiong有关的):https://www.cnblogs.com/lfm601508022/p/InvalidBoundStatement.html

但是没有用,这些个问题都不存有。于是想到了编译输出后不存在xml文件这个问题不太引人注目的问题,跑去看了一下编译输出文件目录内容,发现xml居然没有????
org.apache.ibatis.binding.BindingException问题解决_第6张图片
于是向essys_base的pom.xml里添加了resources节点配置,目的将src>main>java中含有*.xml的都要输出到编译目录下 org.apache.ibatis.binding.BindingException问题解决_第7张图片

保存一哈,进行重启,再次访问localhost:8087/show,可以返回json数据了
org.apache.ibatis.binding.BindingException问题解决_第8张图片
再检查下编译后输出的内容,多出来了xml文件,看来还是那个resources没有配置导致的
org.apache.ibatis.binding.BindingException问题解决_第9张图片

你可能感兴趣的:(---Java技术)