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

 更新时间:2020年12月25日 09:54:27   作者:哇啦哇啦哇  
这篇文章主要介绍了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.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问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详谈锁和监视器之间的区别_Java并发

    详谈锁和监视器之间的区别_Java并发

    下面小编就为大家带来一篇详谈锁和监视器之间的区别_Java并发。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 解决JTable排序问题的方法详解

    解决JTable排序问题的方法详解

    本篇文章是对JTable排序问题的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java实现简易Web服务器

    Java实现简易Web服务器

    这篇文章主要为大家详细介绍了Java实现简易Web服务器的相关方法,想要制作Web服务器的朋友可以参考本文
    2016-02-02
  • 基于Java实现经典蜘蛛纸牌游戏

    基于Java实现经典蜘蛛纸牌游戏

    《蜘蛛纸牌》(Ancient Spider) 是由Oberon Games开发的一款休闲益智类游戏。本文将利用Java语言实现这一经典游戏,需要的可以参考一下
    2022-05-05
  • Java项目中防止SQL注入的四种方案总结

    Java项目中防止SQL注入的四种方案总结

    SQL注入是一种代码注入技术,通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,下面我们就来看看如何在项目中防止SQL注入吧
    2023-10-10
  • SpringBoot实现发送邮件任务

    SpringBoot实现发送邮件任务

    这篇文章主要为大家详细介绍了SpringBoot实现发送邮件任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 在SpringBoot中整合数据源的示例详解

    在SpringBoot中整合数据源的示例详解

    这篇文章主要介绍了在SpringBoot中如何整合数据源,本文介绍了如何在SpringBoot项目中整合常见的数据源,包括JdbcTemplate、MyBatis和JPA,并探讨了如何配置和使用多数据源,需要的朋友可以参考下
    2023-06-06
  • Lombok基本注解之@SneakyThrows的作用

    Lombok基本注解之@SneakyThrows的作用

    @SneakyThrows注解是由lombok为咱们封装的,它能够为咱们的代码生成一个try...catch块,并把异常向上抛出来,下面这篇文章主要给大家介绍了关于Lombok基本注解之@SneakyThrows作用的相关资料,需要的朋友可以参考下
    2022-01-01
  • Springboot前后端分离项目配置跨域实现过程解析

    Springboot前后端分离项目配置跨域实现过程解析

    这篇文章主要介绍了Springboot前后端分离项目配置跨域实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • springboot整合Shiro

    springboot整合Shiro

    这篇文章主要介绍了SpringBoot整合Shiro一些方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07

最新评论