一、JDBC介绍
JDBC,Java DataBase Connectivity,Java的数据库连接。
JDBC,本质上是由sun公司开发的一套操作数据库的接口(规范),各个数据库厂商要想使用Java连接自己的数据库,都必须按照JDBC接口的规范提供实现类。
1、JDBC快速入门
1.1、 创建Java工程,并导入jar包【驱动包】
JAR 文件就是 Java Archive File,是 Java 的一种文件格式。
JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以又叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件(详情单),这个文件是在生成 JAR 文件的时候自动创建的。
新建一个java工程,并在java工程下面创建lib目录
将mysql-connector-java-5.1.47.jar包拷贝到java工程的lib目录下
右击lib目录下面的jar包----添加到Build Path
注册驱动
其实就是将核心驱动类加载到内存中
Class.forName(“com.mysql.jdbc.Driver”);
1.2、 获取数据库连接
Connection con = DriverManager.getConnection(url,username,password);
参数就是数据库的信息
1.3、 编写sql语句
String sql = “insert into user values(null,”王五”,20,”1990-01-01”,18765.00)”;
1.4、 获取执行sql语句的Statement对象
Statement statement = con.createStatement();
1.5、 执行sql,接收返回结果
执行DML语句,使用executeUpdate方法
执行DQL语句,使用executeQuery方法
1.6 释放资源
释放数据库连接
释放Statement对象
二、JDBC 执行DQL语句
DQL语句,就是查询语句,JDBC通过executeQuery方法执行查询语句
说明:
JDBC执行DQL语句返回一个结果集(集合),需要从结果集中通过next()方法取数据
使用while循环进行优化
三、JDBC工具类封装(一)
目的:
将JDBC操作中相同的、重复的代码提取出来,就不用每次都写这些重复的代码了
要求:
1.当类被加载完毕时,就将mysql的驱动加载到内存中
2.希望能够将数据库信息(数据库名、用户名、密码) 保存到db.properties文件中,当类被加载完毕时,能够读取db.properties文件中的数据库的信息
(复习一下IO流Properties类)
3.封装常用的方法,方便以后直接调用
步骤:
1.先将驱动类、数据库名、用户名、密码保存到配置文件中,需要的时候再从配置文件读取
好处:将来如果需要修改数据库、用户名、密码的时候,只需要改配置文件即可
2.在JDBC工具类中,读取配置文件中的数据库信息
3.封装获取数据库连接的方法
将来想获取数据库连接时,只需要调用该方法即可,该方法会给我们返回数据库连接
4.封装关闭资源的方法
5.测试一下
四、JDBC事务处理
1.关闭自动提交
2.如果sql语句都执行成功,执行commit()
3.如何有任何一个sql语句出现异常,执行rollback();
模拟银行转账:
五、用户登录案例
1.先给user表增加password列
添加测试数据
2.借用Scanner,提示用户输入用户名、密码,然后使用JDBC验证用户名、密码是否正确
六、JDBC预处理
预,提前
预习,提前学习
预处理,在sql语句执行前,先编译sql语句
1、 预处理解决什么问题
上面之所以查询出来结果,因为1’ or 1=1 or ’ 将sql语句的结构改变了
select * from user where name = ‘张无忌’ and password = ‘admin123’;
select * from user where name = ‘1’ or 3=3 or ’ ’ and password = ‘admin123’;
将条件修改为:name = ‘1’ 或者 1=1,由于1恒等于1,所以该条件就成立
可以通过1’ or 1=1 or '用户名破解我们的登录功能
要想解决这个安全问题,需要知道原因
原因在于:不能根据用户名改变sql语句的结构,由原来的的name=xxx条件,改变成:name=’1’ 或者 1= 1
2、 预处理如何使用
预处理解决安全问题思路:
1.使用占位符代替可能被攻击的地方
2.预编译sql语句,目的是:固定sql语句的结构,将来不管传递的用户名是什么,都不会再改变sql结构
3.绑定参数,将真实的内容替换到占位符
4.执行预编译的sql语句