首先有几点声明:
①.、代码是在别人的基础进行改写的;
//这个是做转换的类,里面的DB只是封装了数据库的连接,大家可以用自己的,随意
package com.tt.util.gen.entity.tool;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import com.tt.util.DB;
public class GenEntityMysql {
private String packageOutPath;// 指定实体生成所在包的路径
private String tablename;// 表名
private String databasename;// 数据库名
private ListString tablenames;// 拿到对应数据库中所有的实体类(实体类需要与其他表明做区分)
private ListString colnames; // 列名集合
private ListString colTypes; // 列名类型集合
private boolean f_util = false; // 是否需要导入包java.util.*
private boolean f_sql = false; // 是否需要导入包java.sql.*
/*
* 构造函数
*/
public GenEntityMysql() {
// 使用properties读取配置文件
Properties prop = new Properties();
try {
InputStream genentity = getClass().getResourceAsStream(
"/genentity.properties");
prop.load(genentity);
if (genentity != null) {
genentity.close();
}
} catch (Exception e) {
System.out.println("file " + "catalogPath.properties"
+ " not found!\n" + e);
this.databasename = prop.getProperty("databasename").toString();
this.tablename = prop.getProperty("tablename").toString();
this.packageOutPath = prop.getProperty("packageOutPath").toString();
this.authorName = prop.getProperty("authorName").toString();
// 创建多个实体类
private void genEntity(ListString tablenames, Connection conn) {
// 使用第归生成文件
for (String tablename : tablenames) {
this.genEntity(tablename, conn);
// 创建单个实体类
private void genEntity(String tablename, Connection conn) {
String sql = "select * from " + tablename;
PreparedStatement pstmt = null;
ResultSetMetaData rsmd = null;
pstmt = DB.getPStmt(conn, sql);
rsmd = pstmt.getMetaData();
int size = rsmd.getColumnCount(); // 统计列
colnames = new ArrayListString();
colTypes = new ArrayListString();
for (int i = 0; i size; i++) {
colnames.add(rsmd.getColumnName(i + 1));
colTypes.add(rsmd.getColumnTypeName(i + 1));
if (colTypes.get(i).equalsIgnoreCase("datetime")) {
f_util = true;
if (colTypes.get(i).equalsIgnoreCase("image")
|| colTypes.get(i).equalsIgnoreCase("text")) {
f_sql = true;
System.out.println(colnames);
System.out.println(colTypes);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
DB.close(pstmt);
// 在内存中生成代码
String content = parse(tablename);
// 写入到文件中
File directory = new File("");
String outputPath = directory.getAbsolutePath() + "/src/"
+ this.packageOutPath.replace(".", "/") + "/";
System.out.println("写出的路径:" + outputPath);
// 检测路径是否存在,不存在就创建路径
File path = new File(outputPath);
if (!path.exists() !path.isDirectory()) {
path.mkdir();
System.out.println(path.exists());
// 创建文件
outputPath += initcap(tablename) + ".java";
File file = new File(outputPath);
if (!file.exists()) {
file.createNewFile();
// 写出到硬盘
FileWriter fw = new FileWriter(file);
PrintWriter pw = new PrintWriter(fw);
pw.println(content);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
private void getAllEntityTable(Connection conn, ListString tablenames) {
ResultSet rs = null;
DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData();
* TABLE_CAT String = 表类别(可为 null)
* TABLE_SCHEM String = 表模式(可为null)
* TABLE_NAME String = 表名称
* TABLE_TYPE String = 表类型
rs = dmd.getTables(null, null, "%", null);
while (rs.next()) {
tablenames.add(rs.getString("TABLE_NAME"));
} catch (SQLException e) {
rs.close();
/**
*
* @param tablename
* @return
private String parse(String tablename) {
StringBuffer sb = new StringBuffer();
// 判断是否导入工具包
if (f_util) {
sb.append("import java.util.Date;\r\n");
if (f_sql) {
sb.append("import java.sql.*;\r\n");
sb.append("package " + this.packageOutPath + ";\r\n");
sb.append("\r\n");
// 注释部分
sb.append(" /**\r\n");
sb.append(" * " + tablename + " 实体类\r\n");
sb.append(" * " + new Date() + " " + this.authorName + "\r\n");
sb.append(" */ \r\n");
// 实体部分
sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");
processAllAttrs(sb);// 属性
processAllMethod(sb);// get set方法
sb.append("}\r\n");
return sb.toString();
* 功能:生成所有属性
* @param sb
private void processAllAttrs(StringBuffer sb) {
for (int i = 0; i colnames.size(); i++) {
+ colnames.get(i) + ";\r\n");
* 功能:生成所有方法
private void processAllMethod(StringBuffer sb) {
sb.append("\tpublic void set" + initcap(colnames.get(i)) + "("
+ "){\r\n");
sb.append("\t\tthis." + colnames.get(i) + "=" + colnames.get(i)
+ ";\r\n");
sb.append("\t}\r\n");
+ initcap(colnames.get(i)) + "(){\r\n");
sb.append("\t\treturn " + colnames.get(i) + ";\r\n");
* 功能:将输入字符串的首字母改成大写
* @param str
private String initcap(String str) {
char[] ch = str.toCharArray();
if (ch[0] = 'a' ch[0] = 'z') {
return new String(ch);
* 功能:获得列的数据类型
* @param sqlType
if (sqlType.equalsIgnoreCase("bit")) {
return "boolean";
} else if (sqlType.equalsIgnoreCase("tinyint")) {
return "byte";
} else if (sqlType.equalsIgnoreCase("smallint")) {
return "short";
} else if (sqlType.equalsIgnoreCase("int")) {
return "int";
} else if (sqlType.equalsIgnoreCase("bigint")) {
return "long";
} else if (sqlType.equalsIgnoreCase("float")) {
return "float";
} else if (sqlType.equalsIgnoreCase("decimal")
|| sqlType.equalsIgnoreCase("numeric")
|| sqlType.equalsIgnoreCase("real")
|| sqlType.equalsIgnoreCase("money")
|| sqlType.equalsIgnoreCase("smallmoney")) {
return "double";
} else if (sqlType.equalsIgnoreCase("varchar")
|| sqlType.equalsIgnoreCase("char")
|| sqlType.equalsIgnoreCase("nvarchar")
|| sqlType.equalsIgnoreCase("nchar")
|| sqlType.equalsIgnoreCase("text")) {
return "String";
} else if (sqlType.equalsIgnoreCase("datetime")) {
return "Date";
} else if (sqlType.equalsIgnoreCase("image")) {
return "Blod";
return null;
* 出口 TODO
* @param args
public static void main(String[] args) {
new GenEntityMysql().start();
private void start() {
// 创建连接
Connection conn = DB.getConn();
if (databasename != null !databasename.equals("")
tablename != null !tablename.equals("")) {
System.out.println("databasename 和 tablename 不能同时存在");
} else {
// 如果配置文件中有数据库名字,则可以拿到其中所有的实体类
if (databasename != null !databasename.equals("")) {
// 获取所有实体表名字
tablenames = new ArrayListString();
getAllEntityTable(conn, tablenames);
System.out.println(tablenames);
// 为每个实体表生成实体类
genEntity(tablenames, conn);
// 为指定实体表生成实体类
genEntity(tablename, conn);
// 关闭数据库连接
if (conn != null) {
DB.close(conn);
实体类,只要里面包含属性跟方法就可以了,例如public class demo{
private int age;
private String name;
}.这就是一个标准的实体类
这种情况你可以使用反射去写一个通用的方法,不过前提是你的那些实体类都是简单的包装类,稍后奉上代码.代码如下:
package?pojo;
public?class?Person?{
private?String?name;
private?int?age;
public?Person(String?name,?int?age)?{
this.name?=?name;
this.age?=?age;
public?String?getName()?{
return?name;
public?void?setName(String?name)?{
public?int?getAge()?{
return?age;
public?void?setAge(int?age)?{
public?boolean?equals(Object?o)?{
if?(this?==?o)?return?true;
if?(o?==?null?||?getClass()?!=?o.getClass())?return?false;
Person?person?=?(Person)?o;
if?(age?!=?person.age)?return?false;
return?name?!=?null?name.equals(person.name)?:?person.name?==?null;
public?int?hashCode()?{
int?result?=?name?!=?null?name.hashCode()?:?0;
return?result;
public?String?toString()?{
return?"Person{"?+
"name='"?+?name?+?'\''?+
",?age="?+?age?+
'}';
package?util;
import?pojo.Person;
import?java.lang.reflect.Field;
import?java.util.ArrayList;
import?java.util.HashMap;
import?java.util.List;
import?java.util.Map;
public?class?CompareUtilT?{
ListMap?list?=?new?ArrayListMap();
//内容没改变直接返回
return?list;
try?{
Class?c?=?Class.forName(className);
Field[]?fields?=?c.getDeclaredFields();
for?(int?i?=?0;?i?fields.length;?i++)?{
Field?field?=fields[i];
field.setAccessible(true);
Object?value1=field.get(t1);
//判断这两个值是否相等
Map?map?=?new?HashMap();
map.put("name",field.getName());
map.put("before",value1);
list.add(map);
}?catch?(ClassNotFoundException?e)?{
}?catch?(IllegalAccessException?e)?{
return?true;
return?false;
import?util.CompareUtil;
public?class?Test?{
public?static?void?main(String[]?args)?{
CompareUtilPerson?compareUtil?=?new?CompareUtilPerson();
System.out.println(compareUtil.compareT(p1,p1,Person.class.getName()));
//运行结果
[]
[{before=张三,?name=name,?after=李四}]
import java.sql.Connection; //导入Connection类
import java.sql.PreparedStatement; //导入PreparedStatement类
import java.sql.ResultSet; //导入ResultSet类
import java.util.ArrayList; //导入ArrayList类
import java.util.List; //导入List类
public class UserDao extends BaseDao { //UserDao类继承了BaseDao类
private Connection conn; //声明私有变量:Connection对象
private PreparedStatement pstmt; //声明私有变量:PreparedStatement对象
private ResultSet rs; //声明私有变量:ResultSet数据集对象
* 根据用户名和密码,查找相关用户信息
* @return Users类的对象:用户对象
public Users findUsers(String userName, String password) {
Users user = null; //声明实体类Users对象
String sql = "select * from users where userName=? and password=? "; //定义sql变量,此变量用来代替执行的SQL语句
try { //将会发生异常的代码放在了try{}catch{}块中
conn = this.getConn(); //初始化了Connection对象:conn,getConn()方法是继承自BaseDao的方法
pstmt = conn.prepareStatement(sql); //初始化PreparedStatement对象:pstmt
pstmt.setString(1, userName); //为SQL语句中的参数1设置值
rs = pstmt.executeQuery(); //用PreparedStatement的对象的executeQuery()方法初始化ResultSet对象:rs
if (rs.next()) { //如果ResultSet的next()方法返回true,则说明目标数据库中的下一行有数据
user = new Users(); //初始化Users实体类,此类准备用来初始化其域
user.setUserID(rs.getInt("userID")); //用数据库中的值初始化Users实体类中的UserID字段
user.setUserName(userName); //用数据库中的值初始化Users实体类中的UserName字段
user.setPassword(password); //用数据库中的值初始化Users实体类中的Password字段
user.setStatus(rs.getInt("status")); //用数据库中的值初始化Users实体类中的Status字段
} catch (Exception e) { //catch内使用了Exception异常根类的printStackTrace()方法:表示将错误信息打印在堆栈上
} finally { //finally块中的语句表示始终要执行的语句,并且在try语句块后执行
this.closeAll(conn, pstmt, rs); //try语句块中执行完毕或发生异常则使用closeAll()关闭所有使用到的数据库连接对象,此处省略this也可以,conn是Connection对象,pstmt是PreparedStatement对象,rs是ResultSet对象
return user; //此方法最后返回Users实体类的对象,注:如果方法定义有返回值则一定要加此关键字
* 判断数据库中当前用户名是否存在
* @param userName 用户名
* @return 存在返回true,否则返回false
public boolean findUsers(String userName){ //此方法用来查找传入的用户是否存在,返回一个布尔类型的值,true表示存在,false表示不存在
String sql = "select * from users where userName=? "; //定义SQL语句并放入sql变量中,这样的好处是简化了代码的长度和复用的便利
conn = this.getConn(); //用BaseDao类的getConn()方法初始化Connection对象:conn
pstmt = conn.prepareStatement(sql); //用Connection对象的prepareStatement()方法初始化PreparedStatement对象:pstmt
pstmt.setString(1, userName); //设置SQL语句参数1的值:userName
rs = pstmt.executeQuery(); //使用PreparedStatement对象的executeQuery()方法初始化ResultSet对象:rs
if (rs.next()) { //如果数据库中有记录则返回true,此时方法停止
return true;
e.printStackTrace(); //将错误信息打印到控制台
this.closeAll(conn, pstmt, rs); //关闭所有使用到的数据库连接对象,此处可省略this关键字
return false; //最后的返回值可以是任意布尔类型的值
* 添加用户信息
* @param userName
* @param password
* @return 操作数据库影响行数
public int insertUser(String userName, String password,int status) { //插入一个用户的方法,此方法类的参数跟数据库中强制不为空的列是一一对应的
String sql = "insert into users values(?,?,?) "; //定义SQL语句
String[] params = new String[] { userName, password ,status+""}; //定义字符串数组用来存放传入的参数,因为传入的参数可能不止一个所以定义一个字符串数组来存放,困了余下的代码都差不多所以我简单写了
return this.executeSQL(sql, params);
* 查找所有的注册用户信息
* @return 用户列表
public List selectAllUser(){
List list=new ArrayList(); //实例化一个ArrayList对象,因为ArrayList是List对象的子类
String sql = "select * from users ";
conn = this.getConn();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
Users user = new Users();
user.setUserID(rs.getInt("userID"));
user.setUserName(rs.getString("userName"));
user.setPassword(rs.getString("password"));
user.setStatus(rs.getInt("status"));
list.add(user);
this.closeAll(conn, pstmt, rs);
return list; //此方法返回一个List对象
* 根据用户ID,进行删除操作
* @param userID
* @return 执行SQL语句所影响的数据库行数
public int deleteUserByID(String userID){
String sql="delete from users where userID = ? "; //?号表示占位符号此处要用一个变量表示
String[] param = new String[]{ userID };
return this.executeSQL(sql, param);
//PreaparedStatement和Statement比较而言,PreparedStatement更适合于做修改插入的操作,应为此类是预编译的类,他的执行效率要高于Statement类.而普通的查询则使用Statement就可以了.
//ResultSet是结果集的意思,他用来存放从数据库中读取到的所有数据,他用next()方法来确定下一行是否还有数据,用返回的布尔类型值类表示.使用ResultSet对象的getXX(index)方法获取程序从数据库中读取到的值,index为参数位置,从1开始,1对应数据中第一个字段.
//Connection是连接的意思,他的PreparedStatement和createStatement分别用来初始化PreaparedStatement对象和Statement对象.为SQL语句中的参数赋值用PreparedStatement对象的setXX(index,值)方法,参数位置从1开始递增.
//List是一个接口,ArrayList是实现了List接口的类,也可以其为List的子类,所以List lst=new ArrayList();是一种编译时多态的表现,是完全允许的.其返回的是ArrayList子类的对象.ArrayList一般用来对数据的遍历查询,而LinkedList则比较擅长于增删改,他们都是集合,在此处用来存放实体类的对象.
//其实我也是一个初学者,说了这么多也许还有很多没说到的地方,当然这段代码如果要解释完全是要牵扯到很多Java知识,应为篇幅和个人精力和知识量有限,先说到这儿了,各位也请多多包涵,多多指正吧!
@Entity
@Table(name = "t_book")
public class Book implements Serializable{
@GenericGenerator(name = "generator", strategy = "uuid")
@Id
@GeneratedValue(generator = "generator")
private String uuid;
@Column(name = "t_type)
private int type;
private String naAuthor;
自己生成get set 方法
public class Test{
private String a;
public Test(){}
public static void main(String[] args){}
这是最常见的.
还有很多种.
以上就是土嘎嘎小编为大家整理的java实体类代码相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!