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

作者:哇啦哇啦哇 时间:2023-07-23 09:50:12 

Spring中常见问题

1.NoSuchBeanDefinitionException

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

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

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

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

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

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

  • 1.检查模板所在的目录是否与配置的前缀目录相同

  • 2.检查返回的模板是否存在,返回值类型是否一致

  • 3.检查配置前缀时是否以"/"斜杠结尾

  • 4.控制层的url与客户端的ur是否一致

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

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

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

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

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

Mybatis中常见问题

1.springboot中添加maven依赖

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

2.BadSqlGrammarException 错误的sql语句

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

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

3.BindingException 绑定异常

  • 1.检查映射文件的路径配置与实际存储位置是否一致

  • 2.检查dao接口的类名是否与映射文件的namespace值相同(不能有空格)

  • 3.检查dao接口中的方法名是否在映射文件中有对应的id

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

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

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

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

4.IllegalArgumentException

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

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

5.SAXParseException xml解析问题

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

补充

问题一: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,即下图

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

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

方案一:配置类


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);
 }

}

来源:https://segmentfault.com/a/1190000038641171

标签:SpringBoot,整合,mybatis
0
投稿

猜你喜欢

  • C#实现洗牌游戏实例

    2021-07-07 00:45:29
  • Android开发之机顶盒上gridview和ScrollView的使用详解

    2021-08-06 11:57:59
  • 浅谈Java锁的膨胀过程以及一致性哈希对锁膨胀的影响

    2023-06-03 15:03:38
  • IDEA实用好用插件推荐及使用方法教程详解(必看)

    2021-07-15 19:10:44
  • Java并发编程之详解CyclicBarrier线程同步

    2023-08-01 14:08:47
  • SpringBoot和Vue.js实现的前后端分离的用户权限管理系统

    2023-09-03 14:37:33
  • Java实现字符串解析为日期时间的方法示例

    2021-10-29 17:43:34
  • WPF+ASP.NET SignalR实现后台通知功能的示例代码

    2021-10-11 04:49:45
  • SpringBoot扫描不到Controller的解决方案

    2022-07-19 02:05:07
  • C#中的时间显示格式(12小时制VS24小时制)

    2021-10-19 12:58:41
  • C++中String类型的逆序方式

    2023-11-19 05:46:52
  • 设置session有效时间的三种方式

    2022-03-11 15:55:15
  • Android SharedPreferences实现记住密码和自动登录界面

    2023-06-15 20:07:00
  • Android应用开发中WebView的常用方法笔记整理

    2021-06-29 04:29:39
  • Android中ImageView实现选择本地图片并显示功能

    2023-07-02 23:47:09
  • java实现超市库存管理系统

    2022-06-28 01:23:44
  • java实现小球碰撞功能

    2023-04-05 19:22:41
  • Android 中View.onDraw(Canvas canvas)的使用方法

    2022-11-16 16:40:48
  • C#调用JS的几种方法

    2022-09-29 23:24:18
  • 获取wince mac地址与IP地址解决方案

    2022-01-21 02:04:19
  • asp之家 软件编程 m.aspxhome.com