2013-06-24 3 views
-2

У меня есть кадр, который имеет два textfiels и одну кнопку Сохранить,JDBC значение вставки

первое текстовое поле принимают идентификатор и второе название берут и когда я нажал на кнопку, эта информация должна быть сохранить в базе данных.

public class d4 extends JFrame implements ActionListener { 

Connection con; 
String dbName = "mydb"; 
String bdUser = "root"; 
String dbPassword = "2323"; 
String dbUrl = "jdbc:mysql://localhost/mydb"; 
JButton okButton; 
JTextField tf1; 
JTextField tf2; 
String id; 
String name; 

public d4() { 

    add(mypanel(), BorderLayout.PAGE_START); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(400, 500); 
    setLocation(300, 30); 
    setVisible(true); 
} 

public JPanel mypanel() { 
    JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
    okButton = new JButton("Ok"); 
    okButton.addActionListener(this); 
    tf1 = new JTextField(10); 
    tf2 = new JTextField(10); 
    panel.add(okButton); 
    panel.add(tf1); 
    panel.add(tf2); 
    return panel; 
} 

public static void main(String[] args) { 
    new d4(); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == okButton) { 
     id = tf1.getText(); 
     name = tf2.getText(); 
     try { 
      con = DriverManager.getConnection(dbUrl, bdUser, dbPassword); 
      System.out.println("Connected to database successfully!"); 

     } catch (SQLException ex) { 
      System.out.println("Could not connect to database"); 
     } 
     excuteQuery(id, name); 
    } 
} 

public void excuteQuery(String ID, String NAME) { 
    try { 
     Statement st1 = con.createStatement(); 
     ResultSet result1 = st1.executeQuery("select mytable"); 
     st1.execute("insert into mytable values (" + ID + "," + NAME + ")"); 


    } catch (SQLException ex) { 
     System.out.println("execute time exception"); 
     ex.printStackTrace(); 
    } 
} 
} 

Выходные:

enter image description here

Connected to database successfully! 
execute time exception 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'mytable' in 'field list' 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.Util.getInstance(Util.java:386) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568) 
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1557) 
at JDBCtest.d4.excuteQuery(d4.java:86) 
    ... 
+0

Результат ResultSet1 = st1.executeQuery ("select mytable"); о чем говорится в этом заявлении? Действительно ли это действительное заявление? – kosa

+0

@Nambari Я использую этот оператор для выбора таблицы из базы данных mydb, как ее выбрать? – Sajad

+4

Начните с удаления нечувствительного и ошибочного оператора select в 'executeQuery', затем изучите и узнайте, как и почему использовать' подготовленноеStatement', чтобы избежать угроз SQL-инъекций и других проблем, связанных с этим. –

ответ

3
  • Не забудьте кавычки

    st1.execute("insert into mytable values ('" + ID + "', '" + NAME + "')"); 
    
  • Не забудьте закрыть соединение с базой данных

    excuteQuery(id, name); 
    con.close(); 
    
  • Я предполагаю, что нет необходимости выполнять избранные перед тем

    // ResultSet result1 = st1.executeQuery("select mytable"); 
    
  • И, так как вы принимать входные данные от пользователя, вы широко открыты для инъекции SQL атаки. Используйте PreparedStatement.executeUpdate() вместо:

    Statement ps = con.prepareStatement("INSERT INTO mytable VALUES (?, ?)"); 
    
    ps.setString(1, ID); 
    ps.setString(2, NAME); 
    
    ps.executeUpdate(); 
    

    PreparedStatement будет заботиться о котировках, а также.