zoukankan      html  css  js  c++  java
  • MyBatis的逆向工程

    一.MyBatis逆向工程概述

      MyBatis是目前很流行的持久层框架,很多企业都在采用。但是其复杂繁琐的配置,重复性的实体类创建等等,消耗了程序员大量的精力,同时有些地方如果一个细小的疏忽,可能导致最终功能运行失败。例如:在几十个字段的表中,某一列的列名配置疏忽。基于此,mybatis 推出了一套 jar 包,可以依据我们设计好的数据库表,自动生成 pojo、mapper 以及mapper.xml。有了逆向工程,便大大缩减了我们的开发时间。

    官网:http://www.mybatis.org/generator/index.html

    二.使用逆向工程

    1.第一步:创建maven工程并导入依赖

    <!-- 导入依赖坐标 -->
    <dependencies>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
    </dependencies>

    2.第二步:编写连接数据库的配置(jdbc.properties)

    # mysql驱动jar包的磁盘绝对路劲
    jdbc.path=G:\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/shdb
    jdbc.username=sh
    jdbc.password=sh123

    3.第三步:编写配置文件(mybatis-generator-config.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>
        <!-- 1.导入属性配置 -->
        <properties resource="jdbc.properties"></properties>
        <!-- 2.指定特定数据库的jdbc驱动jar包的位置 -->
        <classPathEntry location="${jdbc.path}"/>
    
        <!-- 3.全局配置  -->
        <context id="context" targetRuntime="MyBatis3">
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <commentGenerator>
                <property name="suppressAllComments" value="false"/>
                <property name="suppressDate" value="true"/>
            </commentGenerator>
            <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
            <jdbcConnection driverClass="${jdbc.driver}"
                            connectionURL="${jdbc.url}"
                            userId="${jdbc.username}"
                            password="${jdbc.password}"/>
            <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
                NUMERIC 类型解析为java.math.BigDecimal -->
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false"/>
            </javaTypeResolver>
    
            <!-- 配置生成文件的保存位置:★★★★★★★★★★★★★★★ -->
    
            <!--指定包名生成实体类 以及生成的地址 (可以自定义地址,如果路径不存在会自动创建) -->
            <javaModelGenerator targetPackage="cn.dintalk.domain.system"
                                targetProject="G:dintalkprojectgeneratorsrcmainjava">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false"/>
                <!-- 从数据库返回的值被清理前后的空格 -->
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
    
            <!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的mapper文件 -->
            <sqlMapGenerator targetPackage="cn.dintalk.dao.system"
                             targetProject="G:dintalkprojectgeneratorsrcmain
    esources">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false"/>
            </sqlMapGenerator>
    
            <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
                    type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
                    type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
                    type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
            -->
            <javaClientGenerator targetPackage="cn.dintalk.dao.system"
                                 targetProject="G:dintalkprojectgeneratorsrcmainjava" type="XMLMAPPER">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false"/>
            </javaClientGenerator>
    
            <!-- 指定数据库表:可同时指定多张表 -->
            <table schema="dintalkdb" tableName="dintalktable" domainObjectName="User"
                   mapperName="UserDao"
                   enableCountByExample="false" enableDeleteByExample="false"
                   enableSelectByExample="true" enableUpdateByExample="false"/>
        </context>
    </generatorConfiguration>

    4.第四步:编写运行类生成文件(参见官网)

    public class GeneratorSqlMapTest {
        // 官网提供的
        public void generator() throws Exception{
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            //指定 逆向工程配置文件
            InputStream in = GeneratorSqlMapTest.class.getClassLoader()
                .getResourceAsStream("mybatis-generator-config.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(in);
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                    callback, warnings);
            myBatisGenerator.generate(null);
            in.close();
        }
        //运行生成器方法,生成文件
        public static void main(String[] args) throws Exception {
            try {
                GeneratorSqlMapTest generatorSqlmap = new GeneratorSqlMapTest();
                generatorSqlmap.generator();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    5.第五步:将生产的文件拷贝到项目中即可

    Tips: 需要注意的有两点

    • 逆向工程的实体类没有实现序列化接口(Serializable)

    • 生成的实体类查询特例类也没有实现序列化接口(有内部类,特例类和内部类都要实现才行:GeneratedCriteria 和 Criterion 内部类)。

    三.主要API简介

    逆向工程在生成pojo的同时会生成一个配套的pojoExample类。该类是根据不同的数据库表字段生成的查询特例类。使用示例如下(以Factory实体为例):

    //1.测试查询一个:根据主键id
    @Test
    public void testFindAll(){
        Factory factory = factoryDao.selectByPrimaryKey("1");
        System.out.println(factory.getFactoryName());
    }
    
    /**2.使用特例进行查询
      * select * from co_factory
      *  where  这里的内容是靠criteria对象补全的
      *  group by   having
      *  order by   这里的内容是靠exmaple对象补全的
      */
     @Test
     public void testFindByCondition(){
         //1.创建例子,进行特例查询
         FactoryExample ex = new FactoryExample();
         //2.进行查询(传入ex对象),查询所有
         List<Factory> factories = factoryDao.selectByExample(ex);
         System.out.println(factories.size());
     }
    //3.使用特例配置条件查询
     @Test
    public void testFindByCondition1(){
        //1.创建例子,进行特例查询
        FactoryExample ex = new FactoryExample();
        //2.创建例子中的条件对象
        FactoryExample.Criteria criteria = ex.createCriteria();
        //3.设置查询条件:这里的方法是和对应数据库中的字段名称有关的
        criteria.andCtypeEqualTo("货物");
        //4.加入排序: clause:从句的意思
        ex.setOrderByClause("create_time desc");
        //5.进行查询(传入ex对象)
        List<Factory> factories = factoryDao.selectByExample(ex);
        System.out.println(factories.size());
    }

    Tips: 若是在实体类中有一对多和多对一的关系存在,则需要相应的修改实体类,并在dao接口中编写相应的方法。在xml文件中使用collection和association标签配置关联查询即可。

    关注微信公众号,随时随地学习

  • 相关阅读:
    图书管理系统---基于form组件和modelform改造添加和编辑
    Keepalived和Heartbeat
    SCAN IP 解释
    Configure Active DataGuard and DG BROKER
    Oracle 11gR2
    我在管理工作中積累的九種最重要的領導力 (李開復)
    公募基金公司超融合基础架构与同城灾备建设实践
    Oracle 11g RAC for LINUX rhel 6.X silent install(静默安装)
    11gR2 静默安装RAC 集群和数据库软件
    Setting Up Oracle GoldenGate 12
  • 原文地址:https://www.cnblogs.com/dintalk/p/10878634.html
Copyright © 2011-2022 走看看