文章目录

  • 概述
  • 示例
    • generatorConfig-country.xml
    • 编写Java运行代码
    • 运行获取自动生成的代码
    • 修改 MyBatis全局配置文件 mybatis-config.xml
    • 修改log4j
    • 编写单元测试了解Example的相关用法
      • selectByExample
      • updateByExampleSelective
      • deleteByExample+countByExample

概述

MyBatis-17MyBatis代码生成器(逆向工程)MBG使用中介绍了MBGZ的基本使用。我们知道在MBG的context中将targetRuntime配置为MyBatis3时,MBG会生成和Example相关的对象和方法。 本篇博文我们来介绍下与Example相关的用法。


示例

以country表相关的Example MBG 为例

generatorConfig-country.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><!-- 配置生成器 -->
<generatorConfiguration> <!-- 引用外部配置文件 --><properties resource="db.properties" /><!-- 在MBG工作的时候,需要额外加载的依赖包location属性指明加载jar/zip包的全路径 --><!--<classPathEntry location="F:\.m2\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar"/>--><context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"><!-- beginningDelimiter/endingDelimiter: 指明数据库的用于标记数据库对象名的符号,比如ORACLE是双引号,MYSQL默认是`反引号  --><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><!-- 生成的Java文件的编码 --><property name="javaFileEncoding" value="UTF-8"/><commentGenerator><!-- suppressDate是去掉生成日期那行注释,suppressAllComments是去掉所有的注解 --><property name="suppressDate" value="true"/><!-- 在生成的实体类中附带表字段的注释  MBG1.3.3中新增的功能 --><property name="addRemarkComments" value="true"/></commentGenerator><!-- 必须存在,使用这个配置链接数据库--><jdbcConnection driverClass="${jdbc.driver}"connectionURL="${jdbc.url}"userId="${jdbc.username}"password="${jdbc.password}"><!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver上 --></jdbcConnection><javaModelGenerator targetPackage="example.model" targetProject="src\main\java"><!-- 设置是否在getter方法中,对String类型字段调用trim()方法 --><property name="trimStrings" value="true" /></javaModelGenerator><sqlMapGenerator targetPackage="example.xml"  targetProject="src\main\resources"></sqlMapGenerator><javaClientGenerator type="XMLMAPPER" targetPackage="example.dao"  targetProject="src\main\java"></javaClientGenerator><table tableName="country"><generatedKey column="id" sqlStatement="MySql"/></table></context>
</generatorConfiguration>

编写Java运行代码

