当前位置: 首页 > 编程笔记 >

SpringBoot整合mybatis常见问题(小结)

戚泰
2023-03-14
本文向大家介绍SpringBoot整合mybatis常见问题(小结),包括了SpringBoot整合mybatis常见问题(小结)的使用技巧和注意事项,需要的朋友参考一下

Spring中常见问题

1.NoSuchBeanDefinitionException

2.'..Service' that could not be found service找不到

3.port 80 was already in use 端口号被占用

4.TemplateInputException 模板解析异常或找不到模板

  • 1.检查模板所在的目录是否与配置的前缀目录相同
  • 2.检查返回的模板是否存在,返回值类型是否一致
  • 3.检查配置前缀时是否以"/"斜杠结尾
  • 4.控制层的url与客户端的ur是否一致

5. 404异常 访问资源不存在

6. 500异常 500异常要查看控制台

Mybatis中常见问题

1.springboot中添加maven依赖

2.BadSqlGrammarException 错误的sql语句

3.BindingException 绑定异常

  • 1.检查映射文件的路径配置与实际存储位置是否一致
  • 2.检查dao接口的类名是否与映射文件的namespace值相同(不能有空格)
  • 3.检查dao接口中的方法名是否在映射文件中有对应的id

4.IllegalArgumentException

原因:同样说我sql映射是否出现了重复性的定义(例如:分别以注解方式和xml配置文件方式进行定义,也就是说在同一个namespace下出现了重复的元素id)

5.SAXParseException xml解析问题

补充

问题一:Mapper类 autowired失败

原因:扫描mapper包没有配置或配置不正确

解决:

方案一:

1. 启动类加@MapperScan("mapperPackagePath")

方案二:

增加配置类:

package com.yx.readingwebsite.config;
 
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * MapperScannerConfigurer 配置DAO层
 */
 
 
@Configuration
public class MyBatisMapperScannerConfig {
  @Bean
  public MapperScannerConfigurer getMapperScannerConfigurer(){
    MapperScannerConfigurer msc = new MapperScannerConfigurer();
    msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
    msc.setBasePackage("com.yx.readingwebsite.mapper");
    return msc;
  }
}

问题二:Mapper扫描成功后,继续报错,org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

原因:xml的mapper SQL 和 Mapper接口没有绑定

解决:

方案一:全局配置文件application.yml增加mybatis配置【xml mapper包在resource目录下】

mybatis:
 mapper-locations: classpath:mapper/*.xml

方案二:增加配置类

package com.yx.readingwebsite.config;
 
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.html" target="_blank">jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
 
import javax.sql.DataSource;
 
/**
 * 配置MyBatis,引入数据源,sqlSessionFactory,sqlSessionTemplate,事务管理器
 */
 
@Configuration //配置类
@EnableTransactionManagement //允许使用事务管理器
public class MyBatisModelConfig implements TransactionManagementConfigurer {
 
  @Autowired
  private DataSource dataSource;
 
  @Bean(name = "sqlSessionFactory")
  public SqlSessionFactory getSqlSessionFactory(){
    SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
    ssfb.setDataSource(dataSource); //设置数据源
    ssfb.setTypeAliasesPackage("com.yx.readingwebsite.model");  //设置扫描模型包【po】
    try {
      Resource[] resources = new PathMatchingResourcePatternResolver()
          .getResources("classpath:mapper/*.xml");
      ssfb.setMapperLocations(resources);
      return ssfb.getObject();
    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException();
    }
  }
 
  @Bean  //获得Session 模板,从而获得Session
  public SqlSessionTemplate getSqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
    return new SqlSessionTemplate(sqlSessionFactory);
  }
 
  @Override  //事务管理器
  public PlatformTransactionManager annotationDrivenTransactionManager() {
    return new DataSourceTransactionManager(dataSource);
  }
}

需要注意的是,xml版的mybatis一定要在sqlSessionFactory中指定mapperLocations,即下图

总结:
两种配置方案。方案一,使用配置类;方案二,使用配置文件。完整配置如下:

方案一:配置类

package com.yx.readingwebsite.config;
 
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
 
import javax.sql.DataSource;
 
/**
 * 配置MyBatis,引入数据源,sqlSessionFactory,sqlSessionTemplate,事务管理器
 */
 
