专栏首页古时的风筝mybatis Generator生成代码及使用方式

mybatis Generator生成代码及使用方式

为什么要有mybatis

mybatis 是一个 Java 的 ORM 框架,ORM 的出现就是为了简化开发。最初的开发方式是业务逻辑和数据库查询逻辑是分开的,或者在程序中编写 sql 语句,或者调用 sql 存储过程。这样导致思维需要在语言逻辑和 sql 逻辑之间切换,导致开发效率低下。所以出现了一系列的 ORM 框架,ORM 框架将数据库表和 Java 对象对应起来,当操作数据库时,只需要操作对象的 Java 对象即可,例如设置几个 and 条件,只需要设置几个属性即可。

为什么要有mybatis generator

虽然说有了 mybatis 框架,但是学习 mybatis 也需要学习成本,尤其是配置它需要的 XML 文件,那也是相当繁琐,而且配置中出现错误,不容易定位。当出现莫名其妙的错误或者有大批量需要生成的对象时,时常会有种生无可恋的感觉在脑中徘徊。故此, mybatis generator 应运而生了。

它只需要简单配置,即可完成大量的表到 mybatis Java 对象的生成工作,不仅速度快,而且不会出错,可让开发人员真正的专注于业务逻辑的开发。

官方提供的 mybatis generator 功能比较简单,对于稍微复杂但是开发中必然用到的分页功能、批量插入功能等没有实现,但已经有成熟的插件功能支持。

我已经将我们平时用的mybatis生成工具放到 github ,其中已集成了分页、批量插入、序列化功能。可到 这里 查看,已经介绍了使用方法。

mybatis generator 生成的文件结构

生成的文件包含三类:

  1. Model 实体文件,一个数据库表生成一个 Model 实体;
  2. ModelExample 文件,此文件和实体文件在同一目录下,主要用于查询条件构造;
  3. Mapper 接口文件,数据数操作方法都在此接口中定义;
  4. Mapper XML 配置文件;

在配置文件中配置好文件的生成路径,并设置好对应的包名,即可生成对应的目录结构和文件。我将生成目录设置为 test 目录,实体包名设置为  com.fengzheng.dao.entity   ,接口包名设置为  com.fengzheng.dao.mapper ,然后生成的文件目录结构如下图所示:

如何编写代码呢

 所有的方法调用都来自于生成的接口文件,在 Spring MVC 中,需要在调用方声明,用一个黑名单接口为例,生成的接口文件为 BlackListIPMapper ,所以在调用方要声明此接口,如下:

@Autowired
private BlackListIPMapper blackListipMapper;  

数据库查询

查询是最常用功能,如下方法是查询 IP 为某值的记录,如果知道主键的话,可以用  selectByPrimaryKey 方法。

public BlackListIP get(String ip){
        BlackListIPExample example = new BlackListIPExample();
        example.createCriteria().andIpEqualTo(ip);
        List<BlackListIP> blackListIPList = blackListipMapper.selectByExample(example);
        if(blackListIPList!=null && blackListIPList.size()>0){
            return blackListIPList.get(0);
        }
        return null;
    }

更新、添加、删除方法调用方法类似,具体可查看相关文档介绍。  

排序

public BlackListIP get(String ip){
        BlackListIPExample example = new BlackListIPExample();
        example.setOrderByClause("CREATE_TIME desc"); //按创建时间排序
        example.createCriteria().andIpEqualTo(ip);
        List<BlackListIP> blackListIPList = blackListipMapper.selectByExample(example);
        if(blackListIPList!=null && blackListIPList.size()>0){
            return blackListIPList.get(0);
        }
        return null;
    }

分页

public PageInfo list(Account account, PageInfo pageInfo,String startTime,String endTime) {
        account.setIsDel(SysParamDetailConstant.IS_DEL_FALSE);

        AccountExample example = getCondition(account,startTime,endTime);

        if (null != pageInfo && null != pageInfo.getPageStart()) {
            example.setLimitClauseStart(pageInfo.getPageStart());
            example.setLimitClauseCount(pageInfo.getPageCount());
        }

        example.setOrderByClause(" CREATE_TIME desc ");

        List<Account> list = accountMapper.selectByExample(example);

        int totalCount = accountMapper.countByExample(example);

        pageInfo.setList(list);
        pageInfo.setTotalCount(totalCount);

        return pageInfo;
    }

实现 a=x and (b=xx or b=xxx)这样的查询条件

虽然自动生成代码很方便,但凡事有利即有弊,mybatis generator 没有办法生成表联查(join)功能,只能手动添加。如下实现了a=x and (b=xx or b=xxx)这样的条件拼接。

AccountExample accountExample = new AccountExample();
AccountExample.Criteria criteria = accountExample.createCriteria().andTypeEqualTo("4");
criteria.addCriterion(String.format(" (ID=%d or ID=%d) ",34,35));
List<Account> accounts = accountMapper.selectByExample(accountExample);
return accounts; 

但是需要修改一点代码,修改 org.mybatis.generator.codegen.mybatis3.model包下的ExampleGenerator的第524行代码,将  method.setVisibility(JavaVisibility.PROTECTED);  改为  method.setVisibility(JavaVisibility.PUBLIC);

改动已同步到github上。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java多线程之---用 CountDownLatch 说明 AQS 的实现原理

    前面的文章中说到了 volatile 以及用 volatile 来实现自旋锁,例如 java.util.concurrent.atomic 包下的工具类。但是 ...

    古时的风筝
  • Spring Cloud 系列之 Eureka 实现服务注册与发现

    如果你对 Spring Cloud 体系还不是很了解,可以先读一下 Spring Cloud 都有哪些模块

    古时的风筝
  • Autojs - 用 JavaScript 实现自己的安卓手机自动化工具脚本

    这个软件叫做 Auto.js,只支持安卓,是一个不需要 Root 权限的 JavaScript 自动化软件。什么意思呢,就是在你的安卓手机上安装这个 APP,...

    古时的风筝
  • IP、UDP和TCP的关系

    互联网,实际上是一套理念和协议组成的体系架构。其中,协议是一套众所周知的规则和标准,如果各方都同意使用,那么它们之间的通信将变得毫无障碍。

    Dunizb
  • Hadoop伪分布式搭建

    用户1432189
  • Python3 flask nginx

    配置项目的时候一般使用虚拟环境,是各个项目的环境独立起来,更多方便管理。至于如何使用搜索即可,并不难

    py3study
  • 实现简单的http并发请求,支持:GET、POST、HEAD、PUT

    package main import ( "flag" "fmt" "io/ioutil" "net/http" "sync/atomic" "...

    李海彬
  • 无痛的微信小程序开发体验

    在小程序之初便开发应用了,现在小程序的开发也越来越成熟了,完善了很多的API、组件、架构等,社区也由原来的零星点点到现在的不大不小,但也算是有了,期间也诞生了很...

    疯狂的小程序
  • Xctf攻防世界-Web进阶题攻略

    攻防世界答题模块是一款提升个人信息安全水平的益智趣味答题,用户可任意选择题目类型进行答题。

    Aran
  • 拷贝构造

    拷贝构造特殊构造函数类型转换构造拷贝构造类型转换构造和拷贝构造示例关键字 explicit深拷贝和浅拷贝浅拷贝----复制地址深拷贝----复制内存何时需要自定...

    DeROy

扫码关注云+社区

领取腾讯云代金券