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标签配置关联查询即可。

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

  • 相关阅读:
    阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:8. 委托事件
    阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
    Git
    Git
    Git
    Git
    Git
    Git
    Git
    Delphi
  • 原文地址:https://www.cnblogs.com/dintalk/p/10878634.html
Copyright © 2011-2022 走看看