package com.mybatis.generator;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;/*** * * @ClassName: GeneratorCountry* * @Description: 读取 MBG 配置生成代码* * @author: Mr.Yang* * @date: 2018年4月27日 下午23:31:42*/
public class GeneratorCountry {public static void main(String[] args) throws Exception {// MBG 执行过程中的警告信息List<String> warnings = new ArrayList<String>();// 当生成的代码重复时,覆盖原代码boolean overwrite = true;// 读取MBG配置文件InputStream is = GeneratorCountry.class.getResourceAsStream("/generator/generatorConfig-country.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(is);is.close();DefaultShellCallback callback = new DefaultShellCallback(overwrite);// 创建 MBGMyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);// 执行生成代码myBatisGenerator.generate(null);// 输出警告信息for (String warning : warnings) {System.out.println(warning);}System.out.println("Finshed");}}

运行获取自动生成的代码

先粗略了解下自动生成代码结构

CountryExample实体类的结构

CountryMapper接口

CountryMapper.xml


修改 MyBatis全局配置文件 mybatis-config.xml

将配置文件配置到mybatis-config.xml中,因为只有这一个配置文件就直接添加上去了, 如果生成的目录一致,也可以再配置package. 这里mapper.xml和mapper接口目录不一致。所以不采用package的方式了。


修改log4j

为了便于查看mybatis的内部执行过程,添加如上代码


编写单元测试了解Example的相关用法

selectByExample

package example.dao;import java.util.List;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import com.artisan.mybatis.xml.mapper.BaseMapperTest;import example.model.Country;
import example.model.CountryExample;public class CountryMapperTest extends BaseMapperTest {@Testpublic void countryExampleTest() {// 获取sqlSessionSqlSession sqlSession = getSqlSession();try {// 获取 CountryMapper 接口CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);// 创建 Example 对象CountryExample example = new CountryExample();// 设置排序规则example.setOrderByClause("id desc, countryname asc");// 设置是否 distinct 去重example.setDistinct(true);// 创建条件,只能有一个 createCriteriaCountryExample.Criteria criteria = example.createCriteria();// id >= 1criteria.andIdGreaterThanOrEqualTo(1);// id < 4criteria.andIdLessThan(4);// countrycode like '%U%'// 最容易出错的地方,注意 like 必须自己写上通配符的位置,不可能默认两边加 %,like 可以是任何情况criteria.andCountrycodeLike("%U%");// or 的情况,可以有多个 orCountryExample.Criteria or = example.or();// countryname = 中国or.andCountrynameEqualTo("中国");// 执行查询List<Country> countryList = countryMapper.selectByExample(example);printCountryList(countryList);} catch (Exception e) {e.printStackTrace();} finally {// 不要忘记关闭 sqlSessionsqlSession.close();}}private void printCountryList(List<Country> countryList) {for (Country country : countryList) {System.out.printf("%-4d%4s%4s\n", country.getId(), country.getCountryname(), country.getCountrycode());}}}

除了代码中注释内容外,特别需要注意的地方是or的方法。 当有多个or的时候,SQL语句就是类似 or(…) or(…)这样的SQL,如果一个or都没有,那就只有example.createCriteria()中的查询条件。

日志

2018-04-28 15:43:09,468  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-28 15:43:09,468  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-28 15:43:09,677 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: select distinct id, countryname, countrycode from country WHERE ( id >= ? and id < ? and countrycode like ? ) or( countryname = ? ) order by id desc, countryname asc
2018-04-28 15:43:09,777 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1(Integer), 4(Integer), %U%(String), 中国(String)
2018-04-28 15:43:09,817 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: id, countryname, countrycode
2018-04-28 15:43:09,817 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 3, 俄罗斯, RU
2018-04-28 15:43:09,817 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 2, 美国, US
2018-04-28 15:43:09,817 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 1, 中国, CN
2018-04-28 15:43:09,817 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 3
3    俄罗斯  RU
2     美国  US
1     中国  CN

updateByExampleSelective

@Testpublic void updateByExampleSelectiveTest() {// 获取 sqlSessionSqlSession sqlSession = getSqlSession();try {// 获取 CountryMapper 接口CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);// 创建 Example 对象CountryExample example = new CountryExample();// 创建条件,只能有一个 createCriteriaCountryExample.Criteria criteria = example.createCriteria();// 更新所有 id > 2 的国家criteria.andIdGreaterThan(2);// 创建一个要设置的对象Country country = new Country();// 将国家名字设置为 Chinacountry.setCountryname("China");// 执行查询countryMapper.updateByExampleSelective(country, example);// 在把符合条件的结果输出查看printCountryList(countryMapper.selectByExample(example));} finally {// 为了不影响数据,这里选择回滚sqlSession.rollback();// 不要忘记关闭 sqlSessionsqlSession.close();}}

我们看CountryMapper接口,可以看到有 updateByExample和updateByExampleSelective。 这两个方法的区别是,当对象的属性为空的时候,第一个方法会将值更新为null , 第二个方法不会更新null属性的字段。 通过Example一般都是批量操作,由于country表存在主键id,不能被批量更新, 因此要使用updateByExampleSelective方法进行测试。

日志

2018-04-28 15:47:24,736  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-28 15:47:24,736  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-28 15:47:24,967 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: update country SET countryname = ? WHERE ( id > ? )
2018-04-28 15:47:25,083 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: China(String), 2(Integer)
2018-04-28 15:47:25,083 DEBUG [main] (BaseJdbcLogger.java:145) - <==    Updates: 3
2018-04-28 15:47:25,093 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: select id, countryname, countrycode from country WHERE ( id > ? )
2018-04-28 15:47:25,093 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 2(Integer)
2018-04-28 15:47:25,123 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: id, countryname, countrycode
2018-04-28 15:47:25,123 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 3, China, RU
2018-04-28 15:47:25,123 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 4, China, GB
2018-04-28 15:47:25,123 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 5, China, FR
2018-04-28 15:47:25,123 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 3
3   China  RU
4   China  GB
5   China  FR

deleteByExample+countByExample

@Testpublic void deleteByExampleTest() {// 获取 sqlSessionSqlSession sqlSession = getSqlSession();try {// 获取 CountryMapper 接口CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);// 创建 Example 对象CountryExample example = new CountryExample();// 创建条件,只能有一个 createCriteriaCountryExample.Criteria criteria = example.createCriteria();// 删除所有 id > 2 的国家criteria.andIdGreaterThan(2);// 执行查询countryMapper.deleteByExample(example);// 使用 countByExample 查询符合条件的数量,因为删除了,所以这里应该是 0Assert.assertEquals(0, countryMapper.countByExample(example));} finally {// 为了不影响数据,这里选择回滚sqlSession.rollback();// 不要忘记关闭 sqlSessionsqlSession.close();}}

日志

2018-04-28 15:49:43,236  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-28 15:49:43,266  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-28 15:49:43,503 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: delete from country WHERE ( id > ? )
2018-04-28 15:49:43,633 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 2(Integer)
2018-04-28 15:49:43,643 DEBUG [main] (BaseJdbcLogger.java:145) - <==    Updates: 3
2018-04-28 15:49:43,653 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: select count(*) from country WHERE ( id > ? )
2018-04-28 15:49:43,653 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 2(Integer)
2018-04-28 15:49:43,693 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: count(*)
2018-04-28 15:49:43,693 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 0
2018-04-28 15:49:43,693 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 1

通过上述几个例子,应该对example有所了解了。 使用Example查询能够解决大部分复杂的单表操作,一定程度上减少工作量。 但是建议在条件很多并且判断很多的情况下,避免使用Example查询, 这种情况下,使用XML方式会更有效。

MyBatis-18MyBatis代码生成器-Example讲解相关推荐

  1. 视频教程-MyBatis Generator代码生成器视频教程-Java

    MyBatis Generator代码生成器视频教程 Java讲师,多年培训经验,曾参与开发过的项目:某省电信ODS系统.电信自助取数系统.CRM客户关系管理系统.环境应急信息系统.自来水客服系统等. ...

  2. MyBatis Plus Generator——MyBatis Plus代码生成器DEMO

    官方文档 https://mp.baomidou.com/guide/generator.html Maven <dependency><groupId>mysql</g ...

  3. Mybatis Plus————代码生成器

    代码生成器 MyBatis Plus是MyBatis的扩展框架,而代码生成器是MP的核心功能之一,另外还有 "条件构造器"和"通用CRUD"等功能. 步骤演示 ...

  4. Mybatis Plus 代码生成器-让上班划水不再是梦

    文章目录 1. 废话哔哔 2. 开搞 2.1 核心maven依赖 2.2 Spring Boot主要配置 2.3 Mybatis Plus 代码生成器代码 2.4生成的代码结构如下 1. 废话哔哔 不 ...

  5. MyBatis框架的详细讲解(优点与缺点)

    文章目录 前言 一.Mybatis是什么? 核心思想 二.ORM Mybatis的基本要素 二.resultMap和resultType的区别: resultMap自动映射区别: 使用@param注解 ...

  6. MyBatis Generator 代码生成器

    MyBatis Generator 代码生成器 MyBatis Generator简介 MyBatis Generator(MBG)是MyBatis 的代码生成器.它将为MyBatis的所有版本生成代 ...

  7. MyBatis代码生成器-Example讲解

    概述 在上篇博文 MyBatis代码生成器(逆向工程)MBG使用 中介绍了MBGZ的基本使用.我们知道在MBG的context中将targetRuntime配置为MyBatis3时,MBG会生成和Ex ...

  8. mybatisplus代码生成器_想做时间管理大师?你可以试试Mybatis Plus代码生成器

    1. 前言 对于写Crud的老司机来说时间非常宝贵,一些样板代码写不但费时费力,而且枯燥无味.经常有小伙伴问我,胖哥你怎么天天那么有时间去搞新东西,透露一下秘诀呗. 好吧,今天就把Mybatis-pl ...

  9. mybatis maven 代码生成器(mysql)

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  10. mybatis中mysql转义讲解

    本文为博主原创,未经允许不得转载: 在mybatis中写sql的时候,遇到特殊字符在加载解析的时候,会进行转义,所以在mybatis中 写sql语句的时候,遇到特殊字符进行转义处理. 需要注意的是,转 ...

最新文章

  1. 课时 17-深入理解 etcd:etcd 性能优化实践(陈星宇)
  2. 科技人员在计算机前的肖像,基于计算机视觉的人脸肖像画生成研究
  3. 深度学习笔记 第五门课 序列模型 第三周 序列模型和注意力机制
  4. 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架
  5. 关于 SAP ABAP gateway OData 的一个诡异问题及解决办法
  6. 2021牛客暑期多校训练营2 G.League of Legends(转化+单调队列)
  7. Google Guava EventBus用于事件编程
  8. Java 7:满足Fork / Join框架
  9. C#的变迁史03 - C# 3.0篇
  10. Flutter NestedScrollView实现的一个经典滑动折叠头部图片的效果
  11. JAVA学习day06
  12. 机器学习算法-09-深度学习、BP神经网络、Hopfield神经网络、基于数学原理的神经网络、径向基函数RBF(B站一条会说666的咸鱼)
  13. android连接airprint打印机,AirPrint:iOS的打印机
  14. jquery $(document).ready() 与window.onload的区别(转)
  15. Vdbench工具安装使用
  16. Python3实现两个Excel文件内容比对
  17. Cocos技术派 | TS版属性声明详解
  18. Bluetooth 蓝牙介绍(四):低功耗蓝牙BLE Mesh网络Ⅱ —— Mesh网络
  19. win10关闭系统更新后,还会提示更新
  20. 鸿蒙应用开发:实现简单的媒体播放器

热门文章

  1. cas java单点登录_(Java)CAS单点登录
  2. 小学五年级计算机考试试题,小学信息技术考试题库中五年级试题——选择题
  3. bulk interface驱动_USB驱动程序(较详细)三
  4. typora下载安装步骤
  5. 软件测试的功能点理解
  6. eclipse如何装php插件,Eclipse PHP插件(PHPEclipse)安装与配置图解
  7. H3C交换机s5500Web登录配置
  8. RedHat7安装QQ
  9. VC编程实现色彩空间XYZ与LAB相互转换
  10. java的applet教程_Java Applet基础