今天主要对Mybatis generator生成的DAO层等进行分析,讲解Example类的使用和扩展

1.先在数据库建表

 CREATE TABLE `department` (
`fid` varchar(255) NOT NULL,
`code` varchar(255) DEFAULT NULL COMMENT '部门代码',
`name` varchar(255) DEFAULT NULL COMMENT '部门名称',
PRIMARY KEY (`fid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.创建Mybatis generator配置文件

 <?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>
<context id="context1">
<!-- 去掉注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator> <!-- 配置连接信息 -->
<jdbcConnection connectionURL="jdbc:mysql://localhost:3306/demo1?serverTimezone=GMT%2B8"
driverClass="com.mysql.cj.jdbc.Driver" password="x5" userId="root" />
<!-- 配置实体类生成路径 -->
<javaModelGenerator targetPackage="com.wf.ew.demo1.model" targetProject="reverse\src\main\java" />
<!-- 配置MapperXML文件生成路径 -->
<sqlMapGenerator targetPackage="com.wf.ew.demo1.dao" targetProject="reverse\src\main\java" />
<!-- 配置DAO层生成路径 -->
<javaClientGenerator targetPackage="com.wf.ew.demo1.dao" targetProject="reverse\src\main\java" type="XMLMAPPER" />
<!-- 配置表和实体类的映射关系 -->
<table tableName="department" domainObjectName="Department">
<!-- <columnOverride column="???" property="???" /> -->
</table> </context> </generatorConfiguration>

3.生成的DepartmentExample

 package com.wf.ew.demo1.model;

 import java.util.ArrayList;
import java.util.List; public class DepartmentExample { /**
* 排序条件
*/
protected String orderByClause; /**
* 去重标识
*/
protected boolean distinct; /**
* 最终以or进行连接的条件列表,Criteria为一个以and连接的条件集
*/
protected List<Criteria> oredCriteria; /**
* 初始化条件描述对象容器列表
*/
public DepartmentExample() {
oredCriteria = new ArrayList<Criteria>();
} // 此处省略orderByClause、distinct的Getter、Setter和oredCriteria的Getter
…… /**
* 增加以and连接的条件集(先补全后增加)
*/
public void or(Criteria criteria) {
oredCriteria.add(criteria);
} /**
* 增加空的以and连接的条件集(先增加后补全)
* @return
*/
public Criteria or() {
Criteria criteria = createCriteriaInternal();
oredCriteria.add(criteria);
return criteria;
} /**
* 增加空的以and连接的条件集(当且仅当容器为空的才能加入)
* @return
*/
public Criteria createCriteria() {
Criteria criteria = createCriteriaInternal();
if (oredCriteria.size() == 0) {
oredCriteria.add(criteria);
}
return criteria;
} /**
* 增加空的条件描述对象容器(内部实现)
* @return
*/
protected Criteria createCriteriaInternal() {
Criteria criteria = new Criteria();
return criteria;
} /**
* 格式化过滤对象
*/
public void clear() {
oredCriteria.clear();
orderByClause = null;
distinct = false;
} /**
* 抽象类:条件描述对象容器(容器内的条件会以and连接)
*/
protected abstract static class GeneratedCriteria {
/**
* 条件描述对象容器
*/
protected List<Criterion> criteria; /**
* 初始化条件描述对象容器
*/
protected GeneratedCriteria() {
super();
criteria = new ArrayList<Criterion>();
} /**
* 判断是否有效(基本条件最少为1)
* @return
*/
public boolean isValid() {
return criteria.size() > 0;
} /**
* 获得所有条件描述对象
* @return
*/
public List<Criterion> getAllCriteria() {
return criteria;
} /**
* 获得条件描述对象容器
* @return
*/
public List<Criterion> getCriteria() {
return criteria;
} /*== 通用增加条件描述对象的方法 == */
/**
* 增加没有没有占位符的条件描述
* @param condition
*/
protected void addCriterion(String condition) {
if (condition == null) {
throw new RuntimeException("Value for condition cannot be null");
}
criteria.add(new Criterion(condition));
} /**
* 增加单占位符的条件描述(没有typeHandler)
* @param condition
* @param value
* @param property
*/
protected void addCriterion(String condition, Object value, String property) {
if (value == null) {
throw new RuntimeException("Value for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value));
} /**
* 增加区间参数的条件描述(没有typeHandler)
* @param condition
* @param value1
* @param value2
* @param property
*/
protected void addCriterion(String condition, Object value1, Object value2, String property) {
if (value1 == null || value2 == null) {
throw new RuntimeException("Between values for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value1, value2));
} // 以下省略 fid、code、name的14种条件查询生成(为空、不为空、=、<>、>、>=、<、<=、like、not like、in、not in、between、not between)
…… } /**
* 静态内部类:条件描述对象容器实现类
*
*/
public static class Criteria extends GeneratedCriteria { protected Criteria() {
super();
}
} /**
* 静态内部类:条件描述对象
*
*/
public static class Criterion {
private String condition; // 原子条件 private Object value; // 第一个值 private Object secondValue; // 第二个值 private boolean noValue; // 是否没有值 private boolean singleValue; // 是否单值(与listValue互逆) private boolean betweenValue; // 是否区间值 private boolean listValue; // 是否列表(与singleValue互逆) private String typeHandler; public String getCondition() {
return condition;
} // 此处省略 value、noValue、singleValue、listValue、typeHandler的Getter方法
…… /**
* 创建没有占位符的条件
* @param condition
*/
protected Criterion(String condition) {
super();
this.condition = condition;
this.typeHandler = null;
this.noValue = true;
} /**
* 创建单占位符的条件
* @param condition
* @param value
* @param typeHandler
*/
protected Criterion(String condition, Object value, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.typeHandler = typeHandler;
if (value instanceof List<?>) {
this.listValue = true;
} else {
this.singleValue = true;
}
} /**
* 创建单占位符的条件(没有typeHandler)
* @param condition
* @param value
*/
protected Criterion(String condition, Object value) {
this(condition, value, null);
} /**
* 创建区间参数的条件
* @param condition
* @param value
* @param secondValue
* @param typeHandler
*/
protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.secondValue = secondValue;
this.typeHandler = typeHandler;
this.betweenValue = true;
} /**
* 创建区间参数的条件(没有typeHandler)
* @param condition
* @param value
* @param secondValue
*/
protected Criterion(String condition, Object value, Object secondValue) {
this(condition, value, secondValue, null);
}
}
}

4.DepartmentExample的分析

  • DepartmentExample类中还包含了GeneratedCriteria、Criteria、Criterion三个静态内部类
  • Criterion表示一个最小粒度的条件的描述
  • GeneratedCriteria是一个抽象类;表示Criterion的集合,元素之间使用and连接
  • Criteria是GeneratedCriteria的实现类
  • DepartmentExample表示一个SQL语句的where、distinct、order by部分的描述;其中where部分表示Criteria的集合,元素间使用or连接

  使用一个例子进行说明 

 SELECT DISTINCT
*
FROM
maintainbill
WHERE
(
fState = '已完成'
AND
fItemType LIKE '%网络%'
)
OR (
fState = '待安排'
AND
fItemType LIKE '%电脑%'
);
  • 7、9、12、14为一个Criterion
  • 7、9需要存放到同一个Criteria中
  • 12、14需要存放到同一个Criteria中
  • 6-15位DepartmentExample的条件部分(以上两个Criteria需要存放入Example的List中)

5.使用DepartmentExample查询的优缺点

优点:

  • 因为是代码生成的,可以省去自己写XML和接口方法
  • 查询条件灵活

缺点:

  • 查删改都需要使用Example,略显繁琐
  • 没有分页功能

6.扩展DepartmentExample分页

① 在Example中加入startindex(开始行索引)、limit(记录数)属性及Getter、Setter

②扩展MapperXML中查询列表的select

 <if test="startindex !=null and limit !=null">
limit ${startindex},${limit}
</if>

7.补充DepartmentMapper接口的方法说明

 package com.wf.ew.demo1.dao;

 import java.util.List;

 import org.apache.ibatis.annotations.Param;

 import com.wf.ew.demo1.model.Department;
import com.wf.ew.demo1.model.DepartmentExample; public interface DepartmentMapper{
/**
* 根据example查询记录数
*/
long countByExample(DepartmentExample example); /**
* 根据example删除记录
*/
int deleteByExample(DepartmentExample example); /**
* 插入行(插入所有属性值)
*/
int insert(Department record); /**
* 插入行(插入非null属性值)
*/
int insertSelective(Department record); /**
* 根据example查询记录
*/
List<Department> selectByExample(DepartmentExample example); /**
* 根据example更新表(更新非null属性)
*/
int updateByExampleSelective(@Param("record") Department record, @Param("example") DepartmentExample example); /**
* 根据example更新表(更新所有属性)
*/
int updateByExample(@Param("record") Department record, @Param("example") DepartmentExample example);
}

2019-04-28 Mybatis generator逆向工程生成的Example代码分析的更多相关文章

  1. idea 中使用Mybatis Generator逆向工程生成代码

    通过MAVEN完成 Mybatis 逆向工程 1. POM文件中添加插件 在 pom 文件的build 标签中 添加 plugin 插件和 数据库连接 jdbc 的依赖. <build> ...

  2. 在IDEA中使用MyBatis Generator逆向工程生成代码

    本文介绍一下用Maven工具如何生成Mybatis的代码及映射的文件. 一.配置Maven pom.xml 文件 在pom.xml增加以下插件: <build> <finalName ...

  3. Mybatis Generator逆向工程的使用

    一.在 idea 中使用 mybatis generator 逆向工程 1.在IDEA上创建maven工程. 2.在pom.xml中配置MyBatis逆向工程插件 <!--MyBatis自动生成 ...

  4. MyBatis Generator 自定义生成注释

    注释生成器 为了生成db里面的注释,必须自定义注释生成器 EmptyCommentGenerator: import org.mybatis.generator.api.CommentGenerato ...

  5. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...

  6. SpringBoot+Mybatis+Generator 逆向工程使用(二)

    Mybatis-Genarator 逆向工程使用 个人开发环境 java环境:Jdk1.8.0_60 编译器:IntelliJ IDEA 2017.1.4 mysql驱动:mysql-connecto ...

  7. 使用Mybatis Generator自动生成Mybatis相关代码

    本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码: 一.构建一个环境: 1. 首先创建一个表: CREATE TABLE pet (name VARCHAR(2 ...

  8. SpringBoot 添加mybatis generator 自动生成代码插件

    自动生成数据层代码,提高开发效率 1.pom添加插件,并指定配置文件路径 <!-- mybatis generator 自动生成代码插件 --> <plugin> <gr ...

  9. idea中mybatis generator自动生成代码配置 数据库是sqlserver

    好长时间没有写博客了,最近公司要用java语言,开始学习java,属于初学者,今天主要记录一下mybatis generator自动生成代码,首先在如下图的目录中新建两个文件,如下图 generato ...

随机推荐

  1. SpringBoot是怎么在实例化时候将bean加载进入容器中

    之前写过的很多spring文章,都是基于应用方面的,这次的话,就带大家来一次对spring的源码追踪,看一看spring到底是怎么进行的初始化,如何创建的bean,相信很多刚刚接触spring的朋友, ...

  2. 基于Azkaban的任务定时调度实践

    本文由云+社区发表 作者:maxluo 一.Azkaban介绍 Azkaban是LinkedIn开源的任务调度框架,类似于JavaEE中的JBPM和Activiti工作流框架. Azkaban功能和特 ...

  3. Celery工具

    什么是Celery Celery的功能 Celery是基于python实现的第三方组件,可以实现定时任务.周期任务等. Celery的组成 Celery的角色 - 任务,创建或发布任务. - 使用re ...

  4. web scraper 抓取分页数据和二级页面内容

    如果是刚接触 web scraper 的,可以看第一篇文章. web scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据. ...

  5. Java 插入附件到PDF文档

    在文档中插入附件,可以起到与源文档配套使用的目的,以一种更简便的方式对文档起到补充说明的作用.下面将介绍通过Java编程插入附件到PDF文档中的方法.这里插入的文档可以是常见的文档类型,如Word.E ...

  6. 算法题:实现一个IP白名单过滤器

        最近看到一则招聘的JD,附了一个算法题的链接,原题如下: 请实现一个IP白名单过滤算法,实现以下接口 boolean addWhiteIpAddress(String ip); boolean ...

  7. Spring中关于AOP的实践之Scheme方式实现通知

    (刚开始写东西,不足之处还请批评指正) 关于AOP的通知编写方式有两种,使用Schema-baesd或者使用AspectJ方式,本篇主要介绍Schema-baesd方式的代码实现. (注:代码中没有添 ...

  8. 从0到1搭建AI中台

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 | 宜信技术学院 作者 | 井玉欣 导读:随着“数据中台”的提出和成功实践,各企业纷纷在“大中台 ...

  9. 【English】十二、英语句子种类,陈述句、疑问句、祈使句、感叹句

    一.英语句子按照用途可以分为4类 种类.用途.例句 陈述句 用于说明事实或说话人的看法(事实不就是别人发起并被同意的看法) My name is Jennt Green. I like him bec ...

  10. 问题解决--无法解析的外部符号 _imp_XXXXXXXXX

    错误示例: 出现字符_imp,说明不是真正的静态库,而是某个动态库的导入库,导入函数和自己不同名,所以加了字符_imp.比如说_imp_GetUserNameA就是GetUserNameA函数. 会报 ...