• 简单介绍几种常用的方法

1. 前言

  • 方法很多,此篇文章简单介绍几个方法,找适合自己的方法去用

1.1 方式1:JPA项目自动实体类(idea)

1.2 方式2:通过 groovy 脚本生成实体

  • 首先 idea 上连接上数据库,此处不介绍,不清楚的看方式1(文章里有介绍)。
  • 数据库表如下:
    在这里插入图片描述
  • idea 连数据库
    在这里插入图片描述
  • 编写 groovy 脚本
    在这里插入图片描述
  • 选择生成实体的脚本
    在这里插入图片描述
  • 选择实体存放路径(项目中包路径)
    在这里插入图片描述
  • 查看生成的实体
    在这里插入图片描述
  • 生成的实体代码
package com.liu.susu.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

/**
 * @Description 狗狗表 
 * @author susu 
 * @date 2022-06-12 
 */
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "dog")
public class DogEntity implements Serializable {

	private static final long serialVersionUID = 8648830679602744848L;

	/**
	* dog_num
	* 狗狗编号
	*/
   	@TableId(type = IdType.ASSIGN_UUID) 
	private Integer dogNum;

	/**
	* dog_name
	* 狗狗姓名
	*/
	private String dogName;

	/**
	* dog_kind
	* 狗狗种类
	*/
	private String dogKind;

	/**
	* dog_age
	* 狗狗年龄
	*/
	private Integer dogAge;

	/**
	* decision
	* 描述
	*/
	private String decision;

	/**
	* price
	* 狗狗价格
	*/
	private BigDecimal price;

	/**
	* expend
	* 狗狗开销
	*/
	private BigInteger expend;

	/**
	* birth
	* 出生日期
	*/
	private Date birth;

	/**
	* adopt_date
	* 领养时间
	*/
	private Date adoptDate;

}

1.3 方式三:插件 better-mybatis-generator

  • 首先安装插件 better-mybatis-generator
    在这里插入图片描述
  • 连接数据库,然后根据所需选择即可,如图
    在这里插入图片描述
    在这里插入图片描述

2.附groovy脚本

import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import java.text.SimpleDateFormat
import java.sql.Date
import java.time.LocalDate


/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helperd
 */

packageName = ""

typeMapping = [
          (~/(?i)bigint/)                   : "Long",
          (~/(?i)int/)                      : "Integer",
          (~/(?i)NUMBER\([\d]+\)/): "BigInteger",//oracle
          (~/(?i)NUMBER\([\d]+,[\d]+\)/): "BigDecimal",//oracle
          (~/(?i)decimal\([\d]+\)/): "BigInteger",//mysql
          (~/(?i)decimal\([\d]+,[\d]+\)/): "BigDecimal",//mysql
          (~/(?i)datetime|timestamp/)       : "Date",
          (~/(?i)date/)                     : "Date",
          (~/(?i)time/)                     : "Date",
          (~/(?i)/)                         : "String"
]


FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
}


def generate(table, dir) {
    def className = javaName(table.getName(), true)+"Entity"
    def fields = calcFields(table)
    packageName = getPackageName(dir)
    new File(dir, className + ".java").withPrintWriter("UTF-8") { out -> generate(out, className, fields,table) }
}

// 获取包所在文件夹路径
def getPackageName(dir) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

