mybatis generator 使用maven 在idea中实现

最近在用mybatis开发项目,由于原来使用的hibernate,感觉mybatis干了很多体力活,比如大量的表对应的实体类,dao,mapper都需要写,并且我们目前还没有进行封装basemapper 这样的类,自身的增删改查,都需要自己去写,我感觉这样会大大降低以后的开发效率,今天周末没事,自己从网上找了下资料,原来mybatis3之后已经和hibernate那样可以逆向工程方法生产这些无技术含量的代码, 后面再研究下basemapper如何通过泛型进行封装,这样每个类的简单的增删改查我们都不用写了,只需要写业务相关的代码就可以了,减少了30%的代码量基本

如果感觉我写的不好或者不全,自己可以看官方文档,里面写的比较详细
官方文档

添加mave 支持

在这里插入图片描述
这说明下:
一定放到和< /pluginManagement> 同级别,不然截图右侧mybatis-genertor 这个插件不显示,我就是遇到这个问题了,百度才发现是这么一个问题

<plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.3</version>
        <configuration>
          <!-- 配置文件路径 -->
          <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
        </configuration>
      </plugin>
    </plugins>

generatorConfig.xml 配置文件是主要的

主要的有以下四部分:

  1. 指定数据库连接的属

  2. javaModelGenerator:Java模型生成器

  3. sqlMapGenerator:SQL Map的XML文件生成器

  4. javaClientGenerator:即生成 Mapper 接口

  5. 指定要逆向分析哪些表

