文章目录
JDBC - java.sql包
1. 概念
JDBC( Java DataBast Connectivity ): Java数据库连接
默认:执行DML操作、关闭连接 自动Commit 更新的数据
数据持久化: 数据保存到可掉电式存储设备,例如:将内存数据存到硬盘、磁盘文件、xml数据文件、数据库等等
数据库驱动的分类
数据库驱动: 各数据库厂商实现的JDBC接口的实现类
四种数据库驱动步骤
2. JDBC核心类、接口
重点: 我们需要需要面向JDBC接口编程,尽可能少的出现第三方驱动的代码 – 使代码具有可移值性
3. 使用JDBC
连接数据库的步骤
3.1 Statement
Connection对象.createStatement() → 返回Statement对象
public static void main( String[] args ) {
Connection con;
Statement state;
ResultSet rs;
try {
// 1. 加载JDBC-Oracle驱动
Class.forName( "oracle.jdbc.driver.OracleDriver")
// 2. 定义初始并初始话连接字符串、登录的数据库用户名、该用户名下的用户密码
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String userName = "scott";
String userPassword = "123456"
// 3. 连接数据库
conn = DriverManager.getConnection( url, userName, userPassword );
// 4. 创建 将SQL语句送到数据库的对象
state = conn.createStatement();
// 5. 执行SQL语句、并得到结果查询结果集
rs = state.executeQuery( "select * from emp" );
// 6. 处理打印结果集在控制台中
while( rs.next() ) {
Integer empno = rs.getInt("empno");
Date hiredate = rs.getDate("hiredate");
System.out.println( "empno: " + empno + " hiredate: " + hiredate );
}
}catch(Exception e) {
e.printStackTrace();
}finally{
// 7. 关闭连接:顺序 结果集 → SQL语句声明 → 连接对象
try {
rs.close();
state.close();
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
Statement注入风险
// 这条函数的用意是传一个 数字进去,根据empno值查询数据
public static List<Emp> queryEmp( String empno ) throws Exception {
Connection conn;
Statement state;
ResultSet rs;
ArrayList<Emp> empList = new ArrayList<Emp>();
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123456");
state = conn.createStatement();
rs = state.executeQuery( "select * from emp where empno = " + empno );
while (rs.next()) {
Emp emp = new Emp();
emp.setEmpno(rs.getInt("empno"));
emp.setEname(rs.getString("ename"));
emp.setJob(rs.getString("job"));
empList.add(emp);
}
return empList;
}
//调用
queryEmp("1234 or 1=1") → 注入查询,导致全部数据输出出来
3.2 PreparedStatement
Connection对象.prepareStatement( sql语句 ) → 返回PreparedStatement对象
在写sql语句的时候遇到表名、列名是关键字的时候,需要用 ``(英文符号,键盘1左边的斜点)来进行包裹
PreparedStatement预编译语句的好处
- SQL语句的大体结构已经保存,到时只要修改筛选的条件即可
- 防止SQL注入风险 → 因为我们把整个SQL语句已经写死,无需拼接,用户只需要传查询条件进来即可以
//简略的输写,异常检测这些忽略不写
Connection conn = DriverManager.getConnection( url, userName, userPassword );
// 这条SQL语句已经编译好了,到时只要更改问号的值即可以查询不同的数据集
// ?问号表示占位号,在执行前,必须赋值给问号
PreparedStatement state = conn.prepareStatement("select * from emp where empno = ?");
// state.set列类型( 第几个问号, 列值 ); //从1开始
state.setInt(1, 8981);
state.executeQuery(); // 有一条结果集
state.setInt(1, 7369);
state.executeQuery(); // 有一条结果集
3.3 CallableStatement
Connection对象.prepareCall( sql语句 ) → 返回CallableStatement对象
4. 获取数据库的连接字段、以及连接数据类似DBMS操纵数据库
- 使用Eclipse自带的Data Management工具进行获取与对应的数据库连接的连接字符串,打开方式: 窗口 → 显示视图 → Data Management → Data Source Explorer
- 打开后 Data Source Explorer界面如下
- Database Connections右键 → New → 选择需要连接的数据库 → 下一步
- 点击 New Driver Definition
- Name/Type下 → 选择加载的JDBC驱动版本、JAR List下 → 导入JDBC驱动文件、Propertties下 → 设置连接字符串、密码、账户等登录信息
-
确定 → Test Connection → 如有下图则进行下一步、不成功则自己重新检查前面的设置
-
下一步( 能看到所有设置信息 ) → 完成 → 即可以类似DBMS一样使用,不过功能比较少