Java学Web——day10【JDBC总结】

  【前言】

        心已碎,像一个白痴一样写着总结,却看也不看一眼。

  【正文】

   JDBC是Java Database Connection 的简称,中文名为java数据库连接接口。在JDBC没有出现之前,通过Java连接数据库,要学习相应的数据库连接方法,各个数据库厂商提供的方法还不一样。有了JDBC以后,Java连接数据库只要到JDBC官网下载相应的数据库接口,就可以使用封装好的方法直接连接,十分简便。



   使用方法:
   官方下载版本,将下载好的zip包复制到工程,右键包->Build Path->Configure..即可导入使用
   ——注意:在java中使用的连接对象全部来自于java.sql,而不是com.mysql.jdbc的内容
   
   通过案例来学习JDBC的知识:


一.案例1:写JDBC的查询和更新操作
   
  在MySQL对数据的常见操作中有我们俗称的"增删改查",分为两类,增 和删改查,在SQL中操作这样的语言分别称为DQL 和DML。因为JDBC是连接数据库的,所以也提供了Query(查询)和Update(更新)来对应SQL中的DQL和DML。因此,java代码中执行SQL的查询语句使用executeQuery(),修改使用executeUpdate()方法.


  1.首先学习了建立JDBC的六个步骤,有记忆规则"贾琏欲执事":  
  贾:注册(加载)驱动
  琏:获取连接对象
  欲:获取执行语句的对象
  执:执行语句并处理数据
  事:释放数据操作相关对象


  2.在Query()查询中,分为查询多个数据,查询单个数据
   (1)多个数据:返回结果集为ResultSet rs。使用while(rs.next())遍历是否有下一个数据,如果有,再使用getString(1,"列名称") 或者 getInt("列名称")来获得相应的数据和数据类型
    (2) 单个数据:返回还是Result rs 但是rs只有1或0条数据,可以直接使用if(rs.next()){};


  3.在Update()更新中,方法步骤类似Query()查询。只是它返回的值是int类型num.表示在操作中影响的行数。如果<0.则操作失败;否则操作成功:
     int result = pds.executeUpdate();if (result > 0) 
  
  4.在java中执行SQL语句,通常使用"?"占位符来代替数据,然后用setInt(1,80),setString(2,"dollar")来填充数据。
       
   
  5.释放资源:当出现Connection、PreparedStatement()、ResultSet() 这些sql操作对象,都要在使用完毕之后释放对象。
因为这些对象都有异常产生,所以放在finally{}代码块中。




二、案例2:将JDBC操作抽取成工具类DBUtils.java:


   同上面的查询和更新操作中,每个方法共同的代码很多,所以要抽取共同的代码,做成一个工具类,方便直接调用。
   将driverClassName 驱动名字 url 数据库地址 user 用户名 password 密码 做成静态final常量。在静态代码块中赋值
static{}
   将获取驱动loadDriver()注册驱动,getConnection()获取连接对象,getStatement()获取执行语句,release()释放资源等四个方法封装。再用测试类调用工具类方法,代码简洁很多,如下:


Connection conn = null;
PreparedStatement pdt = null;
conn = JDBCUtils.getConnection();
String sql = "select * from dept";
pdt = JDBCUtils.getStatement(sql);
ResultSet rs = pdt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("deptno") + " " + rs.getString("dname") + " " + rs.getString("loc"));
}
JDBCUtils.release(conn, pdt, rs);




三、将数据库的配置信息写在配置文件db.properties,再用属性类Properties调用,方便在文件中直接修改数据库信息,而不用到代码中修改。


    properties.load(new FileInputStream("src/db.properties"));


    driverClassName = properties.getProperty("driverClassName");


四、SQL注入漏洞:


   在SQL语句中,利用statement 拼接语句的时候,使用''单引号的漏洞,只要向用户名输入框中输入“用户名+'or'1=1'”,整个sql语句就变成select * from user_tb  where user = 'aaa' or '1=1' and passowrd ='xxxx'这样的语句。
因此‘1=1’条件为true。所以变成select * from user_tb  where user = 'aaa' 只要用户名猜对,密码随便填即可登录成功。
   补救情况:


   使用PreparedStatement 预编译执行语句对象代替Statement就可以防止SQL注入的情况。因为,可以通过用占位符"?"代替SQL语句中的值。然后通过pdt.setString(1,username);pdt.setString(2,password);
   如果此时,再出现username = aaa' or '1=1' 这个情况。preparedStatement 会在用户名的特殊符号单引号加一个转义字符,使它变成和字母一样的字符。aaa\' or \' 1=1\' 。这样就阻止了SQL注入的漏洞。


   因此,以后使用PreparedStatement 预编译执行语句对象代替Statement。




五、使用Junit工具测试类Test
     
    使用Junit的Test类可以直接测试方法,用这个方式来代替main函数测试


    1.在代码区域敲"Test",代码出现提示,选择 Test 4这个版本。即可生成Test方法
    2.执行:双击方法名,右键-Run as..Junit Test
    3.每个方法要声明一个@Test。不能直接点绿色箭头运行,不然会执行全部测试方法


六、其他常见错误点:


 1.更新了外键数据,导致JDBC执行语句失败:


   在JDBC进行Update操作的时候,要注意表中存在外键的情况。比如,在部门表dpet中如果设置deptno 为职员表emp的外键,并且id有记录在外键生成,就不能随意对该记录进行Update。
   
   举个例子:部门表dept中,字段deptno 有(10,20,30,40,50)等5个记录,并且其中(10,20,30,40)在员工表emp作为外键记录生成。那么这时候,对(10,20,30,40)在部门表dept修改就会报错。但是对50这个数可以修改。如果要强行修改(10,20,30,40)中的数据,有两种操作:


    1).删除emp表中对应的数据


    2).解除外键




2. 再次回顾增删改查(QURD):


    查:select * from dept;
    增:按字段增加:insert into dept(deptno,dname,loc) values(70,'策划部','五楼');


       全字段增加: insert into dept values(60,'后勤部','六楼');


    改:修改一整列:update dept set loc = '五角大楼';//没有设置where条件的情况下,将会整列的loc值都变成'五角大楼'
       修改某一列:update dept stet loc = '双子大厦' where deptno = 40;
     
    删:删除所有:delete from dept;表中数据全部清空
       删除某个记录:delete from dept where deptno = 30;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值