JDBC(全程Java DataBase Connectivity)
概述:
我们知道, 数据库的类型有多种 , 那么java在连接各种各样的数据库时, 直接实现好连接方式并不是最优选择, 所以java向外提供了接口 , 只需要定义好规范, 由数据库开发商来实现如何连接即可
搭建JDBC :
1. 导入对应的数据库驱动包(jar)
2. 加载mysql驱动
3. 连接到数据库
4. 发送sql到数据库
5. 关闭数据库连接通道
首先我们需要向我们的项目中导入mysql的 jar包 , 它是mysql根据jdbc规范制定的连接数据库的方式, 里面是很多的实现类, 导入让我们使用这些类来编写连接程序
这里我们没有使用maven结构, 但是jar包可以先去maven官网下载,或者mysql官网
新建lib目录 , 加入jar包 , 右键 Add as library , 右键确定, 这个jar包就可以使用了
接着我们来连接数据库, java连接mysql数据库代码如下:
public class JdbcDemo1 {
public static void methodJdbc(int index) throws ClassNotFoundException, SQLException {
// 通过java反射机制创建对象
Class.forName("com.mysql.cj.jdbc.Driver");
// 连接数据库
Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo" +
"?characterEncoding=utf8&useSSL=false&serverTimezone=UTC","root","root");
//获得Satement执行sql语句
Statement st = connection.createStatement();
//发送sql 删除id为index的一列数据
st.executeUpdate("delete from student where id= "+index);
//关闭通道
connection.close();
st.close();
}
public static void main(String[] args) {
try {
methodJdbc(5);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里我们来解释一下上面代码里的那一大长段字符串到底是什么
● 这需要使用 DriverManager.getConnection() 方法来创建一个Connection对象,它代表一个物理连接的数据库 .
● Connection conn = DriverManager.getConnection(URL,USER,PASS);
URL:jdbc:mysql://ip(127.0.0.1): 端口
(3306)/
数据库名?
characterEncoding=utf8&useSSL=false&serverTimezone=UTC
USER: 用户名
(root) PASS:密码
mysql数据库默认3306端口, 上面例子我们连接的是demo数据库
查询的例子使用demo数据库中的student表, 表如下
执行代码, 第五列被成功删除
现在我们来介绍第二种发送sql的方式 :
public class JdbcDemo2 {
public static void methodJdbc(int num,String name,String sex) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo" +
"?characterEncoding=utf8&useSSL=false&serverTimezone=UTC","root","root");
//此处采用预编译的方式,使用? 符号占位
PreparedStatement pst = connection.prepareStatement("insert into student(num,name,sex) values (?,?,?)");
// 1,2,3为 ? 的位置
pst.setInt(1,num);
pst.setString(2,name);
pst.setString(3,sex);
// 执行
pst.executeUpdate();
// 关闭通道
connection.close();
pst.close();
}
public static void main(String[] args) {
try {
methodJdbc(106,"李磊","男");
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行后 :
可见, 数据已经被成功插入
但是这两种方式有什么区别的 ?
第一种发送sql我们使用的是Statement, 第二种是PreparedStatement
通过上述两种例子我们可以看出, Statement使用的是拼接字符串的方式, 第一种我们的参数是拼接进去的, 而PreparedStatement使用预编译占位的方式
第二种看似麻烦, 但极大的提高了安全性, 预防sql注入
什么是sql注入呢?
通过上面第一种例子发送sql语句, 采用字符串拼接的方式, 如果有恶意的攻击者在我们发送的sql中再次拼接sql语句 , 例如在上述第一次例子sql后拼接 "or 1 =1"
上面 1 = 1 恒成立, 那么我们第一种例子执行后我们的表将被删的干干净净
所以这样的方式是非常不安全的
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系. 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句
所以一般我们更推荐第二种方式
关于简单的 JDBC 我们就先说到这里, 感谢阅读