mapper 接口与 mapper xml 文件不在同一级目录

当mapper 接口与 mapper xml 文件不在同一个目录下,JavaBean 配置,无法加载到相应的文件。
image.png

  1. Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface com.demo.activiti7.common.export.databse.ExportDatabaseTableModelMapper is not known to the MapperRegistry.
  2. at org.apache.ibatis.binding.MapperRegistry.getMapper(MapperRegistry.java:47)
  3. at org.apache.ibatis.session.Configuration.getMapper(Configuration.java:845)
  4. at org.apache.ibatis.session.defaults.DefaultSqlSession.getMapper(DefaultSqlSession.java:291)
  5. at com.demo.activiti7.ExportDatabaseTableModelTest.main(ExportDatabaseTableModelTest.java:69)

JavaBean 方式目前未找到不使用 xml 方式来指定 xml 文件位置的办法。
只好按照要求,要么把 xml 写到 src/main/java 中,要么最终打包到相同的目录中(即 src/main/java mapper 接口要与 src/main/resource mapper.xml 目录一致)
**
参考:Mybatis中接口和对应的mapper文件位置配置详解

本人的小部分代码

  1. package com.demo.activiti7;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.ExcelWriter;
  4. import com.alibaba.excel.write.metadata.WriteSheet;
  5. import com.alibaba.excel.write.metadata.WriteTable;
  6. import com.demo.activiti7.common.export.databse.ColumnInfoDto;
  7. import com.demo.activiti7.common.export.databse.DataBaseTableModelDto;
  8. import com.demo.activiti7.common.export.databse.ExportDatabaseTableModelMapper;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.List;
  12. import javax.sql.DataSource;
  13. import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
  14. import org.apache.ibatis.mapping.Environment;
  15. import org.apache.ibatis.session.Configuration;
  16. import org.apache.ibatis.session.SqlSession;
  17. import org.apache.ibatis.session.SqlSessionFactory;
  18. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  19. import org.apache.ibatis.transaction.TransactionFactory;
  20. import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
  21. public class ExportDatabaseTableModelTest {
  22. public static void main(String[] args) {
  23. // .setDatabaseSchema("activiti7")
  24. // .setJdbcUrl(
  25. // "jdbc:mysql:///activiti_demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
  26. // .setDbHistoryUsed(true)
  27. // .setJdbcPassword("123456")
  28. // .setJdbcUsername("root")
  29. // .setJdbcDriver("com.mysql.cj.jdbc.Driver")
  30. // .setHistoryLevel(HistoryLevel.FULL)
  31. // .setDatabaseType("mysql")
  32. // url: jdbc:mysql://192.168.0.211:30093/produce?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
  33. // username: root
  34. // password: produce#123
  35. DataSource dataSource = new UnpooledDataSource("com.mysql.cj.jdbc.Driver",
  36. "jdbc:mysql://192.168.0.211:30093/produce?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8",
  37. "root",
  38. "produce#123");
  39. TransactionFactory transactionFactory = new JdbcTransactionFactory();
  40. Environment environment = new Environment("development", transactionFactory, dataSource);
  41. Configuration configuration = new Configuration(environment);
  42. /*
  43. <!-- 第一种:注册sql映射文件-->
  44. <mapper resource="com/spldeolin/mapper/UserMapper.xml" />
  45. <!-- 第二种:注册接口 sql映射文件必须与接口同名,并且放在同一目录下-->
  46. <!--<mapper class="com.spldeolin.mapper.UserMapper" />-->
  47. <!-- 第三种:注册基于注解的接口 基于注解 没有sql映射文件,所有的sql都是利用注解写在接口上-->
  48. <!--<mapper class="com.spldeolin.mapper.TeacherMapper" />-->
  49. <!-- 第四种:批量注册 需要将sql配置文件和接口放到同一目录下-->
  50. <package name="com.spldeolin.mapper" />
  51. */
  52. // configuration.addLoadedResource("mapper/ExportDatabaseTableModelMapper.xml");
  53. configuration.addMapper(ExportDatabaseTableModelMapper.class);
  54. configuration.getTypeAliasRegistry().registerAlias("dataBaseTableModelDto", DataBaseTableModelDto.class);
  55. configuration.setMapUnderscoreToCamelCase(true);
  56. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
  57. SqlSession sqlSession = sqlSessionFactory.openSession();
  58. ExportDatabaseTableModelMapper exportDatabaseTableModelMapper =
  59. sqlSession.getMapper(ExportDatabaseTableModelMapper.class);
  60. String database = "produce";
  61. List<DataBaseTableModelDto> produceList = exportDatabaseTableModelMapper.getDatabaseTableModel(database);
  62. String fileName = database + ".xlsx";
  63. ExcelWriter excelWriter = EasyExcel.write(fileName)
  64. // .needHead(true)
  65. // .head(headers)
  66. .automaticMergeHead(true)
  67. .autoCloseStream(true)
  68. .build();
  69. // 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
  70. WriteSheet writeSheet = EasyExcel.writerSheet("数据表模型").needHead(Boolean.FALSE).build();
  71. for (int i = 0; i < produceList.size(); i++) {
  72. DataBaseTableModelDto dataBaseTableModelDto = produceList.get(i);
  73. List<List<String>> headers = new ArrayList<>();
  74. String mainHeader = String.format("表 %d:%s", i + 1, dataBaseTableModelDto.getTableName());
  75. List<ColumnInfoDto> columns = dataBaseTableModelDto.getColumns();
  76. // 添加两列空行
  77. columns.add(new ColumnInfoDto());
  78. columns.add(new ColumnInfoDto());
  79. headers.add(Arrays.asList(mainHeader, "字段名称"));
  80. headers.add(Arrays.asList(mainHeader, "字段类型"));
  81. headers.add(Arrays.asList(mainHeader, "字段说明"));
  82. headers.add(Arrays.asList(mainHeader, "是否主键"));
  83. headers.add(Arrays.asList(mainHeader, "是否为空"));
  84. headers.add(Arrays.asList(mainHeader, "默认值"));
  85. // headers.add(Arrays.asList(mainHeader, "字段类型(仅有类型)"))
  86. ;
  87. // 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
  88. WriteTable writeTable = EasyExcel.writerTable(i)
  89. .head(headers)
  90. .automaticMergeHead(true)
  91. .needHead(Boolean.TRUE)
  92. // .excludeColumnIndexes(Arrays.asList(6))
  93. // .excludeColumnFiledNames(Arrays.asList("字段类型(仅有类型)"))
  94. .build();
  95. excelWriter.write(columns, writeSheet, writeTable);
  96. }
  97. excelWriter.finish();
  98. sqlSession.flushStatements();
  99. sqlSession.close();
  100. }
  101. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.demo.activiti7.common.export.databse.ExportDatabaseTableModelMapper">
  4. <resultMap id="DataBaseTableModelDtoMap"
  5. type="com.demo.activiti7.common.export.databse.DataBaseTableModelDto">
  6. <id property="tableName" column="tableName" />
  7. <collection property="columns" ofType="com.demo.activiti7.common.export.databse.ColumnInfoDto">
  8. <result property="columnName" column="columnName" />
  9. <result property="columnType" column="columnType" />
  10. <result property="columnComment" column="columnComment" />
  11. <result property="columnKey" column="columnKey" />
  12. <!-- <result property="columnDataType" column="columnDataType" />-->
  13. <result property="columnDefault" column="columnDefault" />
  14. <result property="columnIsNullable" column="columnIsNullable" />
  15. </collection>
  16. </resultMap>
  17. <select id="getDatabaseTableModel"
  18. resultMap="DataBaseTableModelDtoMap">
  19. SELECT
  20. t.TABLE_SCHEMA,
  21. t.TABLE_COMMENT,
  22. CONCAT(
  23. t.TABLE_COMMENT,
  24. '(',
  25. t.TABLE_NAME,
  26. ')'
  27. ) AS tableName,
  28. c.COLUMN_NAME AS columnName,
  29. c.COLUMN_TYPE AS columnType,
  30. c.COLUMN_COMMENT AS columnComment,
  31. c.COLUMN_KEY AS columnKey,
  32. c.DATA_TYPE AS columnDataType,
  33. c.COLUMN_DEFAULT AS columnDefault,
  34. c.IS_NULLABLE AS columnIsNullable
  35. FROM
  36. information_schema.`TABLES` t,
  37. information_schema.`columns` c
  38. WHERE
  39. c.TABLE_NAME = t.TABLE_NAME
  40. AND t.TABLE_SCHEMA = #{databaseName}
  41. </select>
  42. </mapper>