1、什么是JDBC,Java语言的连接数据库
其本质是SUN公司制定的接口,降低程序的耦合度
类似于Java语言的多态机制,即声明父类型,可以创建子对象
制定JDBC的主要原理是,通过调用数据库接口的方式来执行
也就是说现行的数据库类型过多,如果需要实现每个数据库都调用,那么在实际上需要针对不同的数据库编写不同的程序
2、在使用JDBC包的时候,需要在官网当中下载对应的驱动jar包,然后将jar包配置到环境变量当中进行调用
在使用文本编辑器进行开发时,需要在环境当中配置,创建classpath环境,将文件添加进去
在IDEA当中有独特的配置方式
3、JDBC编程六部曲
第一步:注册驱动(作用:告诉Java程序,需要执行哪个品牌的数据库)
直接用反射机制来进行执行:Class.forName(driver);
第二步:获取连接(表示JVM的进程和数据库之间构成了连接,两者可以进行交互,使用完毕之后需要关闭)
Connection conn = DriverManager.getConnection(url, user,password);
第三步:获取操作对象(针对数据库当中的谁进行操作,bjpowernode)
Statement stmt=conn.createStatement();
第四步:执行SQL语句(DQL,DML)
String sql = "delete from userformation where username = 'lishuang' ";
stmt.executeUpdate(sql);
第五步:处理查询结果集(当第四步执行了select语句之后,这里会显示查询的结果)
rs = stmt.executeQuery(sql);
rs.nest();
第六步:释放资源(当数据库资源使用完毕,或者两者之间交互完毕之后,开启的通道需要关闭)
close();
4、SQL注入现象
在执行SQL语句时,将文本当作语句去编译了,导致在实际编码时,出现了问题,例如在用户登陆系统当中
“insert into userformation(username,password) values(” + “’”+ s2[0] + “’” + “,” + “’” +s2[1].substring(0,s2[1].length()-1) + “’” + “)”;
在s2[1]里面写一个恒为真的逻辑,就会导致程序出现恒为真的情况
因此在实际编译的时候,通常都需要使用预编译
因此此时在实际开发时,顺序有所区别,预编译的主要目的还是为了方便占位符不参与运算
第一步:注册驱动(作用:告诉Java程序,需要执行哪个品牌的数据库)
直接用反射机制来进行执行:Class.forName(driver);
第二步:获取连接(表示JVM的进程和数据库之间构成了连接,两者可以进行交互,使用完毕之后需要关闭)
conn = DriverManager.getConnection(url, user,password);
第三步:获取预编译的数据库操作对象(针对数据库当中的谁进行操作,bjpowernode)
String sql = "delete from userformation where username = ? " //这里修改为?好来表示占位符
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,lishuang) //这里是从1开始的
第四步:执行SQL语句(DQL,DML)
ps.executeUpdate();
第五步:处理查询结果集(当第四步执行了select语句之后,这里会显示查询的结果)
rs = stmt.executeQuery(sql);
rs.nest();
第六步:释放资源(当数据库资源使用完毕,或者两者之间交互完毕之后,开启的通道需要关闭)
close();
5、只使用Statement也存在自己的用途,例如业务需要使用到注入现象
其次,当使用降序输出时,在sql语句当中,已经存在的字段是不需要加上’desc’的,但是预编译的时候,会自动的添加’
导致出现"desc"的现象,出现了两次单引号,导致遍历的时候,出现错误
6、在JDBC当中,存在自动提交机制,就是每写一条DML语句,都会执行,因此事务机制需要特殊的处理
也就是说,JDBC如果直接在硬盘当中进行修改了,会出现大问题
单击事务控制
在第二步的时候进行添加,conn.setAutoCommit(false);
如果没有错误在最后一步添加conn.commit();
如果有错误,conn.rollback();