Mybites逆向和使用

163 阅读1分钟

1. 概念

使用mybites需要mapper.xml,mapper.jva和pojo等文件和代码,如果手动编写无疑是一个巨大的工程,使用mybites逆向工具可以帮助我们快速生成这些文件和代码。

2. 基础使用

本文以创建一个user表为例介绍mybites逆向的使用方法

2.1 创建user表

在mysql中创建如下表格:

CREATE TABLE user(
	user_id VARCHAR(32) PRIMARY KEY,
	user_name VARCHAR(128),
	header_url VARCHAR(512),
	level INT8,
	follower_count BIGINT,
	like_count BIGINT,
	badge_count BIGINT,
	 sex VARCHAR(32),
	 phone_number VARCHAR(32) NOT NULL,
	create_time TIMESTAMP,
	modify_time TIMESTAMP
);

image.png

2.2 导入依赖

在Java项目中的pom.xml文件中导入如下依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.10</version>
</dependency>
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.4.1</version>
</dependency>

2.3 配置逆向工程的配置文件generatorConfig.xml

逆向工程的配置文件主要包括5个部分:

  1. 数据库的连接信息
  2. 生成pojo实体对象的存储路径
  3. 生成mapper.xml文件的存储路径
  4. 生成mapper对应java文件的存储路径
  5. 数据库表
<?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="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/jujindb"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <!-- 对应生成的pojo所在包 -->
        <javaModelGenerator targetPackage="com.tsinghualei.juejin" targetProject="model/pojo"/>

      <!-- 对应生成的mapper所在目录 -->
        <sqlMapGenerator targetPackage="com.tsinghualei.juejin" targetProject="resources/mapper"/>

      <!-- 配置mapper对应的java映射 -->
        <javaClientGenerator targetPackage="com.tsinghualei.juejin" targetProject="mapper" type="XMLMAPPER"/>

        <!-- 数据库表 -->
      <table tableName="user"></table>
    </context>
</generatorConfiguration>

2.4 编写生成文件的代码

package com.tsinghualei.juejin.mapper;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.api.ProgressCallback;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class MybitesGenerator {

    public static void main(String[] args) throws Exception {
        try {
            MybitesGenerator generator = new MybitesGenerator();
            generator.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void generator() throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        //指定 逆向工程配置文件
        File configFile = new File("src/main/resources/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                callback, warnings);
        myBatisGenerator.generate((ProgressCallback)null);
        if(warnings.isEmpty()){
            System.out.println("DONE!");
        }else{
            for(int i=0;i<warnings.size();++i){
                System.out.println(warnings.get(i));
            }
        }
    }
}

2.5 生成文件

运行2.4的代码即可生成以下文件

image.png

3. mybites功能开发

这里简单举例一个使用手机号码来创建一个新用户的功能,来演示mybites的使用方法。

3.1 在application.yml中配置

# 整合mybatis
mybatis:
  type-aliases-package: com.tsinghualei.juejin.model.pojo      # 所有pojo类所在的包路径
  mapper-locations: classpath:mapper/*.xml    # mapper映射文件

3.2 controller层

负责调用Service层的接口,当user查询不到时会尝试新建一个user,新建失败返回错误。

package com.tsinghualei.juejin.controller;

import com.tsinghualei.juejin.common.result.GraceJSONResult;
import com.tsinghualei.juejin.model.pojo.User;
import com.tsinghualei.juejin.service.UserService;
import io.swagger.annotations.Api;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@Api(tags = "LoginRegisterContorller")
@RequestMapping("/LoginRegisterContorller")
public class LoginRegisterContorller {
    @Autowired
    UserService userService;

    @ResponseBody
    @PostMapping("createUserByMobile")
    GraceJSONResult createUserByMobile(@RequestParam String phoneNumber){
        userService.createUserByMobile(phoneNumber);
        return GraceJSONResult.ok();
    }

}

3.3 service层

  • 接口:
package com.tsinghualei.juejin.service;

import com.tsinghualei.juejin.model.pojo.User;
import org.springframework.stereotype.Service;
public interface UserService {
    /**
     * 通过手机号判创建user
     */
    void createUserByMobile(String phoneNumber);
}
  • 实现类:
package com.tsinghualei.juejin.service.impl;

import com.tsinghualei.juejin.common.util.UUIDUtil;
import com.tsinghualei.juejin.mapper.UserMapper;
import com.tsinghualei.juejin.model.pojo.User;
import com.tsinghualei.juejin.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.UUID;

@Service
public class UserServiceImpl implements UserService {

    String headerUrl = "https://img1.baidu.com/it/u=592570905,1313515675&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500";

    @Autowired
    UserMapper userMapper;

    @Override
    public void createUserByMobile(String phoneNumber) {
        User user = new User();
        String uuid = UUIDUtil.getUUID(32);
        user.setUserId(uuid);
        user.setUserName("user_"+uuid.trim());
        user.setCreateTime(new Date());
        user.setLevel(0L);
        user.setBadgeCount(0L);
        user.setFollowerCount(0L);
        user.setLikeCount(0L);
        user.setModifyTime(new Date());
        user.setHeaderUrl(headerUrl);
        user.setPhoneNumber(phoneNumber);
        user.setSex("null");
        userMapper.createUserByMobile(user);
    }
}

3.4 mapper层

  • 接口
package com.tsinghualei.juejin.mapper;

import com.tsinghualei.juejin.model.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper {
    void createUserByMobile(@Param("user") User user);
}
  • xml 在UserMapper.xml中加入以下配置:
<insert id="createUserByMobile" parameterType="com.tsinghualei.juejin.model.pojo.User">
  insert into user(user_id, user_name,header_url,
                   level, follower_count,like_count,
                   badge_count,sex,phone_number,
                   create_time,modify_time)
  values (#{user.userId}, #{user.userName}, #{user.headerUrl},
          #{user.level}, #{user.followerCount}, #{user.likeCount},
          #{user.badgeCount}, #{user.sex}, #{user.phoneNumber},
          #{user.createTime}, #{user.modifyTime})
</insert>

调用该接口并测试

使用swagger2调用该接口: image.png 数据库中插入成功:

image.png

参考文献

[1] www.jianshu.com/p/13de97577…