目录
1.jdbc是什么?
java database connectivity (java 连接数据库)
2.jdbc的本质是什么?
jdbc是sun公司指定的一套接口(interface) ----java,sql*;
接口都有调用者和实现者,面向接口调用,面向接口写实现类等等。
为什么要面向接口编程?
解耦合 :降低程序的耦合度,提高程序的扩展力。
java程序员不用关心 每个公司的数据库底层如何实现,只用关心jdbc接口如何实现,jdbc里面有各个公司的。class文件,数据库商家自己实现好了。只需要下载相应厂家的软件,将相应的 jar包(驱动)加载到编程软件里面。从而可以对相应的数据库进行操作。
jar包里面有一大堆,class文件,来对数据库进行具体以实现。
可以通过反射机制来创建对象
3.jdbc开发前的准备工作
下载驱动jar包,配置环境变量。
4.jdbc编程六步
1.注册驱动(作用: 告诉java程序,即将要连接的是哪个品牌的数据库)
2.获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的 通信,重量级的,使用完之后要关闭通道)
3.获取数据库操作对象(专门执行sql语句的对象)
4.执行sql语句
5.处理查询结果(只有当使用select之后才有这一步)
6.释放资源(使用完资源之后,要关闭资源)
5.代码示例
1.注册驱动:
两个Driver 1.是java.sql,Driver(这是一个java自己的一个接口)
2.是mysql公司实现的一个Driver类 在文件里面(com.mysql.jdbc.Driver)
第二个Driver是继承了第一个Driver的
代码
import java,sql.DriiverManager;
import java.sql.SQLException;
import java.sql.Driver;
public class void main(String[] args){
//1.注册驱动
try{
Driver driver=new com.sql.jdbc.Driver();//多态,父类引用指向子类对象
DriverManager.registerDriver(driver);
//2.建立连接
String url="jdbc:mysql://localhost:3306/mysql";
String user="root";
String password="123456";
Connection connection=DriverManager.getConnection(url,user,password);
//3.建立数据库操作对象
Staement statement =connection.creatStatement();
//4.书写sql语句
String sql1="Create table baby(code int(50) primary key,\n" +
"name varchar(50))";
String sql2="insert into baby(code,name) values(20,'Fang') ";
String sql3="update baby set name='Ming' where code=20";
//5.执行sql语句
statement.executeUpdate(sql1);
}catch(SQLException e){
e.printStackTrace();
}
finally{
//6.关闭连接,释放资源
statement.close;
connection.close;
}
}
查询结果集:Statement有一个方法叫做 executeQuery(sql);
该方法可以实现返回一个查询到的结果的集合Resultsetset,该方法当中还有个next()的方法可以返回一个boolean类型的值来确定该行是否有数据,该方法当中还有一个get()方法来获取改行的元素。可以通过以上接口的相关方法来实现对结果集的打印。
Resultset rs=Statement.executeQuery(sql);//获取到查询结果集
while(rs.next){
//可以通过查询结果集当中的列名来进行遍历输出
int sno=rs.getint("sno");
String sname=rs.getString("sname");
System.out.println(sno+","+sname);
}
6.Statement和PreparedStatement
Statement时创建的sql语句操作对象,在操作的时候调用其中的executeStatement(sql)方法来实现操作,并且把操作的结果返回到 Resultset当中去。
而PreparedStatement则是一个预编译的数据库操作对象。它能够提前编译要执行的sql语句,并且sql语句当中可以使用占位符来进行操作。
例如
String sql="insert into baby(code,name) values(?,?) ";
pds=conn.prepareStatement(sql);
//4.给?传值
pds.setInt(1,10);
pds.setString(2,"Fang");
//5.执行sql语句
int count=pds.executeUpdate();//这里不用传sql语句进去,因为前面与编译的时候已经把sql传进去并且执行过了
使用PreparedStatement的目的就是为了防止注入问题。
注入问题就是:用户通过输入账户名和密码的过程当中,有意的将密码里面输入一些特定的符号例如:123 or ‘1’=‘1 ’ 这样子在进行密码验证的时候,密码当中的特殊字符就参与到Statement的sql语句当中去,从而导致密码输入的不正确也可以得到一个true的返回值类型,从而破译了密码
String sql = "select * from user where username = '" + userName + "' and password = '" + password + "'";
这是一段sql语句,用来查询登陆的时候是否存在这样一个用户,当我么输入用户名或者密码的时候使用特殊的字符:123 or ‘1’=‘1 ’ 的时候,则该语句就会找到所有的user,从而破译成功。
为了避免注入问题,我们一般使用预编译的PreparedStatement
String sql = "select * from user where username = ? and password = ?";
//预编译SQL语句————提前把SQL语句编译为字符串,其中用到了转义字符防止个别符号注入SQL
PreparedStatement preparedStatement = connection.prepareStatement(sql);
System.out.println(preparedStatement);
//为占位符下标赋值
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
这样就能够有效的避免了该问题。