【MyBatis】你还不会使用MyBatis逆向工程来提高你的开发效率吗?

news2024/11/15 7:40:45

文章目录

    • MyBatis逆向工程
      • 1、快速入门
      • 2、逆向工程配置文件参数详解
      • 3、QBC查询

MyBatis逆向工程

  • 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表(Hibernate是支持正向工程的)
  • 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成 Java实体类、Mapper接口、Mapper映射文件

官方文档:MyBatis Generator

MyBatis官网:mybatis – MyBatis 3 | Introduction

1、快速入门

创建Maven项目
导入依赖
编写MyBatis配置文件
编写逆向工程配置文件
测试
  • Step1:创建Maven项目

    目录结构如下:

    image-20220911195422947

  • Step2:导入依赖

    pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>day04_mybatis</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <!--添加项目依赖-->
        <dependencies>
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.16</version>
            </dependency>
            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.10</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
    
        <!--添加项目所需的插件-->
        <build>
            <plugins>
                <!--mybatis逆向工程的插件-->
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.0</version>
    
                    <!-- 插件的依赖 -->
                    <dependencies>
                        <!-- 逆向工程的核心依赖 -->
                        <dependency>
                            <groupId>org.mybatis.generator</groupId>
                            <artifactId>mybatis-generator-core</artifactId>
                            <version>1.3.2</version>
                        </dependency>
                        <!-- MySQL驱动 -->
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>8.0.16</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
  • Step3:编写MyBatis配置文件

    jdbc.properties:

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql:///ssm?useSSL=false&characterEncoding=utf8&useServerPrepStmts=true&serverTimezone=UTC
    jdbc.username=root
    jdbc.password=32345678
    

    mybatis-config.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--
        MyBatis核心配置文件中,标签的顺序:
        properties?,settings?,typeAliases?,typeHandlers?,
        objectFactory?,objectWrapperFactory?,reflectorFactory?,
        plugins?,environments?,databaseIdProvider?,mappers?
    -->
        <!--引入properties文件-->
        <properties resource="jdbc.properties"/>
        <!--开启一些全局设置-->
        <settings>
            <!--开启格式转换-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <!--开启懒加载-->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!--关闭完整加载-->
            <setting name="aggressiveLazyLoading" value="false"/>
        </settings>
        <!--给实体类所在包起别名,简化书写-->
        <typeAliases>
            <package name="com.hhxy.pojo"/>
        </typeAliases>
        <!--数据库连接环境配置-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--数据库的连接信息-->
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
        <!--指定SQL映射文件-->
        <mappers>
            <!--使用包扫描方式,简化mapper文件的加载-->
            <package name="com.hhxy.mapper"/>
        </mappers>
    </configuration>
    
  • Step4:编写逆向工程文件

    generatorConfig.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>
        <!--	
        targetRuntime: 执行生成的逆向工程的版本,两种取值
            - MyBatis3Simple: 生成基本的CRUD(清新简洁版)
            - MyBatis3: 生成带条件的CRUD(奢华尊享版)
        -->
        <context id="DB2Tables" targetRuntime="MyBatis3Simple">
            <!--定义生成的java类的编码格式-->
            <property name="javaFileEncoding" value="UTF-8"/>
            <!-- 是否去除自动生成的注释 -->
            <commentGenerator>
        	<property name="suppressAllComments" value="true"/>
            </commentGenerator>
            <!-- 数据库的连接信息 -->
            <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"
                            userId="root"
                            password="32345678">
            </jdbcConnection>
            <!-- javaBean的生成策略-->
            <!--
            相关配置参数:
            targetPackage:根据数据生成的实体类的包
            targetProject:生成的路径
            enableSubPackages:是否能使用子包(如果是false,则只会解析第一个.,后面的.无法解析,强烈建议设置为true)
            trimStrings:是否去除数据库中表中字段的前后空格
            -->
            <javaModelGenerator targetPackage="com.hhxy.pojo"
                                targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
            <!-- SQL映射文件的生成策略 -->
            <sqlMapGenerator targetPackage="com.hhxy.mapper"
                             targetProject=".\src\main\resources">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
            <!-- Mapper接口的生成策略 -->
            <javaClientGenerator type="XMLMAPPER"
                                 targetPackage="com.hhxy.mapper" targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
            <!-- 逆向分析的表 -->
            <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
            <!-- domainObjectName属性指定生成出来的实体类的类名 -->
            <table tableName="t_emp" domainObjectName="Emp"/>
            <table tableName="t_dept" domainObjectName="Dept"/>
        </context>
    </generatorConfiguration>
    
  • Step5:测试

    启动逆向工程插件:

    • 方式一:

      image-20220911194812501

    • 方式二(需要下载Maven Help插件):

      image-20220911194714454

