mapper 接口与 mapper xml 文件不在同一级目录
当mapper 接口与 mapper xml 文件不在同一个目录下,JavaBean 配置,无法加载到相应的文件。
Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface com.demo.activiti7.common.export.databse.ExportDatabaseTableModelMapper is not known to the MapperRegistry.at org.apache.ibatis.binding.MapperRegistry.getMapper(MapperRegistry.java:47)at org.apache.ibatis.session.Configuration.getMapper(Configuration.java:845)at org.apache.ibatis.session.defaults.DefaultSqlSession.getMapper(DefaultSqlSession.java:291)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文件位置配置详解
本人的小部分代码
package com.demo.activiti7;import com.alibaba.excel.EasyExcel;import com.alibaba.excel.ExcelWriter;import com.alibaba.excel.write.metadata.WriteSheet;import com.alibaba.excel.write.metadata.WriteTable;import com.demo.activiti7.common.export.databse.ColumnInfoDto;import com.demo.activiti7.common.export.databse.DataBaseTableModelDto;import com.demo.activiti7.common.export.databse.ExportDatabaseTableModelMapper;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.sql.DataSource;import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;import org.apache.ibatis.mapping.Environment;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.apache.ibatis.transaction.TransactionFactory;import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;public class ExportDatabaseTableModelTest {public static void main(String[] args) {// .setDatabaseSchema("activiti7")// .setJdbcUrl(// "jdbc:mysql:///activiti_demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")// .setDbHistoryUsed(true)// .setJdbcPassword("123456")// .setJdbcUsername("root")// .setJdbcDriver("com.mysql.cj.jdbc.Driver")// .setHistoryLevel(HistoryLevel.FULL)// .setDatabaseType("mysql")// url: jdbc:mysql://192.168.0.211:30093/produce?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8// username: root// password: produce#123DataSource dataSource = new UnpooledDataSource("com.mysql.cj.jdbc.Driver","jdbc:mysql://192.168.0.211:30093/produce?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8","root","produce#123");TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);Configuration configuration = new Configuration(environment);/*<!-- 第一种:注册sql映射文件--><mapper resource="com/spldeolin/mapper/UserMapper.xml" /><!-- 第二种:注册接口 sql映射文件必须与接口同名,并且放在同一目录下--><!--<mapper class="com.spldeolin.mapper.UserMapper" />--><!-- 第三种:注册基于注解的接口 基于注解 没有sql映射文件,所有的sql都是利用注解写在接口上--><!--<mapper class="com.spldeolin.mapper.TeacherMapper" />--><!-- 第四种:批量注册 需要将sql配置文件和接口放到同一目录下--><package name="com.spldeolin.mapper" />*/// configuration.addLoadedResource("mapper/ExportDatabaseTableModelMapper.xml");configuration.addMapper(ExportDatabaseTableModelMapper.class);configuration.getTypeAliasRegistry().registerAlias("dataBaseTableModelDto", DataBaseTableModelDto.class);configuration.setMapUnderscoreToCamelCase(true);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession();ExportDatabaseTableModelMapper exportDatabaseTableModelMapper =sqlSession.getMapper(ExportDatabaseTableModelMapper.class);String database = "produce";List<DataBaseTableModelDto> produceList = exportDatabaseTableModelMapper.getDatabaseTableModel(database);String fileName = database + ".xlsx";ExcelWriter excelWriter = EasyExcel.write(fileName)// .needHead(true)// .head(headers).automaticMergeHead(true).autoCloseStream(true).build();// 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了WriteSheet writeSheet = EasyExcel.writerSheet("数据表模型").needHead(Boolean.FALSE).build();for (int i = 0; i < produceList.size(); i++) {DataBaseTableModelDto dataBaseTableModelDto = produceList.get(i);List<List<String>> headers = new ArrayList<>();String mainHeader = String.format("表 %d:%s", i + 1, dataBaseTableModelDto.getTableName());List<ColumnInfoDto> columns = dataBaseTableModelDto.getColumns();// 添加两列空行columns.add(new ColumnInfoDto());columns.add(new ColumnInfoDto());headers.add(Arrays.asList(mainHeader, "字段名称"));headers.add(Arrays.asList(mainHeader, "字段类型"));headers.add(Arrays.asList(mainHeader, "字段说明"));headers.add(Arrays.asList(mainHeader, "是否主键"));headers.add(Arrays.asList(mainHeader, "是否为空"));headers.add(Arrays.asList(mainHeader, "默认值"));// headers.add(Arrays.asList(mainHeader, "字段类型(仅有类型)"));// 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要WriteTable writeTable = EasyExcel.writerTable(i).head(headers).automaticMergeHead(true).needHead(Boolean.TRUE)// .excludeColumnIndexes(Arrays.asList(6))// .excludeColumnFiledNames(Arrays.asList("字段类型(仅有类型)")).build();excelWriter.write(columns, writeSheet, writeTable);}excelWriter.finish();sqlSession.flushStatements();sqlSession.close();}}
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.demo.activiti7.common.export.databse.ExportDatabaseTableModelMapper"><resultMap id="DataBaseTableModelDtoMap"type="com.demo.activiti7.common.export.databse.DataBaseTableModelDto"><id property="tableName" column="tableName" /><collection property="columns" ofType="com.demo.activiti7.common.export.databse.ColumnInfoDto"><result property="columnName" column="columnName" /><result property="columnType" column="columnType" /><result property="columnComment" column="columnComment" /><result property="columnKey" column="columnKey" /><!-- <result property="columnDataType" column="columnDataType" />--><result property="columnDefault" column="columnDefault" /><result property="columnIsNullable" column="columnIsNullable" /></collection></resultMap><select id="getDatabaseTableModel"resultMap="DataBaseTableModelDtoMap">SELECTt.TABLE_SCHEMA,t.TABLE_COMMENT,CONCAT(t.TABLE_COMMENT,'(',t.TABLE_NAME,')') AS tableName,c.COLUMN_NAME AS columnName,c.COLUMN_TYPE AS columnType,c.COLUMN_COMMENT AS columnComment,c.COLUMN_KEY AS columnKey,c.DATA_TYPE AS columnDataType,c.COLUMN_DEFAULT AS columnDefault,c.IS_NULLABLE AS columnIsNullableFROMinformation_schema.`TABLES` t,information_schema.`columns` cWHEREc.TABLE_NAME = t.TABLE_NAMEAND t.TABLE_SCHEMA = #{databaseName}</select></mapper>
