搞懂Mybatis逆向⼯程这一篇就够了

本文详细介绍了如何在Mybatis中使用逆向工程生成基础版和增强版的配置,包括pom.xml中的插件配置、generatorConfig.xml的设置,以及如何测试UserMapper接口和复杂的查询条件构建。
摘要由CSDN通过智能技术生成

使用基础版本

前置准备

项目结构

创建一个空的模块,此时java目录里面没有代码,mapper映射文件也没有。
在这里插入图片描述

导入依赖

在pom中添加逆向⼯程插件

<!--定制构建过程-->
<build>
 <!--可配置多个插件-->
 <plugins>
 <!--mybatis逆向⼯程插件-->
 <plugin>
 <!--插件的GAV坐标-->
 <groupId>org.mybatis.generator</groupId>
 <artifactId>mybatis-generator-maven-plugin</artifactId>
 <version>1.4.1</version>
 <!--允许覆盖-->
 <!--如果存在pojo实体类使用逆向工程时候,是清空然后在写入,如果不覆盖可能是追加的模式,会出错-->
 <configuration>
 <overwrite>true</overwrite>
 </configuration>
 <!--插件的依赖-->
 <dependencies>
 <!--mysql驱动依赖-->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>8.0.30</version>
 </dependency>
 </dependencies>
 </plugin>
 </plugins>
</build>

GAV坐标是指在软件开发中常用的一种标识方式,用于唯一确定一个软件插件或库。它由三个部分组成:Group ID(组织ID)、Artifact ID(项目ID)和Version(版本号),因此又称为GAV坐标。

  • Group ID(组织ID):代表开发插件或库的组织或团队的唯一标识符。
  • Artifact ID(项目ID):代表插件或库的名称或项目的唯一标识符。
  • Version(版本号):代表插件或库的特定版本。

配置generatorConfig.xml

该⽂件名必须叫做: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:⽣成的是基础版,只有基本的增删改查。
    MyBatis3:⽣成的是增强版,除了基本的增删改查之外还有复杂的增删改查。
    -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <!--防⽌⽣成重复代码-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

        <commentGenerator>
            <!--是否去掉⽣成⽇期-->
            <property name="suppressDate" value="true"/>
            <!--是否去除注释-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--连接数据库信息-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/hqyj03"
                        userId="root"
                        password="yjg">
        </jdbcConnection>
        <!-- ⽣成pojo包名和位置 -->
        <javaModelGenerator targetPackage="com.yjg.mybatis.pojo" targetProject="src/main/java">
            <!--是否开启⼦包-->
<!--如果为false会把com.yjg.mybatis.pojo当成一个目录造出来-->
            <property name="enableSubPackages" value="true"/>
            <!--是否去除字段名的前后空⽩-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- ⽣成SQL映射⽂件的包名和位置 -->
        <sqlMapGenerator targetPackage="com.yjg.mybatis.mapper" targetProject="src/main/resources">
            <!--是否开启⼦包-->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- ⽣成Mapper接⼝的包名和位置 -->
        <javaClientGenerator
                type="xmlMapper"
                targetPackage="com.yjg.mybatis.mapper"
                targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 表名和对应的实体类名-->
        <table tableName="user" domainObjectName="User"/>
    </context>
</generatorConfiguration>

数据库表

CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用逆向工程

点击插件使用

在这里插入图片描述

双击之后效果

双击之后就会出现,对应得实体类和mapper映射文件。
在这里插入图片描述

UserMapper.xml的内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yjg.mybatis.mapper.UserMapper">
  <resultMap id="BaseResultMap" type="com.yjg.mybatis.pojo.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
  </resultMap>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from user
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.yjg.mybatis.pojo.User">
    insert into user (id, username, password
      )
    values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
      )
  </insert>
  <update id="updateByPrimaryKey" parameterType="com.yjg.mybatis.pojo.User">
    update user
    set username = #{username,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select id, username, password
    from user
    where id = #{id,jdbcType=INTEGER}
  </select>
  <select id="selectAll" resultMap="BaseResultMap">
    select id, username, password
    from user
  </select>
</mapper>

UserMapper接口的内容

package com.yjg.mybatis.mapper;
import com.yjg.mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(User row);

    User selectByPrimaryKey(Integer id);

    List<User> selectAll();

    int updateByPrimaryKey(User row);
}

测试逆向工程

使用接口里面的方法看是否能够成功操作数据库

测试一

@Test
public void test01() throws Exception{
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();


    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = userMapper.selectAll();
    users.forEach(user -> System.out.println(user));
}

测试结果

能够查出结果,没有问题

在这里插入图片描述
测试二

@Test
public void test02() throws Exception{
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();


    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    int i = userMapper.deleteByPrimaryKey(0);
    System.out.println(i);
}

测试结果

能够删除数据库数据,没有问题
在这里插入图片描述

使用增强版

在配置generatorConfig.xml的时候

targetRuntime有两个值:
MyBatis3Simple:⽣成的是基础版,只有基本的增删改查。
MyBatis3:⽣成的是增强版,除了基本的增删改查之外还有复杂的增删改查。

只需要把上面的generatorConfig.xml文件的targetRuntime值换一下即可。

项目结构

当使用增强版本的时候,就会出现除了User实体类的其他两个类
在这里插入图片描述

UserExample和UserWithBLOBs

  1. UserExampleUserExample是一个用于构建查询条件的辅助类。它提供了一系列的方法,用于设置查询条件,比如等于、大于、小于、排序等。通过使用UserExample,可以方便地构建复杂的查询条件,并将其传递给MyBatis的查询接口进行数据库查询操作。
  2. UserWithBLOBsUserWithBLOBs是生成的包含大字段(BLOBs)的实体类。如果表中存在大字段类型(如TEXT、BLOB等),MyBatis逆向工程会为这些字段生成对应的实体类,并在原有的实体类(比如User)基础上扩展,以支持大字段的获取和设置。

总的来说,UserExampleUserWithBLOBs在MyBatis逆向工程中的作用如下:

  • UserExample帮助构建复杂的查询条件,提供了灵活的方法来指定查询规则和约束条件。
  • UserWithBLOBs是对包含大字段的表生成的实体类,它扩展了原有实体类的功能,使得对大字段的操作更加方便。

UserMapper接口

会比基础的版本多一些方法,相应的UserMapper.xml映射文件也会增多语句

package com.yjg.mybatis.mapper;

import com.yjg.mybatis.pojo.User;
import com.yjg.mybatis.pojo.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface UserMapper {
    long countByExample(UserExample example);

    int deleteByExample(UserExample example);

    int deleteByPrimaryKey(Integer id);

    int insert(User row);

    int insertSelective(User row);

    List<User> selectByExample(UserExample example);

    User selectByPrimaryKey(Integer id);

    int updateByExampleSelective(@Param("row") User row, @Param("example") UserExample example);

    int updateByExample(@Param("row") User row, @Param("example") UserExample example);

    int updateByPrimaryKeySelective(User row);

    int updateByPrimaryKey(User row);
}

测试方法

@org.junit.Test
public void test01() throws Exception{
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //执行查询
    //查询一个
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    User user = userMapper.selectByPrimaryKey(1);
    System.out.println(user);
    System.out.println("===============================================");

    //查询所有(selectByExample根据条件查询,如果条件为空,则表示没有条件)
    List<User> users = userMapper.selectByExample(null);
    users.forEach(user1 -> System.out.println(user1));
    System.out.println("===============================================");


    //按照条件进行查询
    //多条件查询
    // QBC ⻛格:Query By Criteria ⼀种查询⽅式,⽐较⾯向对象,看不到sql语句。
    UserExample userExample = new UserExample();
     userExample.createCriteria().andPasswordLike("%d%").andIdBetween(3, 5);
    List<User> userList = userMapper.selectByExample(userExample);
    userList.forEach(u-> System.out.println(u));
}

测试结果

查询一个成功
在这里插入图片描述
查询所有成功

在这里插入图片描述
根据条件查询成功
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjg_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值