一杯茶,一包烟,一段代码歇一天……
大家好,我是找一个bug找半天的代码小白呀。
亲爱的大家,我又来分享最近新学的知识了,不得说初学者每天做学生管理系统,不断完善,不断优化,但是还是弄不完美。 今天的内容是我在拿java学习做学生管理系统的时候,用到数据库,连接数据库的时候就花了好长的时间,在对数据库增加,查询,修改,删除这一块儿又花了好长时间,在这儿分享一下,希望初学者们能学的能轻松一点,不要浪费太多的时间。
言归正传,来看看两个Statement有啥区别。
首先我们要知道,在oracle的黑框框(代码小白:嗯?黑框框是什么鬼?)不对,叫控制台,对,在那里面我们需要输入SQL语句才能对数据库的数据进行操作。
那么在java编译器怎么在连接数据库之后,执行SQL语句呢?
那么就到了Statement表现的时候了,这个类就是来处理SQL语句的。
Statement有两个处理SQL语句的方法,分别是:
1、executeUpdate()方法用来执行增加、删除、修改等操作
2、executeQuery()方法用来执行查询的SQL语句,基本返回的表都用ResultSet来进行接收。
先看怎么向数据库添加一条数据:
public void AddInfro(String sno,String name,String gender
,String dept,int age) {
try {
Connection conn = DriverManager.getConnection(url,user,password);
out.println("数据库连接成功");
Statement s = conn.createStatement();
sql = String.format("insert into s values(%s,%s,%s,%s,%d)"
, sno,name,gender,dept,age);
s.executeUpdate(sql);
conn.close();
s.close();
} catch (SQLException ex) {
out.println("数据库连接失败!");
out.println("或者关闭资源失败!");
}
}
可以使用**String.formate()方法可以来将SQL语句格式化,之后使用executeUpdate()**方法处理SQL语句。
那再看看对于相同的操作,PreparedStatement是怎么操作的。
先看代码:
public void AddInfro(String sno,String name,String gender
,String dept,int age) {
try {
Connection conn=DriverManager.getConnection(url,user,password);
out.println("数据库连接成功!");
} catch (SQLException ex) {
out.println("数据库连接失败!");
}
try {
String sql = "INSERT INTO s VALUES(?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, sno);
ps.setString(2, name);
ps.setString(3, gender);
ps.setString(4, dept);
ps.setInt(5, age);
ps.executeUpdate();
out.println("数据更新成功!");
} catch (SQLException ex) {
out.println("更新失败!");
out.println("检查数据是否已存在!");
}
}
实现PrepareStatement的时候,可以先设定有占位符“?”的SQL语句,
之后再对占位符进行赋值。仿照上面的代码,可以尝试其他的操作,比如说删除数据。
看上面的情况,好像是Statement是比较简单的。但是,看看之后的这种情况。
修改数据中两种Statement的比较:
使用Statement来处理查询的SQL语句是很麻烦的,一个字符串的设计需要很多次的连接。
public void AlterInfor(String sno,String name,String gender
,String dept,int age) {
sql = "update s set sno='"+sno+"',sname='"+name+"',sex='" +gender
+"',dept='"+dept+"',age="+age+" where sno='801'";
// sql = String.format("UPDATE s SET SNO='%s',SNAME='%s',"
// + "SEX='%s',DEPT='%s',AGE='%d' WHERE SNO='%s'"
// , sno,name,gender,dept,age,sno);
out.println(sql);
try {
conn = DriverManager.getConnection(url,user,password);
System.out.println("数据库连接成功!");
s = conn.createStatement();
int num = 0;
try {
// num = ps.executeUpdate();
num = s.executeUpdate(sql);
out.println("");
} catch (SQLException e) {
out.println("修改失败!");
}
out.println("num = " + num);
if(num == 1) {
out.println("修改成功!");
} else {
out.println("修改失败!检查正确性!");
}
conn.close();
// ps.close();
s.close();
} catch (SQLException ex) {
out.println("数据库连接失败!");
out.println("或者修改关闭资源失败!");
}
}
除了前三个注释,剩下的请自动忽略
前面SQL语句的设计需要很多次的连接,对于String字符串的连接,我们都是希望越少越好,因为使用字符串追加的话,每次都要新建一个空间,之后把两个字符串连起来,返回新的字符串。这样是很浪费时间和空间的。
下面有注释的那个SQL语句,好像也不太麻烦,但是思考一下,假如说我要改变一个参数,那么是不是就需要重新写一个SQL语句?这样是不提倡的。
那么,就是PreparedStatement施展拳脚的时候了。
我先写一段:
public void AlterInfor(String sno,String name,String gender
,String dept,int age) {
try {
conn = DriverManager.getConnection(url,user,password);
System.out.println("数据库连接成功!");
sql = "update s set sno=?,sname=?,sex=?,dept=?,age=? where sno=?";
ps = conn.prepareStatement(sql);
ps.setString(1, sno);
ps.setString(2, name);
ps.setString(3, gender);
ps.setString(4, dept);
ps.setInt(5, age);
ps.setString(6, sno);
// s = conn.createStatement();
int num = 0;
try {
num = ps.executeUpdate();
// num = s.executeUpdate(sql);
out.println("");
} catch (SQLException e) {
out.println("修改失败!");
}
out.println("num = " + num);
if(num == 1) {
out.println("修改成功!");
} else {
out.println("修改失败!检查正确性!");
}
conn.close();
ps.close();
// s.close();
} catch (SQLException ex) {
out.println("数据库连接失败!");
out.println("或者修改关闭资源失败!");
}
}
要是修改任何一个参数,只要在PreparedStatement的set的方法内修改参数即可,是不是就不用创建SQL语句了呢?
那么我们来详细的介绍一下PreparedStatement接口吧。
1、PreparedStatement是什么呢?
他是一个属于java.sql包下面的接口,特点就是能参数化处理SQL语句。
2、那么相对Statement他有什么优点呢?
(1)当创建PreparedStatement对象的时候,数据库系统对SQL语句进行预编译处理,之后可以调用setInt、setString等方法对参数进行赋值,达到一个SQL语句重复使用的目的。
(2)相比于Statement,PrepareStatement更快
因为SQL语句已经提前预编译处理过了,所以数据库处理的信息就少了很多(毕竟直接使用之前预编译的SQL语句,相比每次分析、编译、优化SQL语句更快)
(3)可以防止SQL的注入式攻击
这个点我不太懂,等我明白了再来写吧。
好了,今天写了两个小时,希望对大家有帮助。
别忘了,多多点赞,会变好看,多多留言,会变有钱呐。