解决springboot多模块化整合mybatis,mapper自动注入失败问题

问题

启动类添加@MapperScan或@ComponentScan,mapper类添加@Mapper或@Repository

==> Consider defining a bean of type 'com.ten.mapper.UserMapper' in your configuration.

Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required in spring mock mvc test for spring boot with mybatis

解决

手动装配dataSource

启动类:

package com.ten; 
import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component; 
import javax.sql.DataSource;

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@MapperScan("com.ten.mapper")
class LcWebApplication {
  public static void main(String[] args) {
      SpringApplication.run(LcWebApplication.class, args);
  }

  @Autowired
  private Environment env;

  //destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用.
  @Bean
  public DataSource dataSource() {
      DruidDataSource dataSource = new DruidDataSource();
      dataSource.setUrl(env.getProperty("spring.datasource.url"));
      dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名
      dataSource.setPassword(env.getProperty("spring.datasource.password"));//密码
      dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
      dataSource.setInitialSize(2);//初始化时建立物理连接的个数
      dataSource.setMaxActive(20);//最大连接池数量
      dataSource.setMinIdle(0);//最小连接池数量
      dataSource.setMaxWait(60000);//获取连接时最大等待时间,单位毫秒。
      dataSource.setValidationQuery("SELECT 1");//用来检测连接是否有效的sql
      dataSource.setTestOnBorrow(false);//申请连接时执行validationQuery检测连接是否有效
      dataSource.setTestWhileIdle(true);//建议配置为true,不影响性能,并且保证安全性。
      dataSource.setPoolPreparedStatements(false);//是否缓存preparedStatement,也就是PSCache
      return dataSource;
  } 
}

启动类配置文件:

spring:
  datasource:
      name: test
      url: jdbc:mysql://localhost:3306/db
      username: root
      password: root
      # 使用druid数据源
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.jdbc.Driver
      filters: stat
      maxActive: 20
      initialSize: 1
      maxWait: 60000
      minIdle: 1
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxOpenPreparedStatements: 20 

mybatis:
mapperLocations: classpath*:mapper/*.xml
typeAliasesPackage: com.ten.entity

启动类依赖

 <!--web-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <!--rest-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-rest</artifactId>
      </dependency>
      <!-- mybatis -->
      <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
      </dependency>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
      </dependency>
      <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
      </dependency>

DAO类

@Repository
public interface UserMapper {
  String getTest(String test);
}

DAO类依赖

<!-- mybatis -->
      <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
      </dependency>

目录结构:

 

springboot mapper注入失败的一种原因

今天启动项目报错----mapper注入失败。细细查找一番发现是时间类型的问题。

具体情况是

数据库有个字段的类型是datetime,但是实体类里的类型我写成了LocalDateTime,结果当然是jdbctype对不上,导致mapper注入不进去。

解决办法

实体类型定义成Date。

LocalDateTime其实是一种时间转换工具,不要定义为实体的类型。 实体类是时间的话,类型一般是Date或者timestamp。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程宝库

报错'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocatio ...