【问题标题】:Issue implementing embedded Derby database in eclipse project?在 Eclipse 项目中实现嵌入式 Derby 数据库的问题?
【发布时间】:2016-05-11 12:01:36
【问题描述】:

我正在尝试创建一个表格,插入表格并使用 Derby 打印表格的内容(如下所示)。

TestProject 类

package com.user.DerbyTest;

public class TestProject {

    public static void main(String[] args) {
        DBConnection db = new DBConnection();
        db.createTable();
        db.insertIntoTable("todd", 23, 'M');
        db.insertIntoTable("wayne", 54, 'M');
        db.printAll();
    }
}

DBConnection 类

package com.user.DerbyTest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DBConnection {
    private static final String DRIVER = "org.apache.derby.jdbc.*";
    private static final String JDBC_URL = "jdbc:derby:derbytest;create=true";

    Connection conn;

    public DBConnection(){
        try {
            this.conn = DriverManager.getConnection(JDBC_URL);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (this.conn != null){
            System.out.println("Connected to database.");
        }
    }

    public void createTable(){
        try {
            conn.createStatement().execute("Create TABLE MyDerbytable(Name varchar(50), Age INT, Gender char(1))");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public void insertIntoTable(String name, int age, char gender){
        try {
            conn.createStatement().execute("INSERT INTO MyDerbytable Values ("+name+","+age+","+gender+")");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void printAll(){
        try {
            Statement statement = this.conn.createStatement();
            ResultSet res = statement.executeQuery("Select * FROM MyDerbytable");

            while(res.next()){
                System.out.println(res.getString("Name") + res.getString("Age") + res.getString("Gender"));
            }


        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}

在尝试运行此程序时,我遇到了一大堆错误:

有什么想法吗?

编辑:更改为 DROP 错误:

【问题讨论】:

    标签: java sql eclipse derby


    【解决方案1】:

    您的桌子已经退出。试试 DROP TABLE myderbytable;

    【讨论】:

      【解决方案2】:

      您的第一个 INSERT 语句最终将是:

      INSERT INTO MyDerbytable Values (todd,23,M)
      

      toddM 值周围没有引号,因此被视为对列名的引用,从而为您提供所看到的错误。您必须将这样的文字值用单引号括起来:

      INSERT INTO MyDerbytable Values ('todd',23,'M')
      

      所以你的插入代码可能是:

      "INSERT INTO MyDerbytable Values ('"+name+"','"+age+"','"+gender+"')"
      

      (注意多余的 ' 字符)。

      但是像你这样连接字符串会让你对SQL Injection Attacks敞开大门。如果您的任何输入包含引号字符,它也会给您带来问题。了解如何使用PreparedStatement

      【讨论】:

      • 我使用引号?当我将“todd”更改为“todd”时,我收到“无效字符常量”错误。我更担心只是让这个准系统工作而不是其他任何事情
      • 不,您没有使用引号。不要将 Java 字符串的引号与 Derby 所需的引号混淆。添加了示例代码来回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2015-10-19
      • 1970-01-01
      • 2018-05-14
      相关资源
      最近更新 更多