JDBC:一套标准接口
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
String url = "jdbc:mysql://localhost:3306/db2?useSSL=false";
//String url = "jdbc:mysql://127.0.0.1:3306/db2?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//("jdbc:mysql://localhost:3306/db2", "root", "123456")
//获取执行SQL的对象
Statement stat = conn.createStatement();
//定义SQl
String sql = "SELECT * FROM user";
//执行SQL
ResultSet rs = stat.executeQuery(sql);//受影响的行数
//处理结果
//System.out.println(rs);
//释放资源
rs.close();
stat.close();
conn.close();
API详解
DriverManager
Connection
Statement
ResultSet
PreparedStatement(Statement的增强版)
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对SQL语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接对象
String url = "jdbc:mysql://localhost:3306/db2?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//("jdbc:mysql://localhost:3306/db2", "root", "123456")
//获取执行SQL的对象
PreparedStatement preSql = conn.prepareStatement("select * from user where id = ?");
preSql.setString(1,"1");
//执行SQL
ResultSet rs = preSql.executeQuery();
//处理结果
while(rs.next()){
System.out.println( result.getString("username"));
}
//释放资源
rs.close();
preSql.close();
conn.close();
PreparedStatement可以有效地防止SQL语句注入攻击。
什么是SQL语句注入攻击?
攻击者在向数据库服务器发送查询请求时,会在查询语句中添加恶意代码,从而对服务器造成伤害。例如:破坏服务器的安全性,通过恶意查询访问数据库服务器中的敏感数据,改变数据库查询结果,或者把数据库查询的结果暴露出来。
如何防止SQL语句注入攻击?
- 通过限制SQL语句的输入
- 使用参数化查询
- 编写安全的SQL语句
- 定期更新系统
- 使用Web应用防火墙
PreparedStatement不允许占位符?有多个值,实现了参数化查询,有效防止了SQL注入攻击。
数据库连接池
//导入jar包
//定义配置文件 druid.properties
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("路径src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);