前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis的逆向工程

MyBatis的逆向工程

作者头像
宋先生
发布2019-07-18 15:10:25
3980
发布2019-07-18 15:10:25
举报

一.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:\dintalk\project\generator\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的mapper文件 -->
        <sqlMapGenerator targetPackage="cn.dintalk.dao.system"
                         targetProject="G:\dintalk\project\generator\src\main\resources">
            <!-- 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:\dintalk\project\generator\src\main\java" 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标签配置关联查询即可。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 顶哥说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.MyBatis逆向工程概述
  • 二.使用逆向工程
  • 三.主要API简介
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档