jdbc作为一种用于执行SQL语句的Java API接口,可以为多种关系数据库提供统一访问,由Java语言编写的类和接口组成。jdbc默认的数据提交方式为自动提交,即执行一句sql语句提交一句,
1.注册驱动 通过反射机制完成
class.forName("new com.sql.cj.jdbc.Driver")//以mysql数据库为例
2.连接数据库
url地址:协议名+子协议名+数据源名
协议名为jdbc开头,子协议名以个版本数据库类型协议,数据源名为用户,数据库名等信息,高版本mysql连接需要增加时区信息
url="jdbc:mysql://localhost:3306/sys?&useSSL=false&serverTimezone=UTC" //localhost代表本机,3306为mysql默认的端口号,sys为要连接的数据库名
user="root"
password="****"//连接相应数据库的密码
Connection con=DriverManager.getConection("url","user","password");
//若要阻止自动提交
con.setAutoCommit(false);//改为手动提交模式
3.获取数据库操作对象
1.Statement
Statement st=con.createStatement();//获取数据库操作对象st
2.PreparedStatement为statement的子接口,为预编译sql语句,主要是为了防止sql注入
sql="select sname from s where snum=?"//sql语句,通过占位符替代要输入的查询
PreparedStatement pst=con.prepareStatement(sql);//预编译
pst.setString(1,12306)//将第一个占位符改为12306
4.执行sql语句
1.Statement
sql1="update s set snum='12306' where sname='张三'"
st.executeUpdate(sql1)//executeUpdate方法主要进行数据库的增删改操作
sql="select sname from s where snum='12306'"
st.executeQuery(sql)//executeQuery主要进行数据库的查询操作
2.PreparedStatement
ps.executeUpdate()
ps.executeQuery()//由于已经预编译,括号不需传参数
5.处理查询结果 ResultSet对象处理
ResultSet常用方法:
ResultSet re=st.executeQuery(sql)
while(re.next()){ //re.next()表示数据库的下一行,若不为空则ture
re.getString("拿到的列名")//可以传参拿到的列名或者是第几列的数字
}
//若是手动提交,则在事务完成后手动提交数据
con.commit();
6.关闭
从小到大依次关闭
re.close()//关闭ResultSet
st.close()//关闭statement或者PreparedStatement
con.close()//关闭connecion
7.手动提交事件回滚,若前方程序出现异常,则需事件回滚,防止有效的修改
con.rollback()
例子:
private static boolean login(HashMap a) {
// TODO Auto-generated method stub
boolean success=false;
String snum=a.get("snum");
String sname=a.get("sname");
//修改变量作用域
Connection con=null;
PreparedStatement ps=null;
ResultSet re=null;
try {
String driver="com.mysql.cj.jdbc.Driver";
Class.forName(driver);
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/sys?&useSSL=false&serverTimezone=UTC", "root","123456");
con.setAutoCommit(false);
String sql="select * from s where snum=?";
ps=con.prepareStatement("select * from s where snum=? and sname=?");
ps.setString(1, snum);
ps.setString(2, sname);
re=ps.executeQuery();
while(re.next()) {
success=true;
}
con.commit();
} catch (Exception e1) {
// TODO Auto-generated catch block
if(con!=null) {
try {
con.rollback();
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
e1.printStackTrace();
}finally {
//从小到大关闭,分别对其try catch
if(re!=null) {
try {
re.close();
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
if(con!=null) {
try {
con.close();
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
}
return success;
}