框架:springboot+codemodel 自动生成实体代码
①引入codemodel的jar
<!-- https://mvnrepository.com/artifact/com.sun.codemodel/codemodel-project -->
<dependency>
<groupId>com.sun.codemodel</groupId>
<artifactId>codemodel</artifactId>
<version>2.6</version>
</dependency>
②在application.properties中配置数据源
③编写连接DB工具类
package cn.allsales.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import cn.allsales.pojo.DataBaseConfig;
/**
* 连接DB工具
* @author 橘猫
*
*/
@Component
public class DBUtil {
protected final Logger log= (Logger) LoggerFactory.getLogger(DBUtil.class);
//获取配置
@Autowired
private DataBaseConfig config;
public Connection conn = null;
public String url=null;
/**
* 获得连接
* @return
*/
public Connection getConnection() {
try {
// 注册驱动,为了兼容JVM所以才加上newInstance()
Class.forName(config.getDriver()).newInstance();
try {
url=config.getUrl();
//管理连接
conn = DriverManager.getConnection(url, config.getUsername(), config.getPassword());
} catch (SQLException e) {
log.error("connection:{}","An exception connecting to the database");
e.printStackTrace();
}
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
log.error("class.forName:{}","DRIVER ERROR,please check application.properites ");
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库连接
*/
public void closeConnection() {
if(null!=conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
log.error("close connect:{}","Close data exception");
}
}
}
}
④编写获取数据表信息接口
package cn.allsales.tools;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashSet;
import org.springframework.stereotype.Component;
import cn.allsales.pojo.TableInfoPOJO;
@Component
public class TableInfo extends DBUtil{
/**
* 通过表名获取到表的信息
* @param tableName
*/
public LinkedHashSet<TableInfoPOJO>getTableInfo(String tableName) {
//获取连接
Connection conn = getConnection();
ResultSet rs=null;
LinkedHashSet<TableInfoPOJO> set=new LinkedHashSet<>();
try {
//获取到表的元数据
DatabaseMetaData meta=conn.getMetaData();
//conn.getCatalog获取到数据库名字
rs = meta.getColumns(conn.getCatalog(), null, tableName, null);
while(rs.next()) {
TableInfoPOJO pojo=new TableInfoPOJO();
pojo.setColumnName(rs.getString("COLUMN_NAME"));
pojo.setRemarks(rs.getString("REMARKS"));
pojo.setTypeName(rs.getString("TYPE_NAME"));
set.add(pojo);
}
return set;
} catch (SQLException e) {
log.error("DataBaseMetaData:{}","Error retrieving metadata");
e.printStackTrace();
}finally {
if(null !=rs) {
try {
rs.close();
} catch (SQLException e) {
log.error("close ResultSet:{}","Close the abnormal");
e.printStackTrace();
}
}
//关闭连接
closeConnection();
}
return null;
}
}
⑤编写自动生成实体代码
package cn.allsales.tools;
import java.io.File;
import java.util.LinkedHashSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JFieldRef;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JType;
import cn.allsales.pojo.TableInfoPOJO;
import cn.allsales.tools.TableInfo;
/**
* 生成实体
* @author admin
*
*/
@Component
public class GenerateEntity {
@Autowired
private TableInfo info;
/**
* 生成实体
* @param tableName 表名
* @param aliasName 别名
* @throws Exception
*/
@SuppressWarnings("unused")
public void getGenerate(String tableName,String aliasName) throws Exception{
//创建model
JCodeModel cm = new JCodeModel();
//设置类名
JType cn=null;
if(null==aliasName) {
cn = cm.parseType(tableName);
}else {
cn=cm.parseType(aliasName);
}
//设置存放路径
File file=new File("src/main/java");
//设置存放包
JDefinedClass dc = cm._class("cn.allsales.entity."+aliasName);
//根据表名获得类成员
LinkedHashSet<TableInfoPOJO> tableInfo = info.getTableInfo(tableName);
//定义构造函数
dc.constructor(JMod.PRIVATE);
for (TableInfoPOJO pojo : tableInfo) {
String type = this.getAbilityType(pojo.getTypeName()).trim();
//定义成员
JFieldVar field = dc.field(JMod.PRIVATE, cm.parseType(type), pojo.getColumnName());
//生成javadoc
field.javadoc().add(pojo.getRemarks());
//列名首字母大写
String name=pojo.getColumnName().substring(0,1).toUpperCase()+pojo.getColumnName().substring(1);
//定义成员的get方法
JMethod method = dc.method(JMod.PUBLIC, cm.parseType(type),"get"+name);
//创建get身体
JBlock getInstanceBody = method.body();
JFieldRef fieldRef = JExpr.ref(pojo.getColumnName());
/*//添加if判断
JConditional conditionIf = getInstanceBody._if(fieldRef.eq(JExpr
._null()));
JBlock thenPart = conditionIf._then();
thenPart.assign(fieldRef, JExpr._new(cm.parseType(type),)); */
getInstanceBody._return(fieldRef);
//定义成员set方法
JMethod methodSet = dc.method(JMod.PUBLIC, cm.parseType("void"), "set"+name);
//创建set身体
JBlock body = methodSet.body();
//设置set方法参数
methodSet.param(cm.parseType(type), pojo.getColumnName());
JFieldRef ihs = JExpr.ref(pojo.getColumnName());
body.assign(JExpr.refthis(pojo.getColumnName()), ihs);
}
cm.build(file);
}
/**
* 表名
* @param tableName
* @throws Exception
*/
@SuppressWarnings("unused")
public void getGenerate(String tableName) throws Exception{
//创建model
JCodeModel cm = new JCodeModel();
//设置类名
JType cn = cm.parseType(tableName);
//设置存放路径
File file=new File("src/main/java");
//设置存放包
JDefinedClass dc = cm._class("cn.allsales.entity."+tableName);
//根据表名获得类成员
LinkedHashSet<TableInfoPOJO> tableInfo = info.getTableInfo(tableName);
//定义构造函数
dc.constructor(JMod.PRIVATE);
for (TableInfoPOJO pojo : tableInfo) {
String type = this.getAbilityType(pojo.getTypeName()).trim();
//定义成员
JFieldVar field = dc.field(JMod.PRIVATE, cm.parseType(type), pojo.getColumnName());
//生成javadoc
field.javadoc().add(pojo.getRemarks());
//列名首字母大写
String name=pojo.getColumnName().substring(0,1).toUpperCase()+pojo.getColumnName().substring(1);
//定义成员的get方法
JMethod method = dc.method(JMod.PUBLIC, cm.parseType(type),"get"+name);
//创建get身体
JBlock getInstanceBody = method.body();
JFieldRef fieldRef = JExpr.ref(pojo.getColumnName());
/*//添加if判断
JConditional conditionIf = getInstanceBody._if(fieldRef.eq(JExpr
._null()));
JBlock thenPart = conditionIf._then();
thenPart.assign(fieldRef, JExpr._new(cm.parseType(type),)); */
getInstanceBody._return(fieldRef);
//定义成员set方法
JMethod methodSet = dc.method(JMod.PUBLIC, cm.parseType("void"), "set"+name);
//创建set身体
JBlock body = methodSet.body();
//设置set方法参数
methodSet.param(cm.parseType(type), pojo.getColumnName());
JFieldRef ihs = JExpr.ref(pojo.getColumnName());
body.assign(JExpr.refthis(pojo.getColumnName()), ihs);
}
cm.build(file);
}
/**
* 转换数据类型
* @param dataBaseType
* @return
*/
public String getAbilityType(String dataBaseType) {
//为了保证一致性 一定要忽略大小写
String lower = dataBaseType.toLowerCase();
if(lower.contains("varchar") || lower.contains("text")) {
return "String";
}else if(lower.contains("int")) {
return "Integer";
}else if(lower.contains("serial")) {
return "Long";
}else if(lower.contains("double")) {
return "Double";
}else if(lower.contains("money")) {
return "BigDecimal";
}else if(lower.contains("date")) {
return "Date";
}else if(lower.contains("boolean")) {
return "Boolean";
}else {
return "String";
}
}
}
⑥测试
package cn.allsales;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import cn.allsales.tools.GenerateEntity;
@RunWith(SpringRunner.class)
@SpringBootTest
public class AllSalesApplicationTests {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driver;
@Autowired
private GenerateEntity generate;
@Test
public void contextLoads() {
try {
generate.getGenerate("tpt_address","Address");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
⑦最终结果
package cn.allsales.entity;
public class Address {
/**
* id
*
*/
private Integer id;
/**
* 用户uid
*
*/
private Integer useruid;
/**
* 姓名
*
*/
private String username;
/**
* 手机号
*
*/
private String usermobile;
/**
* 地址所属省
*
*/
private String areaId1;
/**
* 地址所属市
*
*/
private String areaId2;
/**
* 地址所属区县
*
*/
private String areaId3;
/**
* 详细地址
*
*/
private String addres;
/**
* 邮编
*
*/
private String postCode;
/**
* 是否默认地址,0:否 1:是
*
*/
private Integer isDefault;
/**
* 创建时间
*
*/
private String createTime;
private Address() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUseruid() {
return useruid;
}
public void setUseruid(Integer useruid) {
this.useruid = useruid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsermobile() {
return usermobile;
}
public void setUsermobile(String usermobile) {
this.usermobile = usermobile;
}
public String getAreaId1() {
return areaId1;
}
public void setAreaId1(String areaId1) {
this.areaId1 = areaId1;
}
public String getAreaId2() {
return areaId2;
}
public void setAreaId2(String areaId2) {
this.areaId2 = areaId2;
}
public String getAreaId3() {
return areaId3;
}
public void setAreaId3(String areaId3) {
this.areaId3 = areaId3;
}
public String getAddres() {
return addres;
}
public void setAddres(String addres) {
this.addres = addres;
}
public String getPostCode() {
return postCode;
}
public void setPostCode(String postCode) {
this.postCode = postCode;
}
public Integer getIsDefault() {
return isDefault;
}
public void setIsDefault(Integer isDefault) {
this.isDefault = isDefault;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
}