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#123
DataSource 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">
SELECT
t.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 columnIsNullable
FROM
information_schema.`TABLES` t,
information_schema.`columns` c
WHERE
c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_SCHEMA = #{databaseName}
</select>
</mapper>