首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

联接MySQL数据库生成JavaBean

2012-07-24 
连接MySQL数据库生成JavaBean做网站时,感觉数据库的设计比较重要,当花了很多时间设计好数据库时,就希望有

连接MySQL数据库生成JavaBean

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

?

?

直接放出可执行的exe程序和源码了,喜欢且需要的朋友尽管拿去用。
联接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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();setTips("找不到MySQL的jar包");} catch (SQLException e) {// TODO Auto-generated catch blocke.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 blocke.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 blocke.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 blocke.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";}}}

?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)类的一个方法来获得连接对象,里面的参数表示我们连接到数据源bookdemoconn = DriverManager.getConnection(url, user, pass);} catch (ClassNotFoundException e) {// 以堆栈的方式将错误信息打印出来e.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.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)类的一个方法来获得连接对象,里面的参数表示我们连接到数据源bookdemoconn = 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 blocke.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 blocke.printStackTrace();}}}

?

热点排行