JDBC学习笔记

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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值