【自己造轮子】极简版dynamic mybatis+oracle的generateConfig等配置

现在大部分都是mybatis+mysql的,有oracle的配置文章,但发现很多不是很全面,因此就来记录一下配置过程中的坑坑洼洼。

首先我们的目标是希望项目中能使用动态编程式Mybatis,同时也能支持在部分情况下手工xml编写的sql。

因此需要做这么几件事情

  1. 配置支持oracle的generateConfig.xml:自动生成mapper和DO对象

  2. pom文件引入Mybatis generator 插件

  3. 项目对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怎么弄呢?其实,主要就是需要

  1. 告诉mybatis从哪里找这个xml

  2. 告诉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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值