关于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()获取整型,以此类推。这是我在遇到持久化的问题时参考的内容。