zoukankan      html  css  js  c++  java
  • mysql表生成JavaBean

    MySQLToBean.java

    package org.just.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Properties;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    
    import javax.swing.JTextField;
    import javax.swing.JLabel;
    import javax.swing.JCheckBox;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    import java.awt.Color;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    /**
     * 此类用来将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("	/**
    	*");
    		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("
    ");
    				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()
    								+ "工具自动生成
    ");
    						classInfo.append("	*备注(数据表的comment字段):");
    						int index = line.indexOf("COMMENT=");
    						if (index != -1) {
    							String tmp = line.substring(index + 8);
    							classInfo.append(tmp.replace("'", ""));
    						} else {
    							classInfo.append("无备注信息");
    						}
    						classInfo.append("
    ");
    						classInfo
    								.append("	*@author childlikeman@gmail.com,http://t.qq.com/lostpig
    ");
    						classInfo.append("	*@since ");
    						classInfo.append(sdf.format(new Date()));
    						classInfo.append("
    	*/
    
    ");
    					}
    
    				}
    
    			}
    			classInfo.append("	public class ")
    					.append(upperFirestChar(tablename)).append("{
    ");
    			classInfo.append(fields);
    			classInfo.append(methods);
    			classInfo.append("
    ");
    			classInfo.append("}");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    
    			DBManager.close(shouldCloseConn ? conn : null, null, rs);
    		}
    
    		String packageinfo = "package " + packname + ";
    
    ";
    		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("	public ");
    		get.append(type).append(" ");
    		if (type.equals("boolean")) {
    			get.append(field);
    		} else {
    			get.append("get");
    			get.append(upperFirestChar(field));
    		}
    		get.append("(){").append("
    		return this.").append(field)
    				.append(";
    	}
    ");
    		StringBuilder set = new StringBuilder("	public void ");
    
    		if (type.equals("boolean")) {
    			set.append(field);
    		} else {
    			set.append("set");
    			set.append(upperFirestChar(field));
    		}
    		set.append("(").append(type).append(" ").append(field)
    				.append("){
    		this.").append(field).append("=")
    				.append(field).append(";
    	}
    ");
    		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("	").append("private ").append(type).append(" ")
    				.append(field).append(";");
    		if (cmt != null) {
    			sb.append("//").append(cmt);
    		}
    		sb.append("
    ");
    		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";
    		}
    	}
    }
    

     DBManager.java

    package org.just.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    //本类专门用来连接数据库,可以作为固定的工具类使用(记下来即可)
    public class DBManager {
    	// 定义一个静态的连接对象用来连接数据库
    	// private static Connection conn = null;
    	// 定一个静态的语句对象,用来执行sql语句
    	// private static Statement stmt = null;
    	// 定义一个静态的结果集对象用来存放执行sql语句后查询得到的结果
    	// private static ResultSet rs = null;
    
    	/**
    	 * 连接数据库的方法
    	 * 
    	 * @return conn 返回一个连接对象
    	 */
    	public static Connection mssql(String url, String user, String pass) {
    		Connection conn = null;
    		try {
    			// 1、加载连接驱动
    			// "jdbc:odbc:bookdemo"
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    			// 2、连接到数据库(获得连接对象)
    			// 通过连接管理器(DriverManager)类的一个方法来获得连接对象,里面的参数表示我们连接到数据源bookdemo
    			conn = DriverManager.getConnection(url, user, pass);
    		} catch (ClassNotFoundException e) {
    			// 以堆栈的方式将错误信息打印出来
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		return conn; // 将连接对象返回
    	}
    
    	/**
    	 * 连接数据库的方法
    	 * 
    	 * @return conn 返回一个连接对象
    	 * @throws ClassNotFoundException
    	 * @throws SQLException
    	 */
    	public static Connection mysql(String url, String user, String pass)
    			throws ClassNotFoundException, SQLException {
    		Connection conn = null;
    
    		// 1、加载连接驱动
    		// "jdbc:odbc:bookdemo"
    		Class.forName("com.mysql.jdbc.Driver");
    		// 2、连接到数据库(获得连接对象)
    		// 通过连接管理器(DriverManager)类的一个方法来获得连接对象,里面的参数表示我们连接到数据源bookdemo
    		conn = DriverManager.getConnection(url, user, pass);
    
    		return conn; // 将连接对象返回
    	}
    
    	/**
    	 * 动漫网的mysql数据库连接
    	 * @throws SQLException 
    	 * @throws ClassNotFoundException 
    	 */
    	public static Connection mysql(String host, String database, String user,
    			String pass) throws ClassNotFoundException, SQLException {
    		String url = "jdbc:mysql://" + host + "/" + database
    				+ "?useUnicode=true&amp;characterEncoding=UTF-8";
    		return mysql(url, user, pass);
    	}
    
    	/**
    	 * 本函数用来执行用户传入的sql语句(仅限于select语句)
    	 * 
    	 * @param sql
    	 *            传入的sql语句,等待执行
    	 * @return 返回执行sql语句后的结果集对象
    	 */
    	public static ResultSet query(Connection conn, String sql) {
    		ResultSet rs = null;
    		try {
    			// 3、通过连接对象创建一个语句对象stmt,用来执行sql语句
    			Statement stmt = conn.createStatement();
    			// 4、执行sql语句,得到一个rs(结果集对象)
    			rs = stmt.executeQuery(sql);
    		} catch (Exception e) { // 错误处理,暂时不用理会
    			e.printStackTrace();
    		}
    		return rs; // 将查询得到的结果集对象返回
    	}
    
    	/**
    	 * 本方法用来执行更新语句,并返回影响了多少行(insert,update,delete)
    	 * 
    	 * @param sql
    	 *            传入的sql语句,等待执行
    	 * @return 返回执行sql语句后的结果集对象
    	 */
    	public static int update(Connection conn, String sql) {
    		// 执行sql语句前先连接到数据库
    		Statement stmt = null;
    		int i = 0;
    		try {
    			// 通过连接对象创建一个语句对象stmt,用来执行sql语句
    			stmt = conn.createStatement();
    			// 执行更新语句,并返回影响了多少行
    			i = stmt.executeUpdate(sql);
    		} catch (Exception e) { // 错误处理,暂时不用理会
    			e.printStackTrace();
    		} finally {
    			try {
    				stmt.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		return i;
    	}
    
    	public static void close(Connection conn, Statement stmt, ResultSet rs) {
    
    		try {
    			if (rs != null) {
    				rs.close();
    				rs = null;
    			}
    			if (stmt != null) {
    				stmt.close();
    				stmt = null;
    			}
    			if (conn != null) {
    				conn.close();
    				conn = null;
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
  • 相关阅读:
    Poj 2017 Speed Limit(水题)
    Poj 1316 Self Numbers(水题)
    Poj 1017 Packets(贪心策略)
    Poj 1017 Packets(贪心策略)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2000 Gold Coins(水题)
    poj 2000 Gold Coins(水题)
  • 原文地址:https://www.cnblogs.com/winnersalp/p/3459151.html
Copyright © 2011-2022 走看看