渣渣用惯了框架回头来学习JDBC了,毕竟还是要知其然知其所以然。
本文目录
JDBC介绍
JDBC是以统一方式访问数据库的API,无论实际使用的是Mysql数据库还是Oracle数据库,加入的数据库Jar包后,用户只需操作统一的JDBC即可。
配置Mysql-connector的Jar包
1)下载Jar包
先在网址https://dev.mysql.com/downloads/connector/j/下载Mysql的Jar包。由于我的mysql数据库是8.0版本的,所以驱动也下载8.0版本的,旧版本的数据库最好对应下载旧版本的驱动。
将下载下来的zip压缩包解压,可发现压缩包中有mysql-connector-java-8.0.20.jar包。
2)集成到IDEA
在idea项目中选择File——ProjectStruct——Modules——Dependencies,选择+号,选择Jars or directors。
选择解压路径下的jar包
于是Jar包添加成功,在External Libraries中可看见
JDBC运用
1. 数据库连接,statement语句和prepared
(1)先创建一个名叫jdbc_test的数据库,再建立一张名为t_user的表,在其中设三个字段:id,username,lasttime。
(2)编写Java程序,一定要注意此处的url,不要写错
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载相应的驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai;
String username = "root";
String password = "root";
// 建立数据库连接,远程连接中包含socket对象,比较耗时,实际开发中常用连接池
Connection connection = DriverManager.getConnection(url,username,password);
// statement语句容易发生sql注入危险,不建议使用
Statement statement = connection.createStatement();
String sql = "insert into t_user values(1,'zd',now())";
statement.execute(sql);
// 后开的先关
statement.close();
connection.close();
}
}
运行结果:
(3)sql注入示例,删库
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载相应的驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
// 建立数据库连接,远程连接中包含socket对象,比较耗时,实际开发中常用连接池
Connection connection = DriverManager.getConnection(url,username,password);
// statement语句容易发生sql注入危险,不建议使用
Statement statement = connection.createStatement();
String id = "1 or 1=1";
String sql = "delete from t_user where id=" + id;
statement.execute(sql);
statement.close();
connection.close();
}
}
由于id通常是外部传进来的,此时运行这个sql语句相当于直接删库了,非常不安全。
(4)预编译preparestatement语句的使用
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载相应的驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url,username,password);
// 采用?占位符
String sql = "insert into t_user values(?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 设置参数,从1开始,不是从0开始,每个参数设置有对应的类型
preparedStatement.setInt(1,1);
preparedStatement.setString(2,"wy");
preparedStatement.setTimestamp(3,new Timestamp(System.currentTimeMillis()));
preparedStatement.execute();
preparedStatement.close();
connection.close();
}
}
结果展示:
resultset结果集的使用
假设数据库有多条记录:
使用ResultSet来保存查询得到的记录:
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com