java如何执行sql语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何执行sql语句相关的知识,希望对你有一定的参考价值。

如何向数据库中提取一个表的部分数据,计算后,再更新上去。这个是要用java语句实现还是需要个什么框架(sql语句我知道怎么写,我就是不知道如何与数据库连接)

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;


public class xxxx

public static void main(String[] args)

Connection con = null ;

Statement stmt = null ;

try

Class.forName("com.mysql.jdbc.Driver");   //mysql为例 不一样的数据库所需的驱动包不一样 连接语句略有不同 

con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/数据库名", "root", "密码");

stmt = con.createStatement();

String sql = "insert into info values ('用户', 'mima', 'piapiapia~')";

stmt.executeUpdate(sql);

catch (ClassNotFoundException e)

e.printStackTrace();

catch (SQLException e)

e.printStackTrace();

finally

try

if(stmt != null)

stmt.close();

stmt = null;

if (con != null)

con.close();

con = null;

catch (SQLException e)

e.printStackTrace();



追问

我的那个安卓的程序是平板上的,数据线连到客户机,再通过内网连到服务器,这样的也是可以连接数据库的吗

参考技术A 用jdbc,框架可以用mybatis或hibernate追问

我的那个安卓的程序是平板上的,数据线连到客户机,再通过内网连到服务器,这样的也是可以连接数据库的吗

如何在java中执行复合sql查询?

【中文标题】如何在java中执行复合sql查询?【英文标题】:How to execute composite sql queries in java? 【发布时间】:2011-10-10 01:05:12 【问题描述】:

如何执行以下查询并通过准备好的语句检索结果:

INSERT INTO vcVisitors (sid) VALUES (?); SELECT LAST_INSERT_ID();

有没有办法同时执行两条语句?

我已尝试执行以下操作:

Connection con = DbManager.getConnection();
PreparedStatement ps = con.PrepareStatement(
     "INSERT INTO vcVisitors (sid) VALUES (?); SELECT LAST_INSERT_ID();");
ps.setInt(1, 10);
ResultSet rs = ps.exequteQuery();
rs.next();
return rs.getInt("LAST_INSERT_ID()");

但它给了我一个错误,executeQuery 无法执行这样的查询, 我还尝试将 executeQuery 替换为以下内容:

ps.execute();
rs = ps.getResultSet();

但它给了我 SQL 语法错误:

You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near 'SELECT LAST_INSERT_ID()' at line 1

但是执行查询没有问题 "INSERT INTO vcVisitors (sid) VALUES ('10'); SELECT LAST_INSERT_ID();" 直接从 mysql 控制台。

【问题讨论】:

我认为这不可能。尤其是INSERTSELECT 【参考方案1】:

更新(插入)数据时使用executeUpdate 而不是executeQuery。尝试将SELECT LAST_INSERT_ID() 作为另一个查询执行。

但它不是可移植的查询。我建议改用Statement.getGeneratedKeys。请看这里:JDBC (MySQL) Retrieving AUTO_INCREMENT Column Values。

以下是正确使用 LAST_INSERT_ID() 的示例:

    Statement stmt = null;
   ResultSet rs = null;

   try 

    //
    // Create a Statement instance that we can use for
    // 'normal' result sets.

    stmt = conn.createStatement();

    //
    // Issue the DDL queries for the table for this example
    //

    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
    stmt.executeUpdate(
            "CREATE TABLE autoIncTutorial ("
            + "priKey INT NOT NULL AUTO_INCREMENT, "
            + "dataField VARCHAR(64), PRIMARY KEY (priKey))");

    //
    // Insert one row that will generate an AUTO INCREMENT
    // key in the 'priKey' field
    //

    stmt.executeUpdate(
            "INSERT INTO autoIncTutorial (dataField) "
            + "values ('Can I Get the Auto Increment Field?')");

    //
    // Use the MySQL LAST_INSERT_ID()
    // function to do the same thing as getGeneratedKeys()
    //

    int autoIncKeyFromFunc = -1;
    rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");

    if (rs.next()) 
        autoIncKeyFromFunc = rs.getInt(1);
     else 
        // throw an exception from here
    

    rs.close();

    System.out.println("Key returned from " +
                       "'SELECT LAST_INSERT_ID()': " +
                       autoIncKeyFromFunc);

 finally 

    if (rs != null) 
        try 
            rs.close();
         catch (SQLException ex) 
            // ignore
        
    

    if (stmt != null) 
        try 
            stmt.close();
         catch (SQLException ex) 
            // ignore
        
    

这里与 getGeneratedKeys 相同:

     Statement stmt = null;
   ResultSet rs = null;

   try 

    //
    // Create a Statement instance that we can use for
    // 'normal' result sets assuming you have a
    // Connection 'conn' to a MySQL database already
    // available

    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                java.sql.ResultSet.CONCUR_UPDATABLE);

    //
    // Issue the DDL queries for the table for this example
    //

    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
    stmt.executeUpdate(
            "CREATE TABLE autoIncTutorial ("
            + "priKey INT NOT NULL AUTO_INCREMENT, "
            + "dataField VARCHAR(64), PRIMARY KEY (priKey))");

    //
    // Insert one row that will generate an AUTO INCREMENT
    // key in the 'priKey' field
    //

    stmt.executeUpdate(
            "INSERT INTO autoIncTutorial (dataField) "
            + "values ('Can I Get the Auto Increment Field?')",
            Statement.RETURN_GENERATED_KEYS);

    //
    // Example of using Statement.getGeneratedKeys()
    // to retrieve the value of an auto-increment
    // value
    //

    int autoIncKeyFromApi = -1;

    rs = stmt.getGeneratedKeys();

    if (rs.next()) 
        autoIncKeyFromApi = rs.getInt(1);
     else 

        // throw an exception from here
    

    rs.close();

    rs = null;

    System.out.println("Key returned from getGeneratedKeys():"
        + autoIncKeyFromApi);
 finally 

    if (rs != null) 
        try 
            rs.close();
         catch (SQLException ex) 
            // ignore
        
    

    if (stmt != null) 
        try 
            stmt.close();
         catch (SQLException ex) 
            // ignore
        
    

【讨论】:

他特别想同时执行两个查询。【参考方案2】:

尝试:

Connection con = DbManager.getConnection();
int lastid = 0;

PreparedStatement psInsert = con.PrepareStatement(
     "INSERT INTO vcVisitors (sid) VALUES (?)");
psInsert.setInt(1, 10);
psInsert.executeUpdate();

PreparedStatement psSelect = 
    con.PrepareStatement("SELECT LAST_INSERT_ID() AS lastid");
ResultSet rs = psSelect.executeQuery();
rs.next();

lastid = rs.getInt("lastid");

rs.close();
psInsert.close();
psSelect.close();
con.close();
return lastid;

【讨论】:

是的,确实可行,但我的问题是如何一次执行多个查询 @tsds:但是两个查询总是作为两个查询运行。【参考方案3】:

正如其他人已经说过的,这行不通。但看起来您只想获取最后插入的 ID。为此,您可以使用Statement 类的getGeneratedKeys() 方法。

【讨论】:

以上是关于java如何执行sql语句的主要内容,如果未能解决你的问题,请参考以下文章

java jdbc 执行sql语句批量操作问题

如何使用 Java 执行多条 SQL 语句?

java 中如何使用sql插入语句

如何获取Oracle数据库中sql语句的执行时间

java中怎么执行sql语句

java中PreparedStatement执行带参数的sql语句如何实现模糊查询?