结果如下:

image-20220911193138860

image-20220911200509171

注意:逆向工程生成的pojo类并没有帮我们重写toString方法,这个需要手动重写一下

2、逆向工程配置文件参数详解

  • context标签:里面包含所有的逆向工程配置信息

    • id属性,用于定位逆向工程的配置信息
    • targetRuntime属性:设置生成的逆向工程的版本,两种取值
      • MyBatis3Simple:生成基本的CRUD(清新简洁版),生成的是基本增、删、改、查的五个方法
      • MyBatis3:生成带条件的CRUD(奢华尊享版),生成对单表的所有操作(含带条件的SQL)
  • jdbcConnection标签:用于设置数据库的连接信息

  • property标签:设置生成逆向工程的相关配置信息

    • name属性(关联value属性):
      • javaFileEncoding:用于设置生成逆向工程的编码格式
      • suppressAllComments:设置是否自动生成注释
      • enableDubPackages:设置是否能使用子包
      • trimStrings:设置是否去除数据库中表中字段的前后空格(控制pojo类的属性名的生成格式),强烈建议value取值true
  • javaModelGenerator标签:JavaBean类的生成设置

    • targetPackage属性:用于设置生成的JavaBean所在包名
    • targetProject属性:用于设置生成JavaBean的所在位置
  • sqlMapGenerator标签:设置SQL映射文件的生成策略

    • targetPackage属性:用于设置生成的SQL映射文件所在文件目录
    • targetProject属性:用于设置生成SQL映射文件的所在位置
  • JavaClientgenerator标签:设置Mapper接口的生成策略

    • type属性:设置XML和Mapper接口的映射方式,取值XMLMAPPER表示接口和XML完全分离(强烈推荐使用)
    • targetPackage属性:用于设置生成的Mapper所在包
    • targetProject属性:用于设置生成Mapper接口的所在位置
  • table标签:用于设置数据库中表名所对应的实体类的类名(一个表经过逆向工程可以生成一个与之对应的实体类,这个标签就是用来设置生成的实体类的类名)

    • tableName:表名
    • domainObjectName:实体类名

3、QBC查询

  在前面的快速入门中,我们使用逆向工程生成是清新简洁版的SQL,功能较为单一,只有增、删、改、查五种方法。如果想要使用逆向工程生成更加复杂的SQL,就需要将targetRuntime属性设置成MyBatis3(奢华尊享版),奢华尊享版含有对单表的所有SQL

  QBC(Query By Criteria)就是指通过使用Criteria对象来进行条件查询

相较于清新简洁版,奢华尊享版会多生成两个类:

image-20220911230416592

奢华尊享版中主要有四种方法:普通方法选择性方法条件方法混合方法

  • 普通方法:正常方法名,例如:insertupdate

  • 选择性方法:方法名一般以Selective结尾,常见的有:insertSelective(选择性添加)、updateSelective(选择性修改)

  • 条件方法:方法名一般以Example,常见的有:updateByPrimaryKeyupdateByExample

  • 混合方法:主要是条件方法和选择性方法的混合,例如:updateByPrimaryKeySelectiveupdateByExampleSelective

重点

  • 普通方法和选择性方法的区别:选择性方法不会将设置的为null的设置为null,而是遇到设置为null时采用字段的默认值;而普通方法会将设置为null的直接将字段的值设置为null,而不会在乎它的默认值是啥(主要是针对修改和添加两个方法)
  • 查询所有的方法,只需要将条件查询selectByExample()的条件设置成null就是查询所有了,即:selectByExample(null)

QBC插叙演示

演示所需环境,可以直接使用快速入门中的配置,但是有一点就是要将逆向工程生成的模式改为奢华尊享版,其他的照常

image-20220912131821182

import com.hhxy.mapper.EmpMapper;
import com.hhxy.pojo.Emp;
import com.hhxy.pojo.EmpExample;
import com.hhxy.utils.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import java.util.List;

/**
 * 逆向工程(奢华尊享版)测试类
 * @author ghp
 * @date 2022/9/12
 */
public class MBGTest {

    @Test
    public void MBGTest() {
        //1、获取SqlSessionFactory对象
        SqlSessionFactory sqlSF = SqlSessionFactoryUtil.getSqlSF();
        //2、获取SqlSession对象
        SqlSession sqlS = sqlSF.openSession();
        //3、获取Mapper接口对象
        EmpMapper mapper = sqlS.getMapper(EmpMapper.class);
        //4、执行SQL
        /*
        //1)根据Id进行查询
        Emp emp = mapper.selectByPrimaryKey(3);
        System.out.println(emp);
        //2)查询所有
        List<Emp> emps = mapper.selectByExample(null);
        emps.forEach(System.out::println);
        */

        //3)QBC查询,查询员工姓名是张三的
        //①获取Example对象
        EmpExample empExample = new EmpExample();
        //②获取条件对象Criteria
        EmpExample.Criteria criteria = empExample.createCriteria();
        //③设置条件

        String empName = "张三";
        //设置单条件(姓名为张三)
//        criteria.andEmpNameEqualTo(empName);

        //设置多条件
        //and连接词,通过链式编程实现(查询姓名为张三 并且 年龄在18~22之间):
//        criteria.andEmpNameEqualTo(empName).andAgeBetween(18,22);
        //or连接词(查询姓名为张三 或 李四)
        criteria.andEmpNameEqualTo("张三");
        empExample.or().andEmpNameEqualTo("李四");

        //④进行QBC查询
        List<Emp> emps = mapper.selectByExample(empExample);
        emps.forEach(System.out::println);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3技术2之ref函数、reactive函数、Vue3中的响应式原理

Vue3技术2ref函数处理基本类型App.vue处理对象类型App.vue总结&#xff1a;ref函数reactive函数只能修改对象类型App.vue完善代码App.vue总结&#xff1a;reactive函数Vue3.0中的响应式原理回顾Vue2的响应式原理Vue3响应式原理模拟Vue2中实现响应式index.html模拟Vue3中实现响应…

二分搜索树

一、概念及其介绍 二分搜索树&#xff08;英语&#xff1a;Binary Search Tree&#xff09;&#xff0c;也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。满足以下几个条件&#xff1a; 若它的左子树不为空&#xff0c;左子树上所有节点的值都小于它的根节点。若它…

程序环境和预处理(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是C语言中的程序环境和预处理这个知识点&#xff0c;这块知识点是小雅兰地C语言的最后一块知识点了&#xff0c;以后可能会更新一些C语言的书籍的阅读&#xff0c;比如&#xff1a;《C Primer Plus》和《C语言深度剖析》。…

腾讯云快直播低延时播放质量的优化实践

直播已经潜移默化成为许多人日常生活密不可分的一部分。无论是紧张刺激的比赛直播&#xff0c;还是垂涎欲滴的美食直播&#xff0c;亦或者自卖自夸的购物直播&#xff0c;大家都不希望在观看时出现长时间的加载和卡顿&#xff0c;对一些需要观众及时反馈的直播场景&#xff0c;…

【vue】Vue 全局API 详细介绍(nextTick、set、delete、......)

文章目录一、Vue.extend(options)二、 Vue.component三、Vue.nextTick([callback,context])/this.nextTick([callback,context])四、Vue.set(target,propertyName/index,value)/this.set(target,propertyName/index,value)五、Vue.delete(target,propertyName/index)六、Vue.fi…

算法:链表和数组哪个实现队列更快

背景 对于这个问题&#xff0c;我们先来思考一下数组和链表各有什么特点。 数组&#xff1a;连续存储&#xff0c;push 很快&#xff0c;shift 很慢。 链表&#xff1a;非连续存储&#xff0c;add、delete 都很快&#xff0c;但是查找很慢。 所以&#xff0c;我们可以得出结论…

QT 安装 及环境变量配置及出现的错误的解决方法

文章目录QT安装教程(win版)下载链接点击 产品 Qt开发工具点击 下载Qt下滑点击 开源用户下载下滑点击 下载Qt在线安装程序点击 win版本下载打开程序这一步可能遇到的问题1.在自己有Qt账号的情况下&#xff0c;下一步无法点击2.弹出一句话You need to verify your Qt account eai…

基础排序算法【快速排序+优化版本+非递归版本】

基础排序算法【快速排序优化版本非递归版本】&#x1f4af;&#x1f4af;&#x1f4af;⏰【快速排序】◽1.hoare法◽2.挖坑法◽3.前后指针法◽4.特性总结⏰【优化版本】◽1.随机选key◽2.三路取中◽3.小区间优化⏰【非递归版本】⏰【测试效率】排序OJ(可使用各种排序跑这个OJ)⏰…

CDH 6.3.2集群安装部署

文章目录CDH 6.3.2集群安装部署一 CDH概要1.1 CDH的背景1.2 CDH介绍二 环境准备2.1 安装部署环境2.2 部署规划2.3 服务器主机映射2.4 服务器免登录配置2.5 防火墙关闭2.6 关闭Selinux2.7 设置最大打开文件2.8 关闭最大透明页面压缩2.9 设置Swappiness空间2.10 安装JDK2.11 MySQ…

mysql中增删改成的练习

文章目录一、表的创建1.student表的数据2、课程表的数据course3、学生成绩表的数据二、操作序列1、查询计算机系cs的全体学生学号、姓名和性别2、检索选修了课程号为2的学生号和姓名3、检索至少选修了三门课以上的学生号4、检索选修了全部课程的学生5、在原表的基础上创建一个视…

java并发-线程池

java并发-线程池 线程池的介绍 Java线程池表示一组等待工作并多次重用的工作线程。在线程池的情况下&#xff0c;创建了一组固定大小的线程。服务提供者从线程池中拉出一个线程并分配一个作业。完成作业后&#xff0c;线程再次包含在线程池中。 使用线程池可以节省多线程应用…

Revit中如何绘制四面倾斜的屋顶?

一、Revit中如何绘制四面倾斜的屋顶&#xff1f; 如下图所示&#xff0c;像这种坡屋顶有两种方法进行绘制。具体操作如下。 第一种&#xff1a;定义坡度。 1、点击建筑选项卡中的屋顶按钮。 2、选择使用矩形工具。将偏移值修改为500。将屋顶迹线绘制出来。 3、选中全部屋顶迹…

信号浪涌保护器SPD选型方案

1.最大连续工作电压&#xff08;Uc&#xff09;&#xff1a;信号电路的最大电压必须小于Uc 最大连续工作电压Uc是最大工作信号电压&#xff0c;是电涌保护装置长期运行的信号电压或直流电压的最大有效值。这也是在额定漏电流条件下线与线之间或线与地之间的最大电压&#xff0…

UFT常用检查点的使用

录制时Flight自动打开。创建三个Action,分别命名为01_Login/02_New Order/03_Logout&#xff0c; 在Action里录制对应的Login/New Order/Logout操作。用飞机票预定系统订票&#xff0c;在02_New Order中设置起飞和到达城市参数化&#xff0c;用本地表数据&#xff08;至少2组数…

【排序算法(二)】选择排序(直接选择排序堆排序)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1、直接选择排序1.1 …

腾讯云轻量应用服务器搭建网站教程(WordPress为例)

腾讯云轻量应用服务器搭建WordPress网站教程&#xff0c;先安装WordPress应用镜像&#xff0c;然后远程连接轻量应用服务器获取WP用户名和密码&#xff0c;域名DNS解析到轻量服务器IP地址&#xff0c;登陆WordPress后台管理全过程&#xff0c;腾讯云百科来详细说下腾讯云轻量服…

作用域、闭包的理解、GC算法

1、全局作用域的变量是不会自动的的释放掉的 例如在 <script >let title "hello world"function coming(){alter(title) }</script> 只要不关闭网页或者浏览器&#xff0c;我们都可以在控制台调用 2、作用域环境我们可以理解为一块内存数据 3、函数作…

研报精选230416

目录 【行业230416国联证券】汽车行业4月周报&#xff1a;上海车展期待值高&#xff0c;政策加码一体化压铸【行业230416国联证券】农林牧渔行业周报&#xff1a;低猪价加深去化幅度&#xff0c;高标准农田建设推进【个股230416安信证券_万华化学】Q1业绩超预期&#xff0c;TDI…

靶机精讲之Prime

主机发现 192靶机 扫描靶机 进行对端口的服务和版本的扫描 保存信息 扫描UDP 一般都是http优先然后再shh vuln脚本扫描 web渗透 查看源码 目录爆破 dirb 翻刚才扫到的目录 dirb指定文件类型扫描 读取文件 保存 浏览链接 wfuzz模糊测试 专门扫PHP 只有两目录 浏览页面 模糊…

react2:children属性 - props进阶 - 生命周期

children属性&#xff1a;父想给子组件传递内容&#xff0c;都需要通过children占位 children属性&#xff1a;类似vue中的slot效果 props 类型验证 &#xff1a;现在都是 typescript 替代了 ref 放普通标签上可以获取dom节点 ref 放组件上获取组件实例&#xff0c;可以调用组件…