def generate(out, className, fields,table) {
    out.println "package com.liu.susu.entity;"
    out.println ""
    out.println "import lombok.Builder;"
    out.println "import lombok.Data;"
    out.println "import lombok.AllArgsConstructor;"
    out.println "import lombok.NoArgsConstructor;"
//    out.println "import com.fasterxml.jackson.annotation.JsonProperty;"

    out.println ""
//    out.println "import javax.persistence.Entity;"
//    out.println "import javax.persistence.Column;"
//    out.println "import javax.persistence.Table;"
//    out.println "import javax.persistence.Id;"

    out.println "import com.baomidou.mybatisplus.annotation.TableId;"
    out.println "import com.baomidou.mybatisplus.annotation.IdType;"

    out.println "import java.io.Serializable;"
    out.println "import java.math.BigDecimal;"
    out.println "import java.math.BigInteger;"

    Set types = new HashSet()

    fields.each() {
        types.add(it.type)
    }

    if (types.contains("Date")) {
        out.println "import java.util.Date;"
    }

    if (types.contains("InputStream")) {
        out.println "import java.io.InputStream;"
    }
    out.println ""
    //1.文件注释
    out.println "/**\n" +
            " * @Description "+table.getComment()+" \n" +
            " * @author susu \n" +
            " * @date " + LocalDate.now() + " \n" +
            " */"
    //2.实体注解
    out.println "@Builder"
    out.println "@Data"
    out.println "@AllArgsConstructor"
    out.println "@NoArgsConstructor"
//    out.println "@Entity"
//    out.println "@Table(name = \""+table.getName() +"\", schema = \"root\")"
    out.println "@TableName(value = \""+table.getName() +"\")"
    out.println "public class $className implements Serializable {"
    out.println genSerialID()
    fields.each() {
        out.println ""
        // 3.输出注释
        if (isNotEmpty(it.commoent)) {
//            out.println "\t/*** ${it.commoent.replaceAll("\n","")}*/"
            out.println "\t/**\n" +
                    "\t* ${it.colName}\n" +
                    "\t* ${it.commoent.replaceAll("\n","")}\n" +
            "\t*/"
        }

        //5.输出注解
        if (it.annos != "") out.println "   ${it.annos}"

        // 输出成员变量
        out.println "\tprivate ${it.type} ${it.name};"
    }

    // 输出get/set方法
    out.println ""
    out.println "}"
}

def calcFields(table) {
    def key
    DasUtil.getTableKeys(table).reduce([]) { fields, col ->
        key=col.toString().substring(col.toString().indexOf("(")+1,col.toString().indexOf(")"))
    }
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def spec = Case.LOWER.apply(col.getDataType().getSpecification())
        def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
        def comm =[
                colName : col.getName(),
                name :  javaName(col.getName(), false) ,
                type : typeStr,
                commoent: col.getComment(),
                //4.定义注解
//                annos: "\t@Column(name = \""+col.getName()+"\")  \n\t@JsonProperty(\""+col.getName()+"\")     "]
//        if("id".equals(Case.LOWER.apply(col.getName()))|(key &&key.contains(col.getName())))
//             comm.annos="\t@Id \n" + comm.annos

                annos:""]
        if("id".equals(Case.LOWER.apply(col.getName()))|(key &&key.contains(col.getName())))
            comm.annos="\t@TableId(type = IdType.ASSIGN_UUID) " + comm.annos

        fields += [comm]
    }
}

// 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
// 如果你不需要那么请查找用到了 javaClassName这个方法的地方修改为 javaName 即可)
def javaClassName(str, capitalize) {
    def s = str.split(/[^\p{Alnum}]/).collect { def s = Case.LOWER.apply(it).capitalize() }.join("")
    // 去除开头的T  http://developer.51cto.com/art/200906/129168.htm
    s = s[1..s.size() - 1]
    capitalize ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def javaName(str, capitalize) {
    def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }.join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_")
    capitalize || s.length() == 1? s.replaceAll("_","") : (Case.LOWER.apply(s[0]) + s[1..-1]).replaceAll("_","")
}

def isNotEmpty(content) {
    return content != null && content.toString().trim().length() > 0
}

static String changeStyle(String str, boolean toCamel){
    if(!str || str.size() <= 1)
        return str

    if(toCamel){
        String r = str.toLowerCase().split('_').collect{cc -> Case.LOWER.apply(cc).capitalize()}.join('')
        return r[0].toLowerCase() + r[1..-1]
    }else{
        str = str[0].toLowerCase() + str[1..-1]
        return str.collect{cc -> ((char)cc).isUpperCase() ? '_' + cc.toLowerCase() : cc}.join('')
    }
}

static String genSerialID()
{
    return "\n\tprivate static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;"
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