(学习参考书:Java2实用教程第5版)
编写时可以封装在一个类里面简化代码。
(1)加载JDBC-MySQL数据库驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
}
catch (Exception e){
}
(2)连接数据库
Connection con = null;//声明要连接数据库的对象com
String uri = "jdbc:mysql://localhost:3306/数据库名?useSSL=true &characterEncoding=utf-8"; //连接地址
String user = "root"; //连接数据库的用户名
String password = "123456"; //连接数据库的密码
try {
con = DriverManager.getConnection(uri,user,password);
//连接代码
}
catch(SQLException e){
}
(3)编写操作数据库中数据的代码
1,查询操作的具体步骤
(1)向数据库发送SQL语句:
Statement sql;
try{
sql = con.createStatement();
}
catch (SQLException e){
}
首先声明SQL语句对象,然后让已创建的连接对象con调用方法createStatement()
创建这个SQL语句对象。
(2)处理查询结果
有了SQL语句对象后,这个对象可以调用相应的方法实现对数据库中表的各项操作,其中查询结果存放在一个ResultSet类声明的对象中。即SQL查询语句对数据库的查询操作讲放回一个ResultSet对象,ResultSet由“列”(字段)组织的数据行构成。
rs = sql.executeQuery("select * from 表的名称");
//读取表中的所有列,*为通配符
rs = sql.executeQuery("select 行1字段名,行2字段名... from 表的名称");
//读取表中特定的列
ResultSet对象一次只能看到一行数据,使用next()方法移到下一行。ResultSet对象可以通过getXxx(int columnIndex)
获得列值和通过传递列名getXxx(String columnName)
获得列值。
(3)关闭连接
con.close(); //关闭con所连接的数据库
注意:数据库与连接对象紧密绑定,应在使用完数据库再进行关闭操作。
2,控制游标
结果集的游标的初始位置在结果集第一行的前面,结果集调用next()方法向下(后)移动游标,移动成功返回true,移动失败返回false。如果要在结果集中移动并显示若干条记录,必须返回一个滚动的结果集。方法如下:
Statement stmt = con.createStatement(int type,int concurrency);
//获得一个Statement对象,根据参数的值,stmt返回相应类型的结果集:
ResultSet re = stmt.executeQuery(SQL语句);
type的取值:决定滚动方式:
ResultSet.TYPE_FORWARD_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指定的行(参数取负数即倒数)
(3)条件与排序查询
where子语句:select 字段 from 表明 where 条件
(1)字段值与固定值比较
select * from table where name='张三'
(2)字段值在某个区间
select * from table where number>5 and number<10 and name!='李四'
(3)使用某些特殊的日期函数(Data:year-month-day)
select * from table where year(表明日期的字段名)<1980 and month(表面日期的字段名)<=10
select * from table where year(表明日期的字段名) between 2002 and 2021
(4)使用某些特殊的时间函数(hour,minute,second)
select * from timelist where second(表明时间的字段名)=36
(5)用操作符like进行模式匹配,使用%代替0个或多个字符,用一个下划线_代替一个字符。
select * from table where name like'%欧%' //查询name字段有“欧”字的记录
order by语句:可结合where语句使用
select * from table order by height
select * from table where name like '%王%' order by name
Statement对象调用public int executeUpdate(String sqlStatement);
通过参数指定的方式对数据库表中的记录的更新、添加和删除操作。
(1)更新
update 表名 set 字段 = 新值 where <条件子句>
(2)添加
insert into 表 values (对应具体的记录)
(3)删除
delete from 表名 where <条件子句>
Java提供了更高效的数据库操作机制,就是PreparedStatement对象,即预处理语句对象。将SQL语句处理为数据库底层语句,再传输给数据库。
使用通配符:对SQL进行预处理时,可以用 通配符? 来代替字段的值,只要在预处理语句执行之前再设置通配符所代表的具体值即可:
String str = "select * from 表名 where 字段1 < ? and 字段2 = ?";
PreparedStatement sql = con.prepareStatement(str);
sql.setXxx(int parameterIndex,Type x);//该方法设置?代表的值,parameterIndex代表第几个?,x代表要替换的值。
编写通用查询类,用户可以将数据库名、SQL语句传递给该类的对象,那么该对象就用一个二维数组返回查询的记录。
编写通用查询类需要知道数据库表列(字段)的名字和数量。常用方法为用结果集ResultSet对象rs调用getMetaData()
方法返回一个ResultSetMetaData对象:
ResultSetMetaData metaData = rs.getMetaData();
然后该对象metaData调用getColumnCount()
方法既可以返回rs中列的数目,调用getColumnName(int i)
就可以返回结果集rs中第i列的名字。
1,事务及处理
事务由一组SQL语句组成。所谓事务处理,是指应用程序保证事务中的SQL语句要么全部被执行,要么一个都不被执行。事务处理是保证数据库中数据完整性与一致性的重要机制。
2,JDBC事务处理
用setAutoCommit(boolean b)方法关闭自动模式:
即关闭SQL语句的即刻生效性,两个相关联的操作应该在都执行完毕后才改变数据库中的数据。方法为在获取sql对象前让连接对象调用该方法:
con.setAutoCommit(false);
用commit()方法处理事务:
关闭自动模式后,让sql对象提交多条SQL(即同一事务)语句,这些语句不会立即生效,而是直到连接对象调用方法后全部生效:
con.commit();
用rollback()方法处理事务失败:
即撤销事务所作的操作。在con调用commit()方法进行事务处理时,只要有一个SQL语句没有执行成功,那么该事务执行失败,抛出SQLException异常。这时必须让con调用rollback()方法撤销引起数据变化的所有操作:
con.rollback();