1、什么是JDBC?
JDBC是一类接口,制定了统一访问各类关系型数据库的api,屏蔽了底层数据库的差异,可以通过JDBC API 方便地实现对各种主流数据库的操作。
2、开发步骤?
访问数据库时,首先要注册和加载数据库驱动,只需加载一次,然后在每次访问数据库时创建一个Connection实例,获取数据库连接,获取连接后,执行需要的SQL语句,最后完成数据库操作时释放与数据库间的连接。
第一步:注册加载数据库驱动
此步骤的目的是告知JVM使用的是哪一个数据库的驱动。Java加载数据库驱动的方法是调用Class类的静态方法forName(),语法格式如下:
Class.forName("com.mysql.jdbc.Driver");
第二步:获得数据库连接
加载完数据库驱动后,就可以建立数据库的连接了,需要使用DriverManager类的静态方法getConnection()方法来实现。代码如下:
Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/database_name"; String user = "root"; Strign password = "root" //建立连接 Connection conn = DriverManager.getConnection(url, user, password);
第三步:获得语句执行对象,然后执行SQL语句,获取执行结果,最后释放资源
建立了连接之后,就可以使用Connection接口的createStatement()方法来获取Statement对象,也可以调用prepareStatement()方法获得PrepareStatement对象,通过executeUpdate()方法来执行SQL语句。
String sql = "insert into user(username, sex, address) values('张三','1','北京市')"; Statement stmt = conn.createStatement(); //创建一个Statement对象 stms.executeUpdate(sql); //执行SQL语句 conn.close();
还可以使用PreparedStatement接口中的executeUpdate()方法,如下:
String sql = "insert into user(username, sex, address) values(?,?,?)"; PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1, "张三"); //为第一个问号赋值 ps.setInt(2, 1); //为第二个问号赋值 ps.setString(3, "北京市"); //为第三个问号赋值 ps.executeUpdate(); conn.close();
3、PreparedStatement与Statement区别
1.PreparedStatement在使用时只需要编译一次,就可以运行多次,Statement每运行一次就编译一次,所以PreparedStatement的效率更高
2.PreparedStatement的sql语句为用?(占位符)来替换值,Statement的sql语句为字符串拼接
3.PreparedStatement解决了sql注入的问题,Statement没有解决,因为PreparedStatement有一个预编译的过程,就算传入占位符的数据中有sql关键字也都被认为是值。Statement是字符串拼接,传入的整个字符串被默认为sql语句
SQL注入攻击:
举一个简单的例子,假设有一个登录页面,用户需要输入用户名和密码,后台使用 JDBC 执行如下 SQL 语句来验证登录:
SELECT * FROM user WHERE username='xxx' AND password='yyy';
假如攻击者在用户名处输入如下内容:
xxx' OR 1=1; --
那么最终执行的 SQL 语句就会变成:
SELECT * FROM user WHERE username='xxx' OR 1=1; --' AND password='yyy';
其中 --
表示注释掉后面的语句,此时 SQL 语句等价于:
SELECT * FROM user WHERE username='xxx' OR 1=1;
标签:语句,JDBC,数据库,SQL,笔记,学习,PreparedStatement,Statement,sql From: https://www.cnblogs.com/coooookie/p/17459869.html