现在大部分都是mybatis+mysql的,有oracle的配置文章,但发现很多不是很全面,因此就来记录一下配置过程中的坑坑洼洼。
首先我们的目标是希望项目中能使用动态编程式Mybatis,同时也能支持在部分情况下手工xml编写的sql。
因此需要做这么几件事情
-
配置支持oracle的generateConfig.xml:自动生成mapper和DO对象
-
pom文件引入Mybatis generator 插件
-
项目对Mybatis的配置类,用于支持基于手写xml的mapper定义
generateConfig
需要注意的第一个点就是引入application.yml文件
<properties resource="application.yml"/>
在下面配置数据源连接<jdbcConnection>就可以直接引用了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="application.yml"/>
<!-- <classPathEntry location="D:\ojdbc8-21.3.0.0.jar"/>-->
<!-- 配置table表信息内容体,targetRuntime指定采用mybatis3的版本 -->
<context id="id" targetRuntime="MyBatis3DynamicSql">
<!-- 抑制生成注释,由于生成的注释都是英文版的,可以不让它生成 -->
<commentGenerator>
<property name="suppressDate" value="false"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 配置数据库连接信息 -->
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="${url}"
userId="${username}"
password="${password}"/>
<!-- 生成model类,targetPackage指定model类的包名,targetProject指定生成的model放在哪个工程中 -->
<javaModelGenerator targetPackage="com.test.dxp.dispatcher.dao.dataobject"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成mybatis的mapper.xml文件,targetPackage指定mapper.xml的包名,targetProject指定mapper.xml在哪个工程目录下 -->
<!-- <sqlMapGenerator targetPackage="mybatis.mapping"-->
<!-- targetProject="src/main/resouces/mapper/ds1">-->
<!-- <property name="enableSubPackages" value="true"/>-->
<!-- </sqlMapGenerator>-->
<!-- 生成mybatis的Mapper接口类文件,targetPackage指定Mapper接口类文件的包名,targetProject指定Mapper接口类在哪个工程目录下 -->
<javaClientGenerator targetPackage="com.test.dxp.dispatcher.dao.mapper"
targetProject="src/main/java"
type="XMLMAPPER">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- <table tableName="exe_node" domainObjectName="ExeNodeDO" >-->
<!-- </table>-->
<!-- <table tableName="dxp_dispatch_task_inst" domainObjectName="DispatchTaskInstDO">-->
<!-- </table>-->
<table tableName="gray_dispatch_resource" domainObjectName="GrayDispatchResourceDO">
</table>
</context>
</generatorConfiguration>
pom文件的插件配置
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
配置Ok了后Intellij项目能看到插件
以为这样就大功告成,结果运行插件时报错
oracle.jdbc.OracleDriver
没错,没头没脑的就是这几个词,请给我一个报错堆栈,因此进行手动执行命令行 mvn mybatis-generator:generate -e -X
后面两个参数是为了获取更详细的报错,根源是在于
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
那说明运行过程中没有加载oracle driver,问题来了,咋加载了,大部分给出的解决方法是手动在generatorConfig中增加如下配置
<classPathEntry location="D:\ojdbc8-21.3.0.0.jar"/>
就是把这个driver包从oracle官网下载到本地目录,但是这个缺点就是后续别的合作同学要生成新mapper文件,还得人肉来一下这操作,显得很呆。后面又网上搜了好久,找到了一个无需人肉配置的方法,那就是在mybatis plugin里面直接引入oracle的包, 是在pom的插件中引入,而不是在pom的dependency
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.3.0.0</version>
</dependency>
</dependencies>
</plugin>
ok,继续来看mybatisconfiguration类配置
上面的操作下来,能够直接把mapper以及DO类生成到指定路径,但是如果想要同时支持手写xml的mapper怎么弄呢?其实,主要就是需要
-
告诉mybatis从哪里找这个xml
-
告诉mybatis从哪里找xml对应的mapper
那么解决关键点就是在配置xml路径即MapperLocations的值,以及 @MapperScan加上手动mapper的路径(由于mapperScan扫描不是递归的,需要把存放的完整路径都写上)。根据下面代码可以看出手写的xml文件中是放在resources目录下
/**
* @ClassName MybaticConfig
* @Version v1.0
**/
@MapperScan(value = {"com.test.dxp.dispatcher.dao.mapper", "com.test.dxp.dispatcher.dao.mapper.manual"})
@Configuration
public class MybatisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
org.apache.ibatis.session.Configuration ibatisConfig = new org.apache.ibatis.session.Configuration();
ibatisConfig.setMapUnderscoreToCamelCase(true);
//ibatisConfig.setCacheEnabled(false);
sqlSessionFactoryBean.setConfiguration(ibatisConfig);
return sqlSessionFactoryBean.getObject();
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
public TransactionTemplate transactionTemplate(DataSourceTransactionManager manager) {
TransactionTemplate tp = new TransactionTemplate();
tp.setTransactionManager(manager);
return tp;
}
}
至于mapper和对应xml的映射关系呢,其实在通过xml中的Namespace标签来关联的
<mapper namespace="com.test.dxp.dispatcher.dao.mapper.manual.xxxMapper">
整体目录结构如下:
总结一下使用dynamic mybatis+oracle主要点就是在于驱动包要配置在插件里面,其次为了支持手动mapper+xml模式需要改造mybatis配置类中的mapperScan和mapperLocations
转载来源:https://mp.weixin.qq.com/s/ek0UsmDVc4OrIRajRhNsEA
欢迎关注:大头兵Tomato