关于Java连接数据库的问题。

    这两天帮同学做了一个小的信息管理系统,并没有多复杂,类似一个小实验。其中有些问题需要自己总结一下。

    (1)建立工程

      这是一个显而易见的事情,但是由于使用的自己不熟悉的软件DRJava,所以一开始并没有建立工程,而是直接新建的类。没有工程,会导致不能导入外部文件。放一个链接说明这个问题。这也是我在DRJava中不能导入jar包时参考的内容。

    (2)连接数据库时写数据库文件的绝对路径



/*数据库操作类*/
public class SQLiteJDBC {
  private Connection c = null;
  private Statement stmt = null;//执行的sql语句
  
  //构造函数连接数据库
  public SQLiteJDBC(){
    try {
      Class.forName("org.sqlite.JDBC");
      //路径为数据库的绝对路径
      c = DriverManager.getConnection("jdbc:sqlite:H:\\实验\\Java\\Database.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
  }
}

    (3)java中SQL语句

      一定要注意,在java中,以数据库中的字符串(char/text)类型为形式参数,在SQL语句中要加英文单引号、英文双引号和加号。说的不是很清楚,以以下代码为例。

//增加信息调用的函数
  public boolean add(String name,String type,String color,String paytype,int price,int dressup){
    boolean result;
    int i = 0;
     try { 
       //System.out.println(name+type+color+paytype+price+dressup);
       stmt = c.createStatement();
       String sql_add = "INSERT INTO QQ_Car_Custom_Info(名称,类型,颜色,支付方式,价格,装扮度) VALUES( '" + name + " ','" + type + " ','" + color + " ','" + paytype + " '," + price + " ," + dressup + ");" ;
       i = stmt.executeUpdate(sql_add);
       c.commit();    
       
       if(i >= 1){
         System.out.println("Records created successfully");
         result = true;
       }else
         result = false;
     } catch ( Exception e ) {
       System.err.println( e.getClass().getName() + ": " + e.getMessage() );
       System.exit(0);
       result = false;
     }finally{
       if(stmt != null){try{stmt.close();}catch(Exception ex1){}}
       if(c != null){try{c.close();}catch(Exception ex2){}}
     }
     return result;
   }

    (4)在数据库中插入文字

      使用getText( )方法获取JTextField中的文字(或者可以说是字符串类型),再添加到数据库中,会有一个英文空格。我猜测是因为java中的字符串类型会自动添加'\0',而在数据库中'\0'表现为英文空格。

    (5)返回值为数据库中的数据

      数据库中返回的数据类为ResultSet,但是该数据会随着与数据库连接的关闭而消失,所以需要持久化。我使用的是HashMap和ArrayList的结合。将数据库中的每行数据以数据名称和数据内容的形式放置到HashMap<String,Stirng>中,然后将HashMap放到ArrayList中,返回值为ArraList。以以下代码为例。

//查找信息函数,返回查找到的结果集
  public ArrayList findResult(String name){
     ArrayList list = new ArrayList(); 
     HashMap<String,String> hm = new HashMap<String,String>();
     ResultSet rs = null;
     try {
       stmt = c.createStatement();
       String sql_find = "SELECT * FROM QQ_Car_Custom_Info WHERE 名称 = '" + name + " ';" ;
       rs = stmt.executeQuery(sql_find);
       
       while( rs.next() ){
         hm.put("名称",rs.getString("名称"));
         hm.put("类型",rs.getString("类型"));
         hm.put("颜色",rs.getString("颜色"));
         hm.put("支付方式",rs.getString("支付方式"));
         hm.put("价格","" + rs.getInt("价格"));
         hm.put("装扮度","" + rs.getInt("装扮度"));
       }
       list.add( hm );
       
       c.commit();       
       System.out.println("Records finded successfully");
     } catch ( Exception e ) {
       System.err.println( e.getClass().getName() + ": " + e.getMessage() );
       System.exit(0);
     }finally{
       if(rs != null){try{rs.close();}catch(Exception ex1){}}
       if(stmt != null){try{stmt.close();}catch(Exception ex1){}}
       if(c != null){try{c.close();}catch(Exception ex2){}}
     }
     return list;
  }

      获取数据直接使用hm =(HashMap) list.get(0)获取list中的第一条数据,list.get(1)获取list中的第二条数据,以此类推。此方法涉及强制转换。再通过hm.getString("类型")获取对应数据名称的内容。getString()为获取字符串类型,getInt()获取整型,以此类推。这是我在遇到持久化的问题时参考的内容。