体系结构
- JDBC API:面向程序,供Java程序开发人员使用
- JDBC Driver Manager:注册数据库驱动,供Java程序开发人员使用
- JDBC Driver API:面向数据库,供数据库厂商使用
JDBC程序开发步骤:
- 加载并注册数据库驱动(Driver类)
- 获取数据库连接(Connection对象)
- 获取SQL语句执行者(Statement对象)
- 执行SQL语句
- 操作结果集(ResultSet对象)
- 回收数据库资源
代码如下:
package com.qfedu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class jdbc {
public static void main(String[] args) throws Exception {
//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/world"; //world是一个数据库
String username="root";
String password="123456";
//获取连接
Connection connection = DriverManager.getConnection(url, username, password);
//定义sql语句(city是一个表)
String sql="select * from city";
//获取执行的sql对象
Statement statement = connection.createStatement();
//执行sql查询语句
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int ID=resultSet.getInt("ID");
String Name=resultSet.getString("Name");
String CountryCode=resultSet.getString("CountryCode");
String District=resultSet.getString("District");
String Population=resultSet.getString("Population");
System.out.println(ID+" "+Name+" "+CountryCode+" "+District+" "+Population);
}
connection.close();
statement.close();
}
}
JDBC的API详解
- DriverManager
1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2.获取数据库连接
- Connection
1.获取sql对象
普通执行sql对象 Statement createStatement()
预编译sql的执行sql对象:防止sql注入 PreparedStatement prepareStatement(sql)
执行存储过程 CallableStatement prepareCall(sql)
2.管理事务
- Statement
执行sql语句
int excuteUpdate(sql):执行DML和DDL语句(简单理解为:增加,删除,更新操作)
返回值:DML影响的行数,执行后也可能返回为0
ResultSet excuteQuery(sql):执行DQL语句
返回ResultSet结果集对象
一般是遍历查询
result.next(); 详见Overview (Java SE 11 & JDK 11 ) (runoob.com)
流程上
ResultSet resultSet = statement.executeQuery(sql);执行sql语句,返回ResultSet对象
boolean next():将光标向前移动一行,并判断是否为有效行
xxx getxxx(参数) 获取数据
xxx:数据类型 如:getint(参数) getString(参数)
参数是int表示列的编号,是String表示列的名称
另外把查询的对象(ResultSet)的数据放到集合里面
Connection connection = DriverManager.getConnection(url,username,password);
String sql="select * from employee";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
//建立集合
ArrayList<Employee> list =new ArrayList<>();
while (resultSet.next()){
Employee employee =new Employee();//创建一个对象
employee.setId(resultSet.getInt("id"));
employee.setName(resultSet.getString("name"));
employee.setAge(resultSet.getInt("age"));
employee.setTelephone(resultSet.getString("telephone"));
list.add(employee);
}
System.out.println(list);
connection.close();
statement.close();
sql注入
出现原因(以登录为例):selet * from 用户表 where name ='admin' and password='12345 or 1=1 '
无论密码正确与否,用户均可登录。上述查询已无效
一般解决方案是利用PreparedStatement对象
PreparedStatemnet:能够执行参数化的sql语句
package com.qfedu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class preparedStament {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/world"; //world是一个数据库
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
String sql="select * from city where Name=?";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1,"Tilburg");//表示第一个问号赋值为Tilburg
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
int id=resultSet.getInt(1);//city表的第一列
String name=resultSet.getString(2);
String countryCode=resultSet.getString(3);
String district=resultSet.getString(4);
String population=resultSet.getString(5);
System.out.println(id+" "+name+" "+countryCode+" "+district+" "+population);
}
resultSet.close();
preparedStatement.close();
conn.close();
}
}