@Configuration //配置类
@EnableTransactionManagement //允许使用事务管理器
public class MyBatisModelConfig implements TransactionManagementConfigurer {
 
  @Autowired
  private DataSource dataSource;
 
  @Bean(name = "sqlSessionFactory")
  public SqlSessionFactory getSqlSessionFactory(){
    SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
    ssfb.setDataSource(dataSource); //设置数据源
    ssfb.setTypeAliasesPackage("com.yx.readingwebsite.model");  //设置扫描模型包【po】
    try {
      Resource[] resources = new PathMatchingResourcePatternResolver()
          .getResources("classpath:mapper/*.xml");
      ssfb.setMapperLocations(resources);
      return ssfb.getObject();
    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException();
    }
  }
 
  @Bean  //获得Session 模板,从而获得Session
  public SqlSessionTemplate getSqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
    return new SqlSessionTemplate(sqlSessionFactory);
  }
 
  @Override  //事务管理器
  public PlatformTransactionManager annotationDrivenTransactionManager() {
    return new DataSourceTransactionManager(dataSource);
  }
}
package com.yx.readingwebsite.config;
 
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * MapperScannerConfigurer 配置DAO层
 */
 
 
@Configuration
@AutoConfigureAfter(MyBatisModelConfig.class)
public class MyBatisMapperScannerConfig {
  @Bean
  public MapperScannerConfigurer getMapperScannerConfigurer(){
    MapperScannerConfigurer msc = new MapperScannerConfigurer();
    msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
    msc.setBasePackage("com.yx.readingwebsite.mapper");
    return msc;
  }
}

方案二:配置文件 application.yml

spring:
 datasource:
  url: jdbc:mysql://127.0.0.1:3306/readingWebsite?useUnicode=true&characterEncoding=utf-8
  username:
  password:
  driver-class-name: com.mysql.jdbc.Driver
  max-active: 100
  max-idle: 10
  max-wait: 10000
  default-auto-commit: false
  time-between-eviction-runs-millis: 30000
  min-evictable-idle-time-millis: 30000
  test-while-idle: true
  test-on-borrow: true
  test-on-return: true
  validation-query: SELECT 1
 
mybatis:
 mapper-locations: classpath:mapper/*.xml
package com.yx.readingwebsite;
 
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
@MapperScan("com.yx.readingwebsite")
public class ReadingWebsiteApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(ReadingWebsiteApplication.class, args);
  }
 
}

到此这篇关于SpringBoot整合mybatis常见问题(小结)的文章就介绍到这了,更多相关SpringBoot整合mybatis问题内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问: 如何与其它mvc框架(thinkPHP、Yii等)整合? 答: 与其它mvc框架结合建议以上图的方式(ThinkPHP为例): 1、ThinkPHP与Workerman是两个独立的系统,独立部署(可部署在不同服务器),互不干扰。 2、ThinkPHP以HTTP协议提供网页页面在浏览器渲染展示。 3、ThinkPHP提供的页面的js发起websocket连接,连接workerman 4、连接后

  • ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。 MyBatis过程 1、创建maven工程导入坐标 <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifa

  • 本文向大家介绍SpringBoot整合MyBatis-Plus3.1教程详解,包括了SpringBoot整合MyBatis-Plus3.1教程详解的使用技巧和注意事项,需要的朋友参考一下 一.说明 Mybatis-Plus是一个Mybatis框架的增强插件,根据官方描述,MP只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑.并且只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间

  • 目录 综合 何时学习 Redux ? 何时使用 Redux ? Redux 只能搭配 React 使用? Redux 需要特殊的编译工具支持吗? Reducer 如何在 reducer 之间共享 state ? combineReducers 是必须的吗? 处理 action 必须用 switch 语句吗? 组织 State 必须将所有 state 都维护在 Redux 中吗? 可以用 React

  • Parallax doesn’t work with fullpage.js. Short answer: use the scrollBar:true option for fullPage.js or autoScrolling:false if you don’t want to use the auto-scrolling feature. Explanation: Parallax, a

  • 这是一些常见问题和回答 我可以为一个任务(task)或剧本(playbook)设置 PATH 或者其它环境变量吗? 可以通过 environment 关键字设置环境变量,可以用在 task 或者 play 上 environment: PATH: “{{ ansible_env.PATH }}:/thingy/bin” SOME: value 如何处理需要不同账户与端口登录的不同机器?¶ 设置清单