当前位置:   article > 正文

springboot整合Mybatis(以及踩到的坑)_mybatis databaseid不管用

mybatis databaseid不管用

最近一个项目需要从mysql数据库取数据,想着springboot整合mybatis没有独立做过,于是就趁着工作任务时间安排比较宽裕就干脆自己新建一个springboot+mybatis的工程,其中实体类和mapper.xml都已经通过逆向工程生成。

首先贴出项目结构

pom.xml需要引入的依赖

  1. <dependencies>
  2. <!--springboot启动依赖-->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-jdbc</artifactId>
  6. </dependency>
  7. <!--mybatis整合springboot的依赖-->
  8. <dependency>
  9. <groupId>org.mybatis.spring.boot</groupId>
  10. <artifactId>mybatis-spring-boot-starter</artifactId>
  11. <version>1.3.2</version>
  12. </dependency>
  13. <!--mysql数据库-->
  14. <dependency>
  15. <groupId>mysql</groupId>
  16. <artifactId>mysql-connector-java</artifactId>
  17. <version>5.1.41</version>
  18. </dependency>
  19. <!--热部署-->
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-devtools</artifactId>
  23. <scope>runtime</scope>
  24. </dependency>
  25. <!--测试-->
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>
  31. <!--springboot日志-->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-logging</artifactId>
  35. <version>1.4.5.RELEASE</version>
  36. </dependency>
  37. <!--阿里的json工具-->
  38. <dependency>
  39. <groupId>com.alibaba</groupId>
  40. <artifactId>fastjson</artifactId>
  41. <version>1.2.9</version>
  42. </dependency>
  43. <!-- alibaba的druid数据库连接池 -->
  44. <dependency>
  45. <groupId>com.alibaba</groupId>
  46. <artifactId>druid-spring-boot-starter</artifactId>
  47. <version>1.1.0</version>
  48. </dependency>
  49. <!--分页PageHelper-->
  50. <dependency>
  51. <groupId>com.github.pagehelper</groupId>
  52. <artifactId>pagehelper-spring-boot-starter</artifactId>
  53. <version>1.2.10</version>
  54. </dependency>
  55. </dependencies>

我们都知道spring的IOC是不允许我们自己创建对象的,所以对于自动生成的Mapper接口当然也需要被spring管理起来,这个时候就用到@Mapper注解

  1. @Mapper
  2. public interface DkMapper {
  3. int countByExample(DkExample example);
  4. int deleteByExample(DkExample example);
  5. int insert(Dk record);
  6. int insertSelective(Dk record);
  7. List<Dk> selectByExample(DkExample example);
  8. int updateByExampleSelective(@Param("record") Dk record, @Param("example") DkExample example);
  9. int updateByExample(@Param("record") Dk record, @Param("example") DkExample example);
  10. }

但是如果我们的Mapper接口有很多情况下难道每个接口都要加上注解嘛,当然不会,mybatis还提供了@MapperScan注解用于通过扫描包的方式把包下面的的所有Mapper接口都注入到Spring中,把@MapperScan注解放在SpringBoot的启动类上。

  1. @SpringBootApplication
  2. @Configuration
  3. @ImportResource(locations = {"classpath:generateConfig.xml"})
  4. @MapperScan("com.example.mybatisdemo.mapper")
  5. public class MybatisdemoApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(MybatisdemoApplication.class, args);
  8. }
  9. }

因为是逆向工程生成的xxMapper.xml,所以也不用担心Mapper.xml中的名称空间与包名对不上的问题。

我用applicaiton.yml代替了application.xml,因为结构看起来更加清爽,贴出application.yml的配置

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://192.168.1.146:3306/dms_sourcedata
  4. username: root
  5. password: root
  6. type: com.alibaba.druid.pool.DruidDataSource
  7. driver-class-name: com.mysql.jdbc.Driver
  8. pagehelper:
  9. helper-dialect: mysql
  10. reasonable: false
  11. support-methods-arguments: true
  12. params: count=counsql

我看到有很多博主都配置了mybatis的属性,但是我把配置删掉好像也没有什么影响,因为在我看来这些配置的功能都通过注解完成了,小伙伴可以自己试试。

  1. mybatis:
  2. # 配置的实体类包扫描
  3. type-aliases-package: com.example.mybatisdemo.bean
  4. # 这个配置的是xxMapper.xml的路径扫描,resource下面的,这里有一个坑接下来会说到
  5. mapper-locations:
  6. # 这里配置的是mybatis配置文件的位置,但是mybatis和springboot整合以后好像不需要配置文件了,因为都被注解代替了
  7. config-location:

以上内容都配置完后,还差一个数据库连接池,直接创建一个类加上@Configuration表明这是一个配置

  1. import com.alibaba.druid.pool.DruidDataSource;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.Primary;
  6. import javax.sql.DataSource;
  7. @Configuration
  8. public class DruidDBConfig {
  9. @Value("${spring.datasource.url}")
  10. private String dbUrl;
  11. @Value("${spring.datasource.username}")
  12. private String username;
  13. @Value("${spring.datasource.password}")
  14. private String password;
  15. @Value("${spring.datasource.driver-class-name}")
  16. private String driverClassName;
  17. @Bean
  18. @Primary
  19. public DataSource dataSource(){
  20. DruidDataSource datasource = new DruidDataSource();
  21. datasource.setUrl(this.dbUrl);
  22. datasource.setUsername(username);
  23. datasource.setPassword(password);
  24. datasource.setDriverClassName(driverClassName);
  25. return datasource;
  26. }
  27. }

如果不配置这个在启动的时候回报错,但是我看很多博主在做springboot整合mybatis的时候没有写这一步,不知道是因为他们省略了还是可以不用配置,我的是因为项目报错后我配置完就成功运行了。

上述内容都配置完后就可以在service层调用Mapper来对数据库进行操作了~

然而并不行。。。在单元测试的时候项目一直报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

我知道这个问题是因为Mapper接口和对应的xml文件没有装配成功,但是该扫描的包和该配置的文件都配置了,照着网上的各路博客检查了一遍代码,整整困扰了我一整个上午,最后还是在同事的帮助下才发现是因为xml文件没有被扫描到,应该是因为我的mapper.xml在src/main/java下面,但是maven项目在编译的时候默认是不会打包java包下面的xml文件到target里面的,所以要在pom.xml中配置<resource>

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <includes>
  5. <include>**/*.properties</include>
  6. <include>**/*.yml</include>
  7. <include>**/*.xml</include>
  8. </includes>
  9. </resource>
  10. <resource>
  11. <directory>src/main/java</directory>
  12. <includes>
  13. <include>**/*.properties</include>
  14. <include>**/*.yml</include>
  15. <include>**/*.xml</include>
  16. </includes>
  17. </resource>
  18. </resources>

这样就可以跑起来了~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/480605
推荐阅读
相关标签
  

闽ICP备14008679号