使用JDBC链接数据库
简述开发链接步骤
- 一 通过java反射 Class.forName()加载驱动
- 二 通过DriverManager创建链接connection(提供数据库URL,user,password)
- 三 通过链接connection创建实例
- 四 执行sql,获取结果集ResultSet
- 五 通过结果集获取数据
- 六 资源回收,关闭结果集,实例,链接。
缺点:
jdbc底层没有连接池,操作数据库需要频繁的创建和关联链接,需要耗费大量的资源,在java中项目一旦需要修改sql,就需要整体编译不利于维护。
返回的结果集也需要硬编码。
注意事项:在操作中可能出现sql注入的问题
sql注入:在应用程序中通过插入恶意sql篡改数据或获取未经授权查询的数据,是非常大的安全漏洞。
解决方法:
注:代码示例见文章末尾
PreparedStatement statement = connection.prepareStatement(sql);
为什么能解决sql注入?
因为PreparedStatement对sql进行了预编译,对参数位置使用了占位符,只需要填充即可,而Statement只是对sql进行拼接,并且每次都需要编译,效率低下。
代码示例
代码编写之前需要引入jar
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
以下为实现代码
package com.chenmo.study;
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
JDBCDemo jdbcDemo = new JDBCDemo();
jdbcDemo.testConnectMysql();
}
public void testConnectMysql(){
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("驱动程序未找到,驱动加载失败");
e.printStackTrace();
}
String url = "jdbc:mysql://localhost:3306/testdb";
String user ="root";
String pasw ="hzx510573859";
try {
//创建链接
Connection connection = DriverManager.getConnection(url, user, pasw);
//创建实例 该实例会出现sql注入的问题
Statement statement = connection.createStatement();
//构建sql语句
String sql = "SELECT * FROM user";
//执行sql,获取数据集 执行sql可使用方法如下图
ResultSet resultSet = statement.executeQuery(sql);
//循环获取对应的数据
while (resultSet.next()){
String name = resultSet.getString("name");
System.out.println(name);
}
//关闭结果集
resultSet.close();
//关闭实例
statement.close();
//关闭链接
connection.close();
} catch (SQLException e) {
System.out.println("数据库链接失败");
e.printStackTrace();
}
}
}
结果如下:
创建防止sql注入的实例
//创建链接
Connection connection = DriverManager.getConnection(url, user, pasw);
//构建sql语句
String sql = "SELECT * FROM user";
//创建防止sql注入的实例
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//执行sql,获取数据集
ResultSet resultSet = preparedStatement.executeQuery();
//循环获取对应的数据
while (resultSet.next()){
String name = resultSet.getString("name");
System.out.println(name);
}
//关闭结果集
resultSet.close();
//关闭实例
preparedStatement.close();
//关闭链接
connection.close();