`

分享个MySQL数据库转换javabean的工具

阅读更多

做网站时,感觉数据库的设计比较重要,当花了很多时间设计好数据库时,就希望有一个能自动生成bean的工具,虽然Eclipse的插件能反向生成bean和hibernate的配置文件,但总感觉不够灵活,不够小到随意简单使用。但又实在不想去敲代码写一个个很多属性的bean。网上没找着现成合适的,于是就花了点时间自己写了个生成工具玩玩,也希望能给需要的朋友们一点点帮助~~

 

 

直接放出可执行的exe程序和源码了,喜欢且需要的朋友尽管拿去用。

 

MySQLToBean.java

 

package org.just.util;

import java.io.File;

/**
 * 此类用来将mysql的表直接生成Bean
 * 
 * @author childlikeman@gmail.com
 */
public class MySQLToBean extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JCheckBox checkBox;
	Properties p = new Properties();
	String configFile = "config.ini";
	private JLabel lblNewLabel_4;

	public MySQLToBean() {

		setResizable(false);

		setTitle("MySQL生成javabean小工具");
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

		setBounds(100, 100, 484, 324);

		JPanel panel = new JPanel();
		getContentPane().add(panel, BorderLayout.CENTER);
		panel.setLayout(null);

		txtLocalhost = new JTextField();
		txtLocalhost.setText("localhost");
		txtLocalhost.setBounds(146, 10, 147, 21);
		panel.add(txtLocalhost);
		txtLocalhost.setColumns(10);

		JLabel lblIp = new JLabel("IP:");
		lblIp.setBounds(80, 13, 30, 15);
		panel.add(lblIp);

		JLabel label = new JLabel("数据库:");
		label.setBounds(80, 42, 54, 15);
		panel.add(label);

		textField = new JTextField();
		textField.setBounds(146, 39, 147, 21);
		panel.add(textField);
		textField.setColumns(10);

		JLabel label_1 = new JLabel("表名:");
		label_1.setBounds(80, 127, 54, 15);
		panel.add(label_1);

		textField_1 = new JTextField();
		textField_1.setBounds(146, 124, 147, 21);
		panel.add(textField_1);
		textField_1.setColumns(10);

		JLabel label_2 = new JLabel("包名:");
		label_2.setBounds(79, 156, 54, 15);
		panel.add(label_2);

		txtComyourcom = new JTextField();
		txtComyourcom.setText("com.yourcom.bean");
		txtComyourcom.setBounds(146, 155, 147, 21);
		panel.add(txtComyourcom);
		txtComyourcom.setColumns(10);

		JLabel lblNewLabel = new JLabel("输出目录:");
		lblNewLabel.setBounds(80, 190, 65, 15);
		panel.add(lblNewLabel);

		textField_3 = new JTextField();
		textField_3.setBounds(146, 186, 147, 21);
		panel.add(textField_3);
		textField_3.setColumns(10);

		checkBox = new JCheckBox("生成包结构目录");
		checkBox.setSelected(true);
		checkBox.setBounds(145, 213, 147, 23);
		panel.add(checkBox);

		JLabel lblNewLabel_1 = new JLabel("可以指定表名,也可以不指定");
		lblNewLabel_1.setBounds(303, 127, 176, 15);
		panel.add(lblNewLabel_1);

		JLabel lblNewLabel_2 = new JLabel("* 数据库名");
		lblNewLabel_2.setForeground(Color.RED);
		lblNewLabel_2.setBounds(303, 42, 66, 15);
		panel.add(lblNewLabel_2);

		JLabel lblNewLabel_3 = new JLabel("* 包结构");
		lblNewLabel_3.setForeground(Color.RED);
		lblNewLabel_3.setBounds(303, 158, 79, 15);
		panel.add(lblNewLabel_3);

		JButton button = new JButton("执行");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				go();
			}
		});
		button.setBounds(145, 242, 93, 23);
		panel.add(button);

		textField_4 = new JTextField();
		textField_4.setText("123456");
		textField_4.setBounds(145, 93, 147, 21);
		panel.add(textField_4);
		textField_4.setColumns(10);

		txtRoot = new JTextField();
		txtRoot.setText("root");
		txtRoot.setBounds(145, 66, 148, 21);
		panel.add(txtRoot);
		txtRoot.setColumns(10);

		JLabel label_3 = new JLabel("用户名:");
		label_3.setBounds(80, 69, 54, 15);
		panel.add(label_3);

		JLabel label_4 = new JLabel("密码:");
		label_4.setBounds(80, 96, 54, 15);
		panel.add(label_4);

		lblNewLabel_4 = new JLabel("");
		lblNewLabel_4.setForeground(Color.RED);
		lblNewLabel_4.setBounds(248, 242, 204, 23);
		panel.add(lblNewLabel_4);

		addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e) {
				super.windowClosing(e);
				export();
				System.exit(0);
			}

		});

		inport();
	}

	static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private JTextField txtLocalhost;
	private JTextField textField;
	private JTextField textField_1;
	private JTextField txtComyourcom;
	private JTextField textField_3;
	private JTextField textField_4;
	private JTextField txtRoot;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		} catch (InstantiationException e) {

			e.printStackTrace();
		} catch (IllegalAccessException e) {

			e.printStackTrace();
		} catch (UnsupportedLookAndFeelException e) {

			e.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MySQLToBean frame = new MySQLToBean();
					frame.setLocationRelativeTo(null);
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	private void inport() {
		File config = new File(configFile);
		if (config.exists()) {
			try {
				InputStream is = new FileInputStream(config);
				p.load(is);
				is.close();
				setUIVal();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			try {
				config.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	public void setUIVal() {
		txtLocalhost.setText(p.getProperty("host", "localhost"));
		textField.setText(p.getProperty("database", ""));
		txtRoot.setText(p.getProperty("user", "root"));
		textField_4.setText(p.getProperty("pass", "123456"));
		txtComyourcom.setText(p.getProperty("packname", "com.youcom.bean"));
		textField_3.setText(p.getProperty("dirstr", ""));
		textField_1.setText(p.getProperty("tablename", ""));
	}

	private void export() {
		String host = txtLocalhost.getText();
		String database = textField.getText();
		String user = txtRoot.getText();
		String pass = textField_4.getText();
		String packname = txtComyourcom.getText();
		String dirstr = textField_3.getText();// 空表示当前目录
		String tablename = textField_1.getText();

		p.setProperty("host", host);
		p.setProperty("database", database);
		p.setProperty("user", user);
		p.setProperty("pass", pass);
		p.setProperty("packname", packname);
		p.setProperty("dirstr", dirstr);
		p.setProperty("tablename", tablename);

		try {
			OutputStream out = new FileOutputStream(configFile);
			p.store(out, "退出保存文件," + sdf.format(new Date()));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void setTips(String msg) {
		lblNewLabel_4.setText(msg);
	}

	public void go() {
		String host = txtLocalhost.getText();
		String database = textField.getText();

		if (database.length() == 0) {
			setTips("数据库名必填");
			return;
		}

		String user = txtRoot.getText();
		String pass = textField_4.getText();
		String packname = txtComyourcom.getText();
		String dirstr = textField_3.getText();// 空表示当前目录
		String tablename = textField_1.getText();
		boolean createPackage = checkBox.getSelectedObjects() != null;
		System.out.println(createPackage);
		if (dirstr != null && !dirstr.isEmpty()) {
			if (!dirstr.endsWith("/")) {
				dirstr += "/";
			}
		}
		File dir = new File(dirstr);
		if (createPackage) {
			dir = new File(dirstr + packname.replaceAll("\\.", "/"));
			if (!dir.exists()) {
				dir.mkdirs();
			}
		}
		String outputdir = dir.getAbsolutePath();// bean的生成目录

		Connection conn = null;
		try {

			conn = DBManager.mysql(host, database, user, pass);
			if (tablename.length() > 0) {
				parseTableByShowCreate(conn, tablename, packname, outputdir);
			} else {
				parseAllTable(conn, packname, outputdir);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			setTips("找不到MySQL的jar包");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 开始处理生成所有表 如果不传入表名,表示将数据库中所有表生成bean; 可以指定表名生成bean;
	 */
	public void parseAllTable(Connection conn, String packname, String outputdir) {

		String sql = "show tables";
		ResultSet rs = DBManager.query(conn, sql);
		try {
			while (rs.next()) {
				String tablename = rs.getString(1);
				parseTableByShowCreate(conn, tablename, packname, outputdir);
			}
			DBManager.close(conn, null, rs);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 通过 mysql的 show create table TABLE_NAME逆向生成Bean;
	 * 
	 * @param conn
	 * @param tname
	 * @param outputdir
	 * @param packname
	 */
	private void parseTableByShowCreate(Connection conn, String tablename,
			String packname, String outputdir) {
		StringBuilder classInfo = new StringBuilder("\t/**\r\n\t*");
		boolean shouldCloseConn = false;

		String sql = "show create table " + tablename;
		ResultSet rs = null;
		try {
			rs = DBManager.query(conn, sql);
			StringBuilder fields = new StringBuilder();
			StringBuilder methods = new StringBuilder();

			while (rs.next()) {
				String sqlstr = rs.getString(2);
				String lines[] = sqlstr.split("\r\n");
				for (int i = 0; i < lines.length; i++) {
					String line = lines[i];
					// System.out.println(line);
					// System.out.println("------------");
					String regex = "\\s*`([^`]*)`\\s*(\\w+[^ ]*)\\s*(NOT\\s+NULL\\s*)?(DEFAULT\\s*([^ ]*|NULL|'0'|''|CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)\\s*)?(COMMENT\\s*'([^']*)')?\\s*,\\s*";
					Pattern p = Pattern.compile(regex);
					Matcher m = p.matcher(line);
					while (m.find()) {
						String field = m.group(1);
						String type = typeTrans(m.group(2));
						String cmt = m.group(7);
						fields.append(getFieldStr(field, type, cmt));
						methods.append(getMethodStr(field, type));
						// System.out.println(field);
						// System.out.println(type);
						// System.out.println(cmt);
					}
					if (i == lines.length - 1) {
						classInfo.append("此类由" + getClass().getSimpleName()
								+ "工具自动生成\r\n");
						classInfo.append("\t*备注(数据表的comment字段):");
						int index = line.indexOf("COMMENT=");
						if (index != -1) {
							String tmp = line.substring(index + 8);
							classInfo.append(tmp.replace("'", ""));
						} else {
							classInfo.append("无备注信息");
						}
						classInfo.append("\r\n");
						classInfo
								.append("\t*@author childlikeman@gmail.com,http://t.qq.com/lostpig\r\n");
						classInfo.append("\t*@since ");
						classInfo.append(sdf.format(new Date()));
						classInfo.append("\r\n\t*/\r\n\r\n");
					}

				}

			}
			classInfo.append("\tpublic class ")
					.append(upperFirestChar(tablename)).append("{\r\n");
			classInfo.append(fields);
			classInfo.append(methods);
			classInfo.append("\r\n");
			classInfo.append("}");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {

			DBManager.close(shouldCloseConn ? conn : null, null, rs);
		}

		String packageinfo = "package " + packname + ";\r\n\r\n";
		File file = new File(outputdir, upperFirestChar(tablename) + ".java");
		System.out.println(file.getAbsolutePath());
		try {
			FileWriter fw = new FileWriter(file);
			fw.write(packageinfo);
			fw.write(classInfo.toString());
			fw.flush();
			fw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @param type
	 * @return
	 */
	private String getMethodStr(String field, String type) {
		StringBuilder get = new StringBuilder("\tpublic ");
		get.append(type).append(" ");
		if (type.equals("boolean")) {
			get.append(field);
		} else {
			get.append("get");
			get.append(upperFirestChar(field));
		}
		get.append("(){").append("\r\n\t\treturn this.").append(field)
				.append(";\r\n\t}\r\n");
		StringBuilder set = new StringBuilder("\tpublic void ");

		if (type.equals("boolean")) {
			set.append(field);
		} else {
			set.append("set");
			set.append(upperFirestChar(field));
		}
		set.append("(").append(type).append(" ").append(field)
				.append("){\r\n\t\tthis.").append(field).append("=")
				.append(field).append(";\r\n\t}\r\n");
		get.append(set);
		return get.toString();
	}

	public String upperFirestChar(String src) {
		return src.substring(0, 1).toUpperCase().concat(src.substring(1));
	}

	private String getFieldStr(String field, String type, String cmt) {
		StringBuilder sb = new StringBuilder();
		sb.append("\t").append("private ").append(type).append(" ")
				.append(field).append(";");
		if (cmt != null) {
			sb.append("//").append(cmt);
		}
		sb.append("\r\n");
		return sb.toString();
	}

	/**
	 * mysql的类型转换到java 类型参考文章
	 * http://hi.baidu.com/wwtvanessa/blog/item/9fe555945a07bd16d31b70cd.html
	 */
	public String typeTrans(String type) {
		if (type.contains("tinyint")) {
			return "boolean";
		} else if (type.contains("int")) {
			return "int";
		} else if (type.contains("varchar") || type.contains("date")
				|| type.contains("time") || type.contains("datetime")
				|| type.contains("timestamp") || type.contains("text")
				|| type.contains("enum") || type.contains("set")) {
			return "String";
		} else if (type.contains("binary") || type.contains("blob")) {
			return "byte[]";
		} else {
			return "String";
		}
	}
}

 

 

 

 

  • 大小: 11.2 KB
