mybatis是一个基于java的持久层框架,有了它,我们可以方便的进行数据库的增删改查(好吧,我承认我对于增删改查已经吐了)。。。mybatis可以根据数据库的表,自动生成xml,mapper以及model类,节省了程序员的大量时间。

网上eclipse和mybatis的教程比较常见,IDEA则比较少。本文就来介绍一下IDEA中mybatis如何自动生成上述代码。

这里写图片描述

上图中,红色括号的部分,都是mybatis自动生成的代码。(如果没有mybatis自动生成插件,不知道要多做多少无谓的工作量)。

1 maven中添加依赖

使用mybatis,先要在maven中添加mybatis的依赖。在微服务的根pom.xml中,添加如下代码:

<properties>
    <mybatis.version>3.3.0</mybatis.version>
    <mybatis-spring.version>1.2.0</mybatis-spring.version>
    <!--分页用 -->
    <mybatis_pagehelper_version>4.1.6</mybatis_pagehelper_version>
    <mysql-connector-java.version>5.1.38</mysql-connector-java.version>
</properties>

<dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>${mybatis.version}</version>
         </dependency>
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis-spring</artifactId>
             <version>${mybatis-spring.version}</version>
         </dependency>
         <dependency>
             <groupId>com.github.pagehelper</groupId>
             <artifactId>pagehelper</artifactId>
             <version>${mybatis_pagehelper_version}</version>
         </dependency>
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>${mysql-connector-java.version}</version>
         </dependency>
      </dependencies>
</dependencyManagement>

我们的目的是在某个微服务的dao层自动生成代码,在dao层的pom.xml中也要做相应依赖:

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <!-- mvn mybatis-generator:generate -->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.2</version>
            <configuration>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
                <configurationFile>./generatorConfig.xml</configurationFile>
            </configuration>
            <dependencies>
                <!-- 数据库驱动 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

2 generatorConfig.xml

在dao层下添加generatorConfig.xml,代码如下:

<?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>
    <context id="context1" targetRuntime="MyBatis3">
        <!-- 抑制警告 -->
        <property name="suppressTypeWarnings" value="true"/>

        <!-- generate entity时,生成hashcode和equals方法 -->
        <!-- <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" /> -->
        <!-- generate entity时,生成serialVersionUID -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <!-- 这个插件只会增加字符串字段映射到一个JDBC字符的方法 -->
        <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"/>
        <!-- genenat entity时,生成toString -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

        <!-- 是否去除自动生成的注释 true:是 : false:否 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!-- 数据库配置文件的url是不能直接拷贝过来用的,需要把&换成'&amp;' -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://*.*.*.*:3306/XXX?useUnicode=true&amp;charaterEncoding=utf-8&amp;allowMultiQueries=true"
                        userId="***" password="***">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- generate Model -->
        <javaModelGenerator targetPackage="com.sf.sfpp.academy.common.model"
                            targetProject="${project.build.directory}/../../sfpp-academy-common/src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
            <property name="isMergeable" value="false"/>
        </javaModelGenerator>

        <!-- generate xml -->
        <sqlMapGenerator targetPackage="sqlmap.db.academy"
                         targetProject="${project.build.directory}/../src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- generate Mapper -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.sf.sfpp.pcomp.dao"
                             targetProject="${project.build.directory}/../src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 
          catalog CDATA #IMPLIED
          schema CDATA #IMPLIED
          tableName CDATA #REQUIRED
          alias CDATA #IMPLIED
          domainObjectName CDATA #IMPLIED
          enableInsert CDATA #IMPLIED
          enableSelectByPrimaryKey CDATA #IMPLIED
          enableUpdateByPrimaryKey CDATA #IMPLIED
          enableDeleteByPrimaryKey CDATA #IMPLIED
          enableCountByExample CDATA #IMPLIED
          enableUpdateByExample CDATA #IMPLIED
          enableDeleteByExample CDATA #IMPLIED
          enableSelectByExample CDATA #IMPLIED
          selectByExampleQueryId CDATA #IMPLIED
          selectByPrimaryKeyQueryId CDATA #IMPLIED
          modelType CDATA #IMPLIED
          escapeWildcards CDATA #IMPLIED
          delimitIdentifiers CDATA #IMPLIED
          delimitAllColumns CDATA #IMPLIED
         -->

        <table schema="" tableName="acad_activity" domainObjectName="AcademyActivity" modelType="flat"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

3 插件自动生成代码

在IDEA中,点击下图中左上角的刷新图标,reImport maven

这里写图片描述

接下来就会在dao层的plugins中看到多了一个mybatis-generator,双击,所有代码就会自动生成。

这里写图片描述

4 注意事项

mybatis自动生成的xml文件,如果自己需要额外的sql语句,最后新建一个extend包,例如本例中自动生成AcademyActivityMapper.xml,在extend包中可以新建AcademyActivityExtMapper.xml。为什么要这样做呢?

我们知道,业务开发的过程中,有可能后期需要增加数据库字段。此时再用mybatis自动生成代码,会出现两个后果:

  1. 在原来的文件中重复生成一遍代码,也就是一个文件中两份一样的代码,这个我是自己做过实验的,不会有新的文件覆盖掉旧的文件;
  2. 此时最大的危害是,原来自己在mapper中添加的方法也会很难筛选。

也就是说,新建extend文件的根本目的是,日后数据库增加字段,自己添加的SQL语句不受影响。

新建的ExtMapper.xml,只需要和原来的Mapper.xml,namespace指向同一个mapper.java即可。

我们还用之前的例子,在原来自动生成的AcademyActivityMapper.xml中,代码是这样的:

<?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.sf.sfpp.pcomp.dao.AcademyActivityMapper" >
   .
   .
   .
</mapper>

在新的AcademyActivityExtMapper.xml中,保证mapper的namespace相同即可。

<?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.sf.sfpp.pcomp.dao.AcademyActivityMapper">
</mapper>

5 只生成插入方法怎么办

有一次新建了一张表,然后用自动生成工具,结果发现只有插入的代码自动生成,即insert和insertSelective,还以为是插件本身的问题,死活找不到在哪里。后来才发现,数据库建表仓促,忘记给id加上主键标识了。加上之后重新生成,一切正常。

这里写图片描述

说明
如有转载,请务必注明出处
http://blog.csdn.net/antony9118/article/details/54314653

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