JDBC
- JDBC(Java DateBase Connectivty),就是使用Java语言操作关系型数据库的一套API
- 本质:
- Sun公司官方定义的一套操作所有关系型数据库的规范,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
入门程序
- 需求:基于JDBC,执行UPDATE语句(UPDATE user SET age = 25 WHERE id = 1)
- 步骤:
- 准备工作:创建Maven项目,引入依赖;准备数据库表user
- 代码实现:编写JDBC程序,操作数据库
1 2 3 4 5
| <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency>
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/web01"; String username = "root"; String password = "1234"; Connection connection = DriverManager.getConnection(url,username,password);
Statement statement = connection.createStatement();
int i = statement.executeUpdate("update user set age = 25 where id = 1");
statement.close(); connection.close();
|
基本的流程:注册驱动 => 建立连接 => 获取SQL执行对象 => 执行SQL语句 => 释放资源
查询数据
- 需求:基于JDBC执行如下select语句,将查询结果封装到User对象中
- SQL:SELECT * FROM user WHERE username = ‘daqiao’ AND password = ‘123456’
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| @Test public void testSelect() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/web01"; String username = "root"; String password = "1234"; Connection connection = DriverManager.getConnection(url,username,password); String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1,"daqiao"); statement.setString(2,"123456"); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { int id = resultSet.getInt("id"); String uname = resultSet.getString("username"); String passwd = resultSet.getString("password"); String name = resultSet.getString("name"); int age = resultSet.getInt("age"); User user = new User(id,uname,passwd,name,age); System.out.println(user); } statement.close(); connection.close(); }
|
sql语句中的?表示占位符,可以动态的变更查询条件。此时statement变为prepareStatement,通过setString(第n个占位符,替换内容)替换占位符
ResultSet可以把它看作是一个迭代器,通过迭代器中的方法获取查询返回的数据
预编译SQL
静态SQL:
1 2
| Statement statement = connection.createStatement(); int i = statement.executeUpdate("UPDATE user SET age = 25 WHERE id = 1");
|
预编译SQL:
1 2 3 4
| PreparedStatement statement = connection.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?") statement.setString(1,"daqiao"); statement.setString(2,"123456"); ResultSet resultSet = statement.executeQuery();
|
- 优势一:可以防止SQL注入,更安全
- SQL注入:通过控制输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法
- 优势二:性能更高
