• 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();
    		}
    	}
    }
  • 相关阅读:
    机房管理日记——2014/10/17
    ServletContext加入和访问
    打开系统设置
    阅读本书要瘦《面向对象的葵花宝典》札记-面向对象的基础
    Codeforces 327B-Hungry Sequence(素数筛)
    angularJS socket
    【Nginx】如何应对HTTP组态
    Android ActionBar详解(一):ActionBar概述及其创建
    Android高级图片滚动控件,编写3D版的图片轮播器
    Android自定义View的实现方法,带你一步步深入了解View(四)
  • 原文地址:https://www.cnblogs.com/winnersalp/p/3459151.html
Copyright © 2020-2023  润新知