1.JDBC
保证java编写的程序的独立性:java提供专门用于操作数据库的API,即JDBC
JDBC操作不同的数据库原因->连接方式不同
使用JDBC进行的操作
与一个数据库建立连接
向已连接的数据库发送SQL语句
处理SQL语句返回的结果
2.连接数据库
程序和数据库交互信息
A.与数据库建立连接
a.加载JDBC-数据库驱动
b.和指定的数据库建立连接
(a)下载数据库驱动
(b)加载数据量驱动
try{Class.forName(“com.mysql.jdbc.Driver”);}catch(Exception e){} 其中jdbc.Driver是驱动程序名
(c)连接数据库
DriverManager类中有两个建立连接的类方法
Connection getConnection(java.lang.String,java.lang.String,java.lang.String)
Connection getConnection(java.lang.String)
Connection con;
String uri=“jdbc:mysql://IP地址:端口/数据库名?useSSL=ture”
Connection con;
String uri=“jdbc:mysql://IP地址:端口/数据库名?user=用户名&password=密码&useSSL=ture”
user=“用户名”
password=“密码”
try{con=DriverManager.getConnection(uri,user,password);}
catch(SQLException e){System.out.println(e)}
try{con=DriverManager.getConnection(uri)}
catch(SQLException e){System.out.println(e)}
DriverManager. getConnection(java.lang.String)返回一个Connection对象
(d)主注意汉字问题
String uri=“jdbc:mysql://IP地址:端口/数据库名?useSSL=ture&characterEncoding=utf-8”
3.查询操作
3.1向数据库发送SQL查询语句
sql为SQL语句对象
try{Statement sql=con.createStatement();}catch(SQLException e){}
3.2处理查询结果
rs存放查询结果(rs由按“列”(字段)组织的数据行构成)
ResultSet rs=sql.executeQuery(“Select语句”)
Result对象一次只能看到一个数据行,使用next()方法移到下一个数据行
rs.getXxx(int columnIndex(位置索引))// rs.getXxx(int columnName(列名))《=》获得字段值(列值)
3.3关闭连接
应用程序在使用ResultSet对象中的数据时,就必须保持和数据库的连接
con.close()
4.1顺序查找
Result对象一次只能看到一个数据行,使用next()方法移到下一个数据行,next()方法最初的查询位置为游标位置,位于第一行的前面
4.2控制游标
结果集的游标的初始位置在结果集第一行的前面,使用next()方法向下(后)移动游标,移动成功返回true
返回一个滚动的结果集
Statement stmt=con.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 re=stmt.executeQuery(SQL语句);
public boolean previous()
将游标上下移动,返回boolean型数据,当移到结果集的第一行之前时返回false
public void beforeFirst()/afterLast()
将游标移到结果集的初始位置,即第一行之前
/将游标移到结果集最后一行之后
public void first()/last()
将游标移到结果集第一行/最后一行
public boolean isAfterLast()/isBeforeFirst()
判断游标是否在最后一行之后/第一行之前
public boolean isLast()/isFirst()
判断游标是否在最后一行/第一行
public int getRow()
得到当前游标所指向的行号,行号从1开始,如果结果没有行,返回0
public boolean absolute(int row)
将游标移到参数row指定的行(row为负值时表示倒数)
4.3条件与排序查询
where子语句 一般格式;select 字段 from 表名 where 条件
a.字段值与固定值比较:=
b.字段值在某个区间的范围:and
c.使用某些特殊的日期函数,如year、month、day
select * from mess where year(birthday)<1980 and month(birthday)<=10
d.使用某些特殊的时间函数,如hour、minute、second
select * from time_list where second(shijian)>56
e.用操作符like进行模式匹配,%:多个字符、_:一个字符
排序:order by +排列的标准
5.更新、添加与删除操作
Statement对象调用方法:public int executeUpdate(String sqlStatement);通过参数sqlStatement指定的方式实现对数据库表中的更新、添加和删除操作。
更新
update 表 set 字段 = 新值 where <条件子句>
添加
insert into 表(字段列表)values(对应具体记录)
删除
delete from 表名 where <条件子句>
6.1使用预处理语句
优点:减轻数据库的负担,提高访问数据库的速度
con.prepareStatement(String sql)
对参数sql指定的SQL语句进行预编译处理
生成该数据库底层的内部命令,并将命令封装在PrepareStatement对象中
对象调用
ResultSet executeQuery()
boolean execute()
int executeUpdate()
6.2使用通配符
通配符?代替字段的值,用数字1代表第一个?,2代表第二个?
预处理语句执行之前设置通配符的具体值
预处理语句设置通配符?的值的常用方法:
void setDate/setDouble/setFloat/setInt/setLong/setString(int parameterIndex,Date/double/float/int/long/String x)
7.通用查询
ResultSetMetaData metaData=rs.getMetaData()
得到一个对象
int columnCount = metaData.getColumnCount()
列的数目
String columnName = metaData.getColumnName(i)
第i列的名字
8.事务
保证数据库的完整性与一致性
事务处理即应用程序保证事务中的SQL语句要么全部执行,要么一个都不执行
JDBC事务处理步骤
用setAutoCommit(boolean b)关闭自动提交模式
关闭con这种自动提交模式
commit()处理事务
视图让事务中所有的SQL语句生效
rollback()处理事务失败
恢复到commit()方法执行之前