在mysql查询中传递java字符串变量

时间:2014-07-09 03:22:31

标签: java sql

如何在sql查询中传递java字符串变量。我已完成所有JDBC连接。

我的sql数据库查询是

sql = "Select * 
       from production AS cust 
       INNER JOIN location AS comp 
       ON cust.location_id = comp.location_id 
       where comp.name = locationnames AND crop_id =1";

它不起作用。但是,如果我执行以下代码,它的工作

sql = "Select * 
       from production AS cust 
       INNER JOIN location AS comp 
       ON cust.location_id = comp.location_id 
       where comp.name = "\taplejung"\  
       AND crop_id =1";

现在告诉我如何将变量名传递给sql查询来执行此操作。 Jst告诉我如何将变量locationnames传递给comp.name。

我的完整java函数如下所示:locationCombo表示在组合框中选择的项目。 CropCombo也表示相同......

public void displayYearwise() throws SQLException, ClassNotFoundException{

       //jComboBox4.setSelectedItem("Crops");
        //DefaultCategoryDataset dataset = new DefaultCategoryDataset();
         XYSeriesCollection dataset = new XYSeriesCollection();
         XYSeries series = new XYSeries("production");
         XYSeries series1 = new XYSeries("scat");
        String JDBC_DRIVER="com.mysql.jdbc.Driver";
    String DB_URL="jdbc:mysql://localhost/data2";
    Connection conn;
    Statement stmt;
    String USER = "root";
    String PASS = "";
        Object cropname = CropCombo.getSelectedItem();
       String cropnames = cropname.toString();
       Object locationname = locationCombo.getSelectedItem();
       //       String locationnames = locationname.toString();
       String locationnames = "taplejung";
       String pd="paddy ";
            System.out.println(cropnames.length()+" "+pd.length());

            System.out.println(cropsList);
         String sql=null;
         if(cropnames.equals("paddy"))
         {
             //System.out.println();                     
             sql="Select * 
                  from production AS cust 
                  INNER JOIN location AS comp 
                  ON cust.location_id = comp.location_id 
                  WHERE comp.name = "+locationnames+" 
                  AND crop_id =1";
         }


          else{
          sql="SELECT * 
               FROM `production` 
               WHERE crop_id = 4 
               AND location_id = 10";
         }

           try{
            Class.forName(JDBC_DRIVER);
            conn=DriverManager.getConnection(DB_URL,USER,PASS);
            System.out.println("Creating statement...");
            stmt = conn.createStatement();                       
                       System.out.println(sql);            
                         ResultSet rs=stmt.executeQuery(sql);                      
                        while (rs.next()){
                            //String student = rs.getString("studentname");
                            String yeartext = rs.getString("year_of_production");
                            //double value = Double.parseDouble(text);
                            String productiontext = rs.getString("production_amount");
                            Double yield = rs.getDouble("yield_amount");
                            double production = Double.parseDouble(productiontext);
                            double year = Double.parseDouble(yeartext);
                            series.add(year,production) ;
                            series1.add(year,yield) ;
                            //dataset.addSeries(series);              
             }
                        dataset.addSeries(series);
                        dataset.addSeries(series1);     
                        chartArea.removeAll();
                       JFreeChart chart = ChartFactory.createScatterPlot("Scatter Plot","Year","Paddy Production", dataset);
                       // JFreeChart chart = ChartFactory.createScatterPlot("Scatter Plot","Year","Paddy Production", dataset, PlotOrientation.HORIZONTAL, rootPaneCheckingEnabled, rootPaneCheckingEnabled, rootPaneCheckingEnabled);
//                        CategoryPlot p = chart.getCategoryPlot();
                         //XYPlot xyplot = (XYPlot)jfreechart.getPlot();
                        //http://stackoverflow.com/questions/12417732/jfreechart-with-scroller
                        ChartPanel chartPanel = new ChartPanel(chart, false);
                        chartArea.setLayout(new BorderLayout());
                        chartArea.add(chartPanel, BorderLayout.EAST);
                        chartArea.add(chartPanel);
                        SwingUtilities.updateComponentTreeUI(this);
//                        p.setRangeGridlinePaint(blue);
                        chartArea.updateUI();
                        System.out.println("Database created successfully...");

                }
           catch(SQLException se)
                {
                    //Handle errors for JDBC
                    System.out.println("Connect failed ! ");
                    se.printStackTrace();
//                    JOptionPane.showMessageDialog(MajorUI.this, err.getMessage());
                    }

    }

