javaweb-JDBC_1

一、引言

开发工具:MyEclipse-2017-CI-7-offline-installer-windows
a)Junit测试
作用:测试代码
现有测试方式-主函数 存在缺陷
1、测试类数目过多 不方便管理
2、不利于回溯性测试
Junit测试使用方式
1、引入junit4相关库文件
a)第一种:右击项目-》build path-》add librarys—》JUnit—》4版本—》确定
b)第二种:直接书写测试类—》光标放到@Test上—》add junit4 library to bp
2、准备一个测试类

3、书写junit测试方法
a)public void 方法名随意 (){ //测试内容 }
b)在测试方法上添加注解 @Test

二、JDBC

a)概念:Java DataBase Connectivity java数据库的连接
Sun公司提供的一组编程规范【接口】
JavaEE(企业版)编程规范之一
所有访问操作数据库技术最底层(hibernate、mybatis)
驱动:趋势程序运行的组件 数据库厂商针对JDBC提供的实现类 jar包
Ojdbcxx.jar
b)作用:使用java程序访问、操作数据库
c)JDBC操作数据库的方式

在这里插入图片描述
2. JDBC的核心API
java.sql.DriverManager[工具类] :帮助我们管理数据库的驱动jar, 创建数据库的连接对象

java.sql.Connection[I] :一个Connection对象代表一个数据库的连接,如果我们获取到了Connection,说明我们连接到了数据库

java.sql.Statement[I] :Statement主要作用是发送SQL命令到数据库执行
java.sql.ResultSet[I] :如果执行的是查询语句的话,会有结果集返回, 返回的结果集被封装到了ResultSet对象中

三、使用JDBC开发 【重点】

1、搭建开发环境
1.1 引入驱动jar : ojdbc6.jar
项目名上右键 - new - folder - 将ojdbc6.jar拷贝到此目录下 - 在ojdbc6.jar上右键 - build path - add to build path

2、 编码流程 (JDBC开发标准6个步骤)

2.1 加载驱动
Class.forName(“oracle.jdbc.OracleDriver”);

2.2 获取连接 Connection
Connection conn = DriverManager.getConnection(url,username,password);
url: jdbc:oracle:thin:@localhost:1521:xe >jdbc:oracle:thin:@IP:PORT:SID(数据库的实例名)

在这里插入图片描述
username : hr
password : hr

2.3 书写SQL语句
String sql = “insert/delete/update/select”;
注意: 字符串中的SQL命令结束不能有分号

2.4 创建Statement, 执行SQL
Statement stm = conn.createStatement();
int i = stm.executeUpdate(sql); – 执行增 删 改, 返回值代表SQL命令影响数据的行数
ResultSet rs = stm.executeQuery(sql); – 执行查询 ,返回值是一个结果集对象

2.5 处理结果集 ResultSet

  • ResultSet对象中封装了从数据库查询出来的结果, 我们可以将结果集想象成一个二维表,结果集中有一个游标,游标初始在首行数据的上一行, 当我们每调用一次rs.next()方法时,游标下移一行,rs.next()方法的返回值代表 游标指向的当前行是否有数据(true|false)。
  • 取出结果集中的数据:
    while(rs.next()){
    // 取出当前行的数据,一个字段一个字段取
    rs.getXXX(index) ; | getXXX() 对应的是Java中接收的变量类型与表字段的类型
    参数index 代表结果集中字段的位置下标,从1开始
    rs.getInt() – 对应表的字段类型 number(n) 或 number(n,0)
    rs.getDouble() – number(n,n)
    rs.getString() – varchar2(n) 、char 、 varchar(n)
    rs.getDate() – date
    }

在这里插入图片描述

2.6 释放资源 - 原则是先创建,后关闭
stm.close();
conn.close();
小练习: 完成一个添加操作, 要求所有添加的信息,从控制台录入。
完成模拟登陆验证
PS:
网站攻击的一种手段:SQL注入, 是指一些非法分子或黑客通过字符串拼接的方式, 向系统中原有的SQL语句注入非法的字符, 进而会威胁到系统数据的安全。

四、PreparedStatement 【重点】

1、 PreparedStatement是Statement的子接口,主要作用也是发送SQL命令到数据库执行。可以执行参数化的SQL命令。

在这里插入图片描述

2、PreparedStatement 的使用 :
2.1 创建PreparedStatement :
PreparedStatement pstm = conn.prepareStatement(sql);
2.2 给SQL语句中的占位符赋值

  • 调用PreparedStatement提供的pstm.setXXX(index,value); 方法给占位符赋值
    参数index : 代表SQL语句中占位符的下标, 从1 开始
    参数value: 代表给对应占位符所赋的值
    pstm.setInt(index,value) – 对应占位符的字段类型 number(n) / number(n,0)
    pstm.setDouble(index,value) – number(n,n)
    pstm.setString(index,value) – varchar2(n)、 char、 varchar(n)
    pstm.setDate(index,value) – date

2.3 执行SQL命令
int i = pstm.executeUpdate(); - 执行增 删 改,返回值代表影响数据的行数
ResultSet rs = pstm.executeQuery(); - 执行查询,返回值代表结果集ResultSet

在这里插入图片描述

PS: 使用PreparedStatement 有效的避免了SQL注入的风险 。以占位符的方式给SQL中的参数赋值相比于字符串拼接的方式,SQL的可读性要高。

3、 PreparedStatement执行的原理 【了解】
3.1 数据库执行SQL的简单过程 : 检查权限 --> 检查语法 --> 进行值的注入 --> 执行
3.2 PreparedStatement执行SQL的过程

在这里插入图片描述
4、Statement与PreparedStatement对比
Statement :父接口 以字符串拼接的方式,书写SQL ,存在SQL注入的风险,执行批量操作时效率低
PreparedStatement :子接口 有效的避免了SQL注入 可以执行参数化的SQL,带占位符( ? )的SQL 可以很专业进行批处理操作,效率比Statement要高

五、动态参数
作用:动态为sql语句传递参数
1、sql语句使用?进行占位
2、给占位符进行赋值
pstm.setXXX (问好的位置 第几个问好 , 要给问好赋的值)
number类型数据
pstm.setInt(,)
pstm.setDouble(,)
varchar2类型数据
pstm.setString(,);
data类型
pstm.setDate(,)

六、插入数据的注意事项
a)日期类型数据的插入
注意:JDBC操作中 日期的插入要使用java.sql.Date 将util.Date转化为sql.Date
java.util.Date dd = new java.util.Date();
java.sql.Date d = new java.sql.Date(dd.getTime());
pstm.setDate(x,d);
b)主键问题
借助序列自动生成主键
1、创建一个序列对象
Create sequence user_seq
2、在代码中使用 user_seq.nextval
String sql = “insert into t_user values(user_seq.nextval,?,?,?)”;

七、JDBC开发中常见错误
在这里插入图片描述
处理: 检查SQL语句的语法是否正确

在这里插入图片描述
处理:检查是否导入ojdbc的jar包 或 检查加载的驱动类名是否有误

在这里插入图片描述
处理:检查 数据库连接url是否有误

在这里插入图片描述
处理: 检查获取值的下标是否有误 或 检查占位符赋值的下标是否有误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值