首先我们知道在数据库中,我们可以直接写sql或者直接通过数据库工具操作数据,但是在java程序中我们是不能直接操作数据库数据的,所以这就引入了jdbc操作。
百度百科:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果;
连接
connection 接口, 相当于连接数据库的桥梁
connection是不能实例化自己的,所以得通过实现类来实例化对象
这里就引入了DriverManager.getConnection(url,username,password) 来获取连接对象
connection conn=DriverManager.getConnection(url,username,password);//url 是连接的数据库地址,username是数据库名称,password是数据库密码
这里的conn就是我们得到的连接数据库的 "桥梁"!!!
发送 操作数据库的语句
获得conn之后我们要干嘛?肯定是写sql语句来管理我们数据库的数据啊!
这里呢 我们又引入了 statement 和PreparedStatement 这两个接口
statement
statement 也是一个接口,他的作用是通俗的来说就是实现你写的sql语句,当人因为它也是一个接口,所以我们通过conn.createStatement()来获取他的实例
例子:
Connection conn=DataUtil.getConnection();
String sql="select * from students";
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("name"));
}
通过控制台输出 从数据库students这张表中获得的 数据的name属性的值
PreparedStatement
PreparedStatement其实是statement接口的子接口,并对statement进行扩展,他的实例通过conn.preparedstatement(sql)来获得的
例子:
Connection conn=DataUtil.getConnection();
String sql="select * from students";
PreparedStatement ps=conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString("name"));
}
运行结果:
那么有同学就会问了 statement 和 preparedstatement 有什么区别啊?
网上说了好多区别,但是我看来最大的一点区别就是安全性 更好
传统的statement 来说很容易 被sql注入,安全性很差 ,那么我举个例子来说吧:
当我们在写登陆 功能时 最常用的 sql 就是:select * from table username=? and password=?
输入正确的username和password时我们就能从数据库中找出记录,并且成功登陆!
但是 当前台登陆界面 的 用户名 他随便 输一个,在密码栏 输入 任意的一个字符+空格+or 1=1 的话
后台拼接的sql就变成了 :select *from table username=随便 and password=随便 or1=1;
我们知道1=1永远都是成立的,所以 这个登陆就算我们没有用户名和密码同样也是可以进入的。
所以现在 我们开发都是用preparedstatement 来进来的,因为它不再是直接执行sql。而是进行一步预编译,预编译是不允许改变操作逻辑的,就是说你是2个参数 就是2个参数
不能再传入多的参数了,所以这里的sql注入就不会发生了!
而且因为preparedstatement存在预编译这一步,所以效率比statement接口更高,所以同学们咱们就忘记statement就可以了!