工作中使用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