1. 程式人生 > >SQL轉Java程式碼小工具

SQL轉Java程式碼小工具

工作中使用SQL的時候很多,當使用Hibernate的時候,經常遇到多行的SQL,通常在PL/SQL或其他地方寫好SQL,測試沒問題後,需要將SQL寫到程式程式碼中,多行SQL需要拼接字串,手動一行行新增很不方便,所以,既然經常會遇到,就寫個小工具來自動處理吧。

該工具使用JAVA進行開發,我上傳的程式已經打包成exe了(執行仍然需要系統有jre),原始碼會在這裡全部貼出,因為只有一個類。

先看兩個實際執行圖:

1.生成String型別,這個型別在大部分的程式語言中通用。


2.StringBuffer型別,這種型別適用於JAVA,從效能來看,這兩種型別在執行多次時,StringBuffer效率更高。


程式碼很簡單,就是兩個textarea,通過\n分割字串,然後一行行拼接。

程式碼如下:

@SuppressWarnings("serial")
public class CreateSqlWin extends JFrame {

	private JPanel contentPane;
	private JTextField txtStr;
	private JRadioButton rdbtnString;
	private JRadioButton rdbtnStringbuffer;
	private JSplitPane splitPane;
	private JTextArea newSql;
	private JTextArea oldSql;
	
	private ImageIcon ico = new ImageIcon(this.getClass().getResource("sql.png"));

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					CreateSqlWin frame = new CreateSqlWin();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public CreateSqlWin() {
		setIconImage(ico.getImage());
		setMinimumSize(new Dimension(840, 600));
		setTitle("SQL轉JAVA字串");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 842, 605);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		JPanel panel = new JPanel();
		panel.setPreferredSize(new Dimension(10, 80));
		contentPane.add(panel, BorderLayout.NORTH);
		panel.setLayout(new BorderLayout(0, 0));
		
		JPanel panel_1 = new JPanel();
		panel_1.setBorder(new LineBorder(new Color(0, 0, 0)));
		panel_1.setPreferredSize(new Dimension(300, 10));
		panel.add(panel_1, BorderLayout.CENTER);
		panel_1.setLayout(null);
		
		JLabel label = new JLabel("選擇生成方式:");
		label.setBounds(10, 10, 153, 20);
		panel_1.add(label);
		
		rdbtnString = new JRadioButton("String");
		rdbtnString.setSelected(true);
		rdbtnString.setBounds(52, 36, 79, 23);
		panel_1.add(rdbtnString);
		
		rdbtnStringbuffer = new JRadioButton("StringBuffer");
		rdbtnStringbuffer.setBounds(144, 36, 107, 23);
		panel_1.add(rdbtnStringbuffer);
		
		ButtonGroup bGroup = new ButtonGroup();
		bGroup.add(rdbtnString);
		bGroup.add(rdbtnStringbuffer);
		
		txtStr = new JTextField();
		txtStr.setText("str");
		txtStr.setBounds(313, 31, 180, 33);
		panel_1.add(txtStr);
		txtStr.setColumns(10);
		
		JLabel label_1 = new JLabel("輸入變數名:");
		label_1.setBounds(276, 13, 87, 15);
		panel_1.add(label_1);
		
		JPanel panel_3 = new JPanel();
		panel_3.setBorder(new MatteBorder(1, 0, 1, 1, (Color) new Color(0, 0, 0)));
		panel_3.setPreferredSize(new Dimension(200, 10));
		panel.add(panel_3, BorderLayout.EAST);
		panel_3.setLayout(new BorderLayout(0, 0));
		
		JButton button = new JButton("生成");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//生成SQL
				String oldSqlStr = oldSql.getText();
				if(oldSqlStr.equals("")){
					JOptionPane.showMessageDialog(CreateSqlWin.this, "請在左側輸入SQL再執行!");
					return;
				}
				//清空
				if(!newSql.getText().equals("")){
					newSql.setText("");
				}
				String valibleName = txtStr.getText();
				if(valibleName.trim().equals("")){
					JOptionPane.showMessageDialog(CreateSqlWin.this, "請輸入變數名!");
					return;
				}
				String[] sqls = oldSqlStr.split("\n");
				StringBuffer result = new StringBuffer();
				//對SQL進行拼接
				if(rdbtnString.isSelected()){
					//string形式
					for(int i=0;i<sqls.length-1;i++){
						if(result.toString().equals("")){
							result.append(valibleName+" = \" "+sqls[i]+" \"\n");
						}
						else {
							result.append(" +\" "+sqls[i]+" \"\n");
						}
					}
					result.append(" +\" "+sqls[sqls.length-1]+" \";\n");
				}
				else{
					//string形式
					for(int i=0;i<sqls.length;i++){
						result.append(valibleName+".append(\" "+sqls[i]+" \");\n");
					}
				}
				newSql.setText(result.toString());
			}
		});
		button.setFont(new Font("楷體", Font.PLAIN, 32));
		panel_3.add(button, BorderLayout.CENTER);
		
		JPanel panel_2 = new JPanel();
		panel_2.setBorder(new MatteBorder(0, 1, 1, 1, (Color) new Color(0, 0, 0)));
		contentPane.add(panel_2, BorderLayout.CENTER);
		panel_2.setLayout(new BorderLayout(0, 0));
		
		splitPane = new JSplitPane();
		splitPane.addComponentListener(new ComponentAdapter() {
			@Override
			public void componentResized(ComponentEvent e) {
				divider();
			}
		});
		panel_2.add(splitPane, BorderLayout.CENTER);
		
		JScrollPane scrollPane = new JScrollPane();
		splitPane.setLeftComponent(scrollPane);
		
		oldSql = new JTextArea();
		scrollPane.setViewportView(oldSql);
		
		JScrollPane scrollPane_1 = new JScrollPane();
		splitPane.setRightComponent(scrollPane_1);
		
		newSql = new JTextArea();
		scrollPane_1.setViewportView(newSql);
		
		JPanel panel_4 = new JPanel();
		FlowLayout flowLayout = (FlowLayout) panel_4.getLayout();
		flowLayout.setAlignment(FlowLayout.LEFT);
		panel_4.setPreferredSize(new Dimension(10, 30));
		panel_2.add(panel_4, BorderLayout.NORTH);
		
		JLabel lblsql = new JLabel("請在左側輸入你要格式化的SQL語句:");
		lblsql.setHorizontalAlignment(SwingConstants.LEFT);
		panel_4.add(lblsql);
	}
	
	public void divider(){
		splitPane.setDividerLocation(0.4);
	}
}


程式碼中用到了一張圖片,僅僅是用來顯示圖示的,可以使用任意圖片代替或者去掉相應程式碼。


程式下載:

                                      在釋出該帖之前上傳了一次,結果發現不是免費下載,需要1金幣才可以,果斷刪除重新上傳,結果就一直沒反應了。

臨時放個GOOGLE DRIVE的地址:https://docs.google.com/file/d/0ByAG1xopZV6kU3VfOGxQQU1LZjQ/edit?usp=sharing

CSDN地址徹底沒希望了,不知道是不是有什麼演算法...剛上傳的和已刪除的一樣難道就不行?

增加一個百度網盤地址:http://pan.baidu.com/share/link?shareid=181300461&uk=1325762948