<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <classPathEntry location="D:\projects2\HRP_ECS\WebRoot\WEB-INF\lib\mysql-connector-java-5.1.44-bin.jar"/>
    <!-- context:一组环境
       id:必选,唯一标识符,用于在生成错误时提示
       defaultModelType:指定生成 JavaBean 的模式
           conditional:默认,类似于层次模型,表只包含一个字段时不会生成单独的类,该字段将合并到基本记录类中。
           flat:所有字段生成在一个 JavaBean 中
           hierarchical:主键列会生成主键类,Blob 列也单独生成一个类,再其余字段一个类,类之间存在适当的继承关系。
       targetRuntime:
           MyBatis3:默认的值,生成基于 MyBatis3.x 以上版本的内容,包括XXXBySample
           MyBatis3Simple:类似 MyBatis3,不生成 XXXBySample
           MyBatis3DynamicSql、Ibatis2Java2、Ibatis2Java5
       introspectedColumnImpl:值为类的全限定名,用于扩展 MBG -->

    <context id="simple" targetRuntime="MyBatis3Simple">
        <!--默认false,为true将分隔SQL关键字(如果它们在表中用作列名)。 MBG维护了不同数据库的SQL关键字列表(SqlReservedWords),如特定关键字不在MBG的列表中,可使用<columnOverride>分隔-->
        <property name="autoDelimitKeywords" value="false"/>
        <!-- 指明数据库的用于标记数据库对象名的符号,如ORACLE是双引号",MYSQL是反引号`
        导出的sql里面就有这个差距,原来我还真不知道这么回事-->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 生成 Java 文件的编码格式,有关有效编码的信息参阅 java.nio.charset.Charset -->
        <property name="javaFileEncoding" value="UTF-8"/>

        <!-- Java代码格式化程序的全类名,该类须实现org.mybatis.generator.api.JavaFormatter,并有无参数构造函数,MBG 默认 org.mybatis.generator.api.dom.DefaultJavaFormatter -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- XML代码格式化,须实现org.mybatis.generator.api.XmlFormatter,并有无参数构造函数,MBG 默认 org.mybatis.generator.api.dom.DefaultXmlFormatter -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>


        <!-- 插件,让实体类实现序列化接口 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

        <commentGenerator>
            <!-- 指定 MBG 是否去除生成代码中的注释 这个如果不去除 里面一大堆英文的注释,没有多大意义 -->
            <property name="suppressAllComments" value="true" />
            <!-- 指定 MBG 是否在生成的注释中包含生成时间戳 -->
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!-- 指定数据库连接的属-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://ip:3306/hrp_ecs" password="" userId=""/>


        <!-- javaTypeResolver:处理数据库中的类型到 Java 中的类型,默认使用 org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl
                       type:指定用户提供的 Java Type Resolver。该类必须实现 org.mybatis.generator.api.JavaTypeResolver 接口,并必须有公共默认构造函数。可写 DEFAULT-->
        <javaTypeResolver type="DEFAULT">
            <!-- forceBigDecimals:MBG 是否强制对 DECIMAL 和 NUMERIC 字段使用 java.math.BigDecimal,而不是在可能时替换整数类型
                    true:如果数据库列的类型为 DECIMAL 或 NUMERIC,则 Java 类型解析程序将始终使用 java.math.BigDecimal
                    false:默认,
                        scale > 0 或 length > 18 使用 BigDecimal
                        scale = 0 且 length [10,18] 使用 Long
                        scale = 0 且 length [5,9] 使用 Integer
                        scale = 0 且 length < 5 使用 Short -->
            <property name="forceBigDecimals" value="false"/>

            <!-- useJSR310Types:指定 MyBatis Generator 是否应强制在 DATE,TIME 和 TIMESTAMP 字段中使用 JSR-310 数据类型,而不是使用 java.util.Date
                    true:则类型将按如下方式解析:
                        DATE    java.time.LocalDate
                        TIME    java.time.LocalTime
                        TIMESTAMP    java.time.LocalDateTime
                注意:类型解析器将始终解析以下JSR-310类型,无论此属性的值如何:
                    TIME_WITH_TIMEZONE    java.time.OffsetTime
                    TIMESTAMP_WITH_TIMEZONE    java.time.OffsetDateTime -->
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>


        <!-- javaModelGenerator:Java模型生成器,此元素是 context 元素的必需子元素,负责:1,key类(见context的defaultModelType);2,java类;3,查询类
            targetPackage:生成的类将被放置的包,真实的包受 enableSubPackages 属性控制
            targetProject:目标项目,指定一个存在的本地文件系统目录,生成的内容会放到指定目录中,如果目录不存在,MBG 不会自动建目录 -->
        <javaModelGenerator targetPackage="com.hrp.sys.entity" targetProject="src/main/java">
            <!-- constructorBased:是否为每一个生成的类创建一个全参构造方法,且构建 SQL 结果映射以使用构造函数,而不是每个字段的“setter”,属性仅适用于MyBatis3。
                如果“immutable”属性设置为 true,则忽略此属性(并强制为 true)。默认值为 false<table>元素中的相应属性可覆盖此属性 -->
            <property name="constructorBased" value="false"/>

            <!-- enableSubPackages:是否在 targetPackage 的基础上,根据数据库的 schema 再生成一层 package,最终生成的类放在这个 package 下,默认为false
                假设 MYSCHMA 中的表为 MYTABLE,targetPackage 属性为“com.mycompany”。如果此属性为true,则类放在“com.mycompany.myschema”中。 false,则类放在“com.mycompany” -->
            <property name="enableSubPackages" value="false"/>

            <!-- immutable:是否创建不可变类,默认 false,如果为true,MBG 会创建一个全参构造方法,类没有“setter”方法,忽略“constructorBased”属性
                属性仅适用于MyBatis3,<table>元素中的相应属性可以覆盖此属性。-->
            <property name="immutable" value="false"/>

            <!-- rootClass:设置一个根对象(全类名),生成的 keyClass 或者 recordClass 会继承这个类;在Table的rootClass属性中可以覆盖该选项
                 注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了 -->
            <!--<property name="rootClass" value=""/>-->

            <!-- trimStrings:设置是否在getter方法中,对String类型字段调用trim()方法,默认false。可以使用<table><columnOverride>元素中的trimStrings属性覆盖。 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!-- sqlMapGenerator:SQL Map的XML文件生成器,如果指定sqlMapGenerator,MBG 生成SQL映射XML文件和模型classess。如果未指定sqlMapGenerator,则仅生成模型类。
            在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),或者使用 Mapper 接口加 Annotation,所以,如果 javaClientGenerator 配置中配置了需要生成 XML 的话,这个元素就必须配置
            targetPackage/targetProject:同 javaModelGenerator -->
        <sqlMapGenerator targetPackage="mapper.hrp.sys" targetProject="src/main/resources">
            <!-- 同 javaModelGenerator 中的 enableSubPackages-->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>


        <!-- javaClientGenerator:即生成 Mapper 接口,如果没有配置该元素,那么默认不会生成 Mapper 接口
            targetPackage/targetProject:同javaModelGenerator
            type:Java客户端生成器,指定用户提供的Java客户端生成器。用户提供的 DAO 生成器必须扩展 org.mybatis.generator.codegen.AbstractJavaClientGenerator 类,并且必须具有公共默认构造函数。
                如果 <context> targetRuntime 是 MyBatis3
                    1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML
                    2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中
                    3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML
                如果 <context> targetRuntime 是 MyBatis3Simple
                    ANNOTATEDMAPPER/XMLMAPPER
                如果 <context> targetRuntime 是 Ibatis2Java2 或 Ibatis2Java5
                    IBATIS/GENERIC-CI/GENERIC-SI/SPRING
            implementationPackage:如果指定,实现类将放在此包中 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.hrp.sys.dao" targetProject="src/main/java" >
            <!-- enableSubPackages:控制实际包路径的计算方式
                    true,则计算的包将是表的目录和模式的 implementationPackage 加子包(如果存在)
                    false(默认值),则计算的包将与implementationPackage属性中指定的完全相同。 MBG 将根据生成的包创建文件夹 -->
            <property name="enableSubPackages" value="false"/>

            <!-- exampleMethodVisibility:设置不同“ByExample”方法的可见性 - selectByExample,deleteByExample等。不指定,方法将是公共的,并在界面中声明
                    public 默认值:实现类中生成的方法将是public,并且将在接口中声明方法
                    private:实现类中生成的方法将是私有的,并且不会在接口中声明方法
                    protected:实现类中生成的方法将受到保护,并且不会在接口中声明方法
                    default:实现类中生成的方法将具有默认(包)可见性,并且不会在接口中声明方法
                如果目标运行时为 MyBatis3,则忽略此属性 -->
            <property name="exampleMethodVisibility" value="public"/>

            <!-- methodNameCalculator:选择方法名称计算器。方法名称计算器可用于为 DAO 方法提供不同的名称。可以选择预定义值,也可以指定实现 org.mybatis.generator.api.DAOMethodNameCalculator 接口类的全类名
                    default 默认值:生成的方法名称将非常简单(“insert”,“updateByPrimaryKey”等)
                    extended:生成的方法名称将包含与方法关联的域对象的名称(“insertWidget”,“updateWidgetByPrimaryKey”等)
                如果目标运行时为MyBatis3,则忽略此属性。-->
            <property name="methodNameCalculator" value="default"/>

            <!-- rootInterface:为所有生成的接口对象指定超级接口。 可以通过在Table配置上指定rootInterface属性来覆盖此值
                MBG不验证接口是否存在,或者是否是有效的Java接口。属性的值为全类名 -->
            <!--<property name="rootInterface" value=""/>-->

            <!--true,则带注释的客户端将使用 MyBatis 中的 SqlBuilder 生成动态SQL。使用 MyBatis 3.2 及更高版本时,不推荐使用该构建器以支持新的SQL类。
                false,MBG 将生成使用新 SQL 构建器的客户端。默认 false -->
            <property name="useLegacyBuilder" value="false"/>
        </javaClientGenerator>

        <!-- 指定要逆向分析哪些表,根据表创建 javaBean, 可用 % 匹配所有表 -->
        <table tableName="sys_user_mes" domainObjectName="sysUserMes"/>


    </context>