4 个答案:

答案 0 :(得分:5)

String locationnames = "taplejung";

String sql = "Select * from production AS cust INNER JOIN location AS comp ON cust.location_id = comp.location_id where comp.name ='"+ locationnames +"' AND crop_id =1";

答案 1 :(得分:5)

使用PreparedStatement并绑定String参数

final String sql = "select * from production AS cust INNER JOIN location"
    + " AS comp ON cust.location_id = comp.location_id where "
    + "comp.name = ? AND crop_id = 1";
PreparedStatement ps = null;
try {
  ps = conn.prepareStatement(sql);
  ps.setString(1, "taplejung");
} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (ps != null) {
    try {
      ps.close();
    } catch (Exception ignored) {
    }
  }
}

修改(根据您的其他代码,将其更改为类似的内容)

PreparedStatement ps = null;

String sql = null;
if (cropnames.equals("paddy")) {
  // System.out.println();
  sql = "SELECT * FROM `production` AS cust INNER JOIN location AS comp "
      + "ON cust.location_id = comp.location_id WHERE comp.name = "
      + "? AND crop_id = 1";
} else {
  sql = "SELECT * FROM `production` WHERE crop_id = 4 AND location_id = 10";
}
ps = conn.prepareStatement(sql);
if (cropnames.equals("paddy")) {
  ps.setString(1, locationnames);
}
System.out.println(sql);
ResultSet rs = ps.executeQuery();

答案 2 :(得分:0)

每当我必须进行sql查询时,我都会使用像jdbi这样的库来完成它。这将允许您创建具有不同查询的界面。您所要做的就是定义接口,创建POJO,并在SQL表和Java POJO之间创建映射器。

界面看起来像这样。

@RegisterMapper(ProductionMapper.class)
public interface ProductionDAO {
     @SqlQuery("Select * from production AS cust INNER JOIN location AS comp ON cust.location_id = comp.location_id where comp.name = :name AND crop_id =1")
     Production findRow(@Bind("name") String name);
    } 

POJO看起来像这样。

public class Production {
   private VariableTypeA variableA;
   // other variables
   public Production(VariableTypeA variableA ....) {
      this.variableA = variableA;
      // set everything else
   }
   // getters and setters
}

映射器看起来像这样。

public class ProductionMapper implements ResultSetMapper<Production> {
  public Production map(int index, ResultSet r, StatementContext ctx) throws SQLException {
    return new Production(r.getSomeType("columnName"), ...);
  }
}

这种设计使得与数据库交互并传递变量以及使您的类不违反SRP非常简单

http://jdbi.org/sql_object_overview/

答案 3 :(得分:0)

使用java在mysql查询中传递变量很简单。

  • 撰写您的查询
  • 并在“”
  • 中写入变量
  • 在我的情况下,我动态地传递'conition'和'tablename'。
  • 非常感谢你有一个美好的一天。

    @覆盖 public LinkedList getNameList(String condition,String tableName,String projectName){     // TODO自动生成的方法存根

    String query = "select distinct("+condition+") as name  from "+tableName+" ";
    
    //System.out.println(query);
    
    ResultSet rs = null;
    PreparedStatement preparedStatement = null;
    Connection connection = null;
    
    LinkedList finalList = new LinkedList();
    try{
        connection = dataSourceAbacus.getConnection();
        preparedStatement = connection.prepareStatement(query);
        rs= preparedStatement.executeQuery();
        while(rs.next()){
    
            finalList.add(rs.getString("name"));
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        if(connection !=null){
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(preparedStatement != null){
            try{
                preparedStatement.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        if(rs != null){
            try{
                rs.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    
    return finalList;
    

    }