JDBC
1、什么是JDBC?
JDBC 全称是 java DataBase Connectivity,是java连接数据库的规范和 API。该规范中定义了一系列的接口,由数据库厂商根据自身数据库的特点提供实现类。开发者根据接口调用方法,就可以屏蔽不同数据库的差异。这样,无论连接和操作哪种数据库,都是一套API 。
2、什么是数据库驱动包?
驱动包是数据库厂商针对 JDBC 规范所写的实现类。连接不同数据库时,应该使用不同数据库厂商提供的驱动包。
3、JDBC开发流程:
1、建立连接
2、执行 SQL 语句,操作数据库数据
3、关闭连接
JDBC操作
1、建立连接
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//建立连接 localhost表示连接数据库所在服务器的IP地址 12345为连接端口
//mydb表示连接mysql 数据库的库名 characterEncoding=utf-8 设置编码号
//root表示登录mysql 的用户名 1234表示登录mysql 的密码
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:12345
/mydb?characterEncoding=utf-8","root","1234");
2、执行 SQL 语句,操作数据库数据
//执行SQL 语句
PreparedStatement ps = con.prepareStatement("insert into t_link
(l_name,l_birthday,l_gender,l_phone)"+"values (?,?,?,?)");
//填充占位符
ps.setObject(1,linkObj.getName());
ps.setObject(2,linkObj.getBirthday());
ps.setObject(3,linkObj.getGender());
ps.setObject(4,linkObj.getPhone());
//更新数据库,将数据真正写入数据库
//注意:除了执行查询语句增、删、改都需要更新数据库
ps.executeUpdate();
3、关闭连接
try {
if (rs != null) {
rs.close();
}
if (ps != null){
ps.close();
}
if (con != null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
JDBC封装
通过封装父类,子类继承父类实现
具体代码:
public class BaseDao {
//连接对象
protected Connection con;
//SQL 语句执行对象
protected PreparedStatement ps;
//结果集
protected ResultSet rs;
public void setConnection(){
try {
Class.forName("com.mysql.jdbc.Driver");
this.con = DriverManager.getConnection("jdbc:mysql://localhost:12345/
mydb?characterEncoding=utf-8","root","1234");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
public void closeConnection(){
try {
if (rs != null) {
rs.close();
}
if (ps != null){
ps.close();
}
if (con != null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
SQL注入
在JDBC 执行 SQL 语句时,如果以拼接字符串方式插入值,一旦值中有 SQL 语句的关键字,会导致 SQL 语句语法错误,或执行不正确的情况,这称为 SQL 注入攻击。
Statement 和 PreparedStatement 的区别
Statement 是 PreparedStatement 的父接口。Statement 执行 SQL 语句时,只能以拼接字符串方式插入值,效率低,而且容易引起 SQL 注入。
PreparedStatement 提供了占位符方式插入 SQL 语句的值。无论什么值,都要当字符串处理。不会引起 SQL 注入