</generatorConfiguration>

测试类:

@Test
    public void testGenertor() throws IOException {
        SqlSession sqlSession =getSqlSessiong();
        sysUserMesMapper sysUserMesMapper = sqlSession.getMapper(sysUserMesMapper.class);
        List<sysUserMes> sysUserMesList = sysUserMesMapper.selectAll();
        System.out.println(sysUserMesList.get(0).toString());

    }

xxxExample类的使用

Example 这种方式比较便于编码,不用拼接sql,只需要调用Example类去处理就可以类似于hibernate的DetachedCriteria

example 优缺点:
优点:

  1. 易于上手和掌握。

  2. sql写在xml里,便于统一管理和优化。

  3. 解除sql与程序代码的耦合。

  4. 提供映射标签,支持对象与数据库的orm字段关系映射

  5. 提供对象关系映射标签,支持对象关系组建维护

  6. 提供xml标签,支持编写动态sql。

缺点:

  1. sql工作量很大,尤其是字段多、关联表多时,更是如此。

  2. sql依赖于数据库,导致数据库移植性差。

  3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。

  4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)

  5. DAO层过于简单,对象组装的工作量较大。

  6. 不支持级联更新、级联删除。

  7. 编写动态sql时,不方便调试,尤其逻辑复杂时。

8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。

  1. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。

  2. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)

  3. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)

  4. 缓存使用不当,容易产生脏数据

我个人认为最重要的一点就是索引这样很容易失效,如果数据量大的话很难保证效率,如果是个小项目或者demo使用Example不错,开发比较快,方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值