分享到:
评论
1 楼 hunterboyzlw 2014-12-09  
非常感谢楼主的分享,受益匪浅。

不过有我遇到了一个小问题不知道是否楼主或者其他网友也遇到了,就是乱码的问题。

楼主的代码里没有明确生成javabean的字符集,我看生成文件默认的是Chinese Simplified(GB2312),而通常大家在开发的时候用的都是utf-8。

把这段代码改一下,就ok了。

FileWriter fw = new FileWriter(file);
改为:
Writer w = new OutputStreamWriter(new FileOutputStream(file),"utf-8")。

相关推荐

    根据数据库表字段自动生成javaBean工具(支持Mysql,Oracle)

    工具能智能开启驼峰命名,将数据库中的字段名转换为JavaBean的属性名,例如将`table_name`转换为`tableName`。 3. **操作简单**: - 工具设计的目标是简化工作流程,通常只需几步就能完成JavaBean的生成。开发者...

    数据库表生成javabean工具及源代码(修正版)

    总的来说,"数据库表生成javabean工具及源代码(修正版)"是Java开发中的一个实用工具,它简化了数据模型到代码的转换过程,尤其适用于数据库驱动的应用开发。合理利用这类工具,可以优化开发流程,让开发团队更加...

    简单的jsp+servlet+javaBean访问mysql数据库

    总的来说,这个项目展示了如何利用JSP、Servlet和JavaBean的协同工作来实现对MySQL数据库的访问。这种分层架构使得代码更易于维护和扩展,同时也遵循了MVC(Model-View-Controller)设计模式的思想,即模型处理数据...

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第10版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持...

    基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v5.8.0版)

    标题中的“基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v5.8.0版)”指的是一个软件工具,它能够帮助开发者快速地根据数据库结构自动生成相关的Java代码和文档,大大提高了开发效率。这个...

    mysql自动生成javaBean和dao代码

    综上所述,这个过程利用了Java的自动化工具和XML配置,实现了从MySQL数据库到Java源代码的快速转换,极大地提高了开发效率,同时也保持了代码的规范性和一致性。在实际项目中,这样的自动化代码生成策略可以节省大量...

    Ajax Jsp 连接MySQL数据库

    在这个“Ajax Jsp 连接MySQL数据库”的主题中,我们将深入探讨如何在JSP页面上利用Ajax技术与后台MySQL数据库进行交互,同时处理多个Ajax请求。 首先,让我们了解基本概念。Ajax的核心是通过JavaScript向服务器发送...

    servlet,javabean,jsp,学生成绩管理系统,带mysql数据库.rar

    标题和描述中提到的“servlet”、“javabean”和“jsp”是Java Web开发中的关键技术,它们共同构建了一个学生成绩管理系统的后端部分,并结合了MySQL数据库来存储和管理数据。这个项目可能包含了一个完整的、基于Web...

    数据库直接生成javabean文件工具

    数据库直接生成JavaBean文件的工具是一种高效开发辅助软件,它极大地简化了开发人员从数据库模型到Java对象(JavaBean)的转换过程。这种工具能够直接连接到数据库,根据数据库中的表结构自动生成对应的JavaBean类,...

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第12版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持...

    Mysql javaBean

    在IT行业中,数据库管理和Java编程是两个至关重要的领域,它们之间的结合——`Mysql javaBean`,涉及到如何在Java应用程序中有效地操作MySQL数据库。这里,我们将会深入探讨这个主题,了解如何通过JavaBean来实现与...

    购物系统(jsp+JavaBean+mysql)

    【标题】"购物系统(jsp+JavaBean+mysql)"是一个基于Web的电子商务应用程序,它利用了JavaServer Pages(JSP)、JavaBeans以及MySQL数据库来实现一个基础的在线购物平台。这个项目旨在帮助初学者理解如何将前端界面...

    根据表结构生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第8版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,...

    jsp+mysql+javabean开发的鲤鱼论坛 BBS v1.0(附源码)

    鲤鱼论坛BBS v1.0是一个基于Java技术栈,使用JSP、MySQL数据库和JavaBean进行开发的在线讨论平台。这个系统展示了如何利用这些技术构建一个基础的Web应用程序,为用户提供发布、阅读和回复帖子的功能。以下是关于...

    根据表结构生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第9版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,...

    根据表结构生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第3版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,...

    generator-mysql根据mysql数据库生成实体类并“生成注释”

    `generator-mysql`是一个实用工具,它基于`generator-mybatis`项目,用于自动从MySQL数据库生成实体类,大大简化了开发过程,特别是在处理大量数据表时。这个工具的亮点在于它不仅生成实体类,还能够生成字段的注释...

    根据数据库表结构生成javabean的eclipse插件(免费)

    这个免费插件允许开发者轻松地从Oracle和MySQL数据库的表结构自动生成对应的Java Bean类,大大简化了数据操作层的代码编写工作。 首先,我们来看标题中的核心概念“eclipse插件”。Eclipse是一个开源的集成开发环境...

    java实体转mysql建表语句

    在Java开发中,将Java实体类转换为MySQL数据库的建表语句是一项常见的任务,它有助于快速构建数据库模型,尤其在使用ORM(对象关系映射)框架如Hibernate、MyBatis时更为便捷。本篇文章将深入探讨这个过程,并提供...

    根据表结构生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第2版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,...

Global site tag (gtag.js) - Google Analytics