1.数据库的连接方式:
①建立JDBC-ODBC桥接器
应用程序只需建立JDBC和ODBC之间的连接,和数据库的连接由ODBC完成;
优点:使得JDBC有能力访问几乎所有类型的数据库。
缺点:依赖于ODBC,移植性较差。
try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e){ System.out.println(e); }
②加载纯Java数据库驱动程序
优点:不依赖于平台。
//驱动程序由数据库厂家提供
2.建立连接:
使用java.sql.Connection类声明一个对象,再使用类DriverManager调用它的静态方法getConnection创建连接对象:
try{ Connection con=DriverManager.getConnection("jdbc:odbc:数据源名字","loginName","password"); } catch(SQLException e){}
3.查询操作:
使用Statement声明一个SQL语句对象,让连接对象con调用方法createStatement()创建SQL语句对象:
try{ Statement sql=con.createStatement(); } catch(SQLException e){}
查询结果存放于ResultSet类声明的对象中:
ResultSet rs=sql.executeQuery(SQL);
ResultSet对象的方法:
boolean next()
byte getByte(int columnIndex或String columnIndex)
Date getDate(int columnIndex或String columnIndex)
double getDouble(int columnIndex或String columnIndex)
float getFloat(int columnIndex或String columnIndex)
int getInt(int columnIndex或String columnIndex)
long getLong(int columnIndex或String columnIndex)
String getString(int columnIndex或String columnIndex)
(1)顺序查询:
①连接对象con调用getMetaData()返回一个DatabaseMetaData对象:
DatabaseMetaData metadata=con.getMetaData();
②MetaData对象再调用getColumns可以将表的字段信息以行列的形式存储在一个ResultSet对象中:
ResultSet tableMessage=metadata.getColumns(数据库名,数据库扩展名,表名,字段名);
③游标获取信息:
//游标初始位置在第1行之前
tableMessage对象调用next()使游标向下移动一行(顺序查询)
④控制游标:
Statement对象使用连接对象的createStatement(int type,int concurrency)方法可返回一个可滚动的结果集;
type的取值决定滚动方式:
ResultSet.TYPE_FORWORD_ONLY //结果集的游标只能向下滚动;
ResultSet.TYPE_SCROLL_INSENSITIVE //结果集的游标可以上下移动(当数据库变化时,当前结果集不变);
ResultSet.TYPE_SCROLL_SENSITIVE //结果集的游标可以上下移动(当数据库变化时,当前结果集同步改变);
concurrency的取值决定是否可以用结果集更新数据库:
ResultSet.CONCUR_READ_ONLY //不能用结果集更新数据库中的表;
ResultSet.CONCUR_UPDATABLE //能用结果集更新数据库中的表;
ResultSet对象的方法:
public boolean previous()
将游标向上移动,当移到结果集第一行之前时返回false;
public void beforeFirst()
将游标移动到结果集的初始位置,即在第一行之前;
public void afterLast()
将游标移到结果集最后一行之后;
public void first()
将游标移到结果集的第一行;
public void last()
将游标移到结果集的最后一行;
public boolean isAfterLast()
判断游标是否在最后一行之后;
public boolean isBeforeFirst()
判断游标是否在第一行之前;
public boolean isFirst()
判断游标是否指向结果集的第一行;
public boolean isLast()
判断游标是否指向结果集的最后一行;
public int getRow()
得到当前游标所指行的行号,行号从1开始,如果结果集没有行,返回0;
public boolean absolute(int row)
将游标移到参数row指定的行(负值为倒数的行数);
(2)排序查询:
SQL语句:SELECT * FROM 表名 ORDER BY 字段名
(3)模糊查询:
SQL语句:SELECT * FROM 表名 WHERE 字段名 LIKE '[含有的字符]%' //%代表0个或多个字符
4.更新、添加与删除操作:
更新:
SQL语句:UPDATE <表名> SET <字段名> = 新值 WHERE <条件子句>
如:UPDATE goods SET price = 3009 WHERE name='海尔电视机'
ResultSet结果集: ①结果集对象调用absolute()方法移动游标到第n行: rs.absolute(n); ②结果集对象调用以下方法更新第n行第p列的值: updateInt(String p,int x) , updateInt(int p,int x) updateLong(String p,long x) , updateLong(int p,long x) updateDouble(String p,double x) , updateDouble(int p,double x) updateString(String p,String x) , updateString(int p,String x) updateBoolean(String p,boolean x) , updateBoolean(int p,boolean x) updateDate(String p,Date x) , updateDate(int p,Date x) ③结果集对象调用updateRow()方法更新第n行记录: rs.updateRow();
添加:
SQL语句:INSERT INTO 表(字段列表) VALUES (对应的具体的记录)
如:INSERT INTO goods(number,name,madeTime,price) VALUES ('A009','手机','2010-12-20',3976)
ResultSet结果集: ①结果集对象移动游标到插入行(暂存区域): rs.moveToInsertRow(); ②结果集对象调用以下方法更新插入行的列值: rs.updateString(1,"c002"); rs.updateDate(2,Date()); rs.updateDouble(3,5356); ③结果集对象调用insertRow()方法向数据库表中插入一行新纪录: rs.insertRow();
删除:
SQL语句:DELETE FROM <表名> WHERE <条件子句>
如:DELETE FROM goods WHERE number='B002'
5.预处理语句:
//将SQL语句解释为数据库底层的内部命令,直接让数据库去执行这个命令,提高了访问数据库的速度
连接对象con调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理;
该prepareStatement对象调用的方法:
ResultSet executeQuery()
boolean execute()
int executeUpdate()
返回更新成功的条数;
对SQL进行预处理时可使用通配符"?"来代替字段的值:
预处理语句设置通配符"?"的值的常用方法:
void setDate(int parameterIndex,Date x)
void setDouble(int parameterIndex,double x)
void setFloat(int parameterIndex,float x)
void setInt(int parameterIndex,int x)
void setLong(int parameterIndex,long x)
void setString(int parameterIndex,String x)
6.事务(一组SQL语句):
事务处理:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。
①连接对象con调用setAutoCommit(boolean autoCommite)方法,将参数autoCommit取值false来关闭自动提交模式;
②连接对象con调用commit()方法让事务中的SQL语句全部生效;
③连接对象con调用rollback()方法处理事务失败,即事务中任何一个SQL语句未能生效,抛出SQLException异常,调用rollback()方法撤销事务所有的语句;
7.批处理:
Statement对象调用executeBatch()方法可以一次执行多条SQL语句;
事先让Statement对象调用addBatch(String sql)方法将要执行的SQL语句添加到该对象中;
8.CachedRowSetImpl类
//解决连接对象con关闭后,ResultSet对象中的数据消失问题(避免长时间占用数据库的连接资源)
com.sun.rowset.CachedRowSetImpl类(实现了CachedRowSet接口)
CachedRowSetImpl对象调用populate(Resultset rs)方法保存ResultSet对象中的数据:
如:ResultSet rs=sql.executeQuery(SQL); CachedRowSetImpl rowSet=new CachedRowSetImpl; rowSet.populate(rs); con.close();