玩命加载中 . . .

JDBC学习笔记(01)


初始JDBC

概念:

Java DataBase Connectivity :Java数据库连接,Java语言操作数据库。官方定义一套操作所有关系型数据库的规则,即接口,各数据库厂商去实现这套接口,提供数据库驱动jar包,可以使用接口编程,真正执行的代码时驱动jar包中的实现类。

引入jar包

这里演示idea导入jar包:快捷键shift+alt+ctrl+s打开项目结构进行导入:

1

2

3

JDBC基本使用:

DriverManager(驱动管理对象)

驱动管理对象:告诉程序该使用哪一个品牌的数据库。(注册驱动)

  • 数据库连接
url:指定连接的路径
               #语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
               #例子:jdbc:mysql://localhost:3306/tb_student
               注意:如果连接的是本机mysql服务器,并且端口为3306,则url简写为:jdbc:mysql://数据库名称
       user:用户名
       password:密码

Connection(数据库连接对象)

数据库连接对象:用于将数据连接上之后使用的对象。

Statement(执行sql的对象)

执行sql的对象

  • boolean execute(String sql) #执行给定的 SQL 语句,该语句可能返回多个结果
    可以执行任意的sql,了解即可
  • int executeUpdate(String sql)
    执行DML(insert ,update , delete)语句、DDL(create,alter,drop)语句
    返回值:影响的行数,通过影响的行数判断DML语句是否执行成功,返回值>0,执行成功,反之失败。
  • ResultSet executeQuery(String sql)
    执行DQL(select) 语句

PreparedStatement(执行sql的对象)

执行sql的对象(是 Statement的子接口):此对象是先编译sql后执行sql语句的对象

SQL注入问题:

在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
a:输入用户随便,输入密码:a’ or ‘a’ = ‘a,最后sql编译时候会变成以下sql语句,从而使sql曲解了sql语句的原意。

 select * from user where username = ‘admin’ and password = 'a' or 'a' = 'a'

解决SQL注入问题:

使用PrepareStatement对象可以解决sql注入问题,PrepareStatement特点先编译sql语句后执行sql语句,也就是说无论用户输入什么字符都不会参与到sql执行中,从而达到无法sql注入现象。

使用PreparedStatement对象

参数可以使用 ? 作为占位符,从而让sql语句先编译,然后,在调用setInt或其他数据类型(调用什么数据类型的方法取决于sql数据中是什么数据类型)

String sql = "update tb_student set sname = ? where cno=101";
// 因为sname在sql中式varchar数据类型所以不可设置其他数据类型方法
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1,"张三" );

ResultSet(结果集对象)

返回结果集对象

  • Boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果有数据则返回true,如果没有数据则返回false。

  • getXXX(参数):代表数据类型

    • XXX:表是数据类型(若获取int的则为getInt(),如果是String则是getString,其余的与之类似)

    • 参数1:可以按照sql查询出来的列查询(不推荐)

      sql语句: sql语句(select cno,cname from tb_student)
      ResultSet.getInt(1);    // 指的是cno
      ResultSet.getInt(2);    // 指的是cname
      
    • 参数2:可以按照sql语句名称(别名)查询(推荐)

      sql语句: sql语句(select cno,cname from tb_student)
      ResultSet.getInt("cno");    // 指的是cno
      ResultSet.getInt("cname");    // 指的是cname
      
    • 结果集执行顺序:

      while (rs.next()) {
          // 如果有数据,则取数据
          // 以下程序是以列行数获取,注:起始列:1
          /*String cno = rs.getString(1);
          String cname = rs.getString(2);
          System.out.println(cno + "," + cname);*/
      
          // 以下程序不是以下标获取以列的名字获取,注:如果select中有别名则以别名获取,没有则以字段名获取
          String cno = rs.getString("cno");
          String cname = rs.getString("cname");
          System.out.println(cno + "," + cname);
      }
      
    • 遍历结果集执行顺序

      1. 游标向下移动一行,
      2. 判断是否有数据
      3. 如果有数据返回true,获取数据
      4. 如果无数据返回false,循环结束

JDBC事务

JDBC中默认默认是自动提交事务。如果需要手动提交事务需要修改。

开启事务

 void setAutoCommit(boolean autoCommit) //将此连接的自动提交模式设置为给定状态。
 // 调用该方法,设置参数为false,即开启事务

提交事务

void commit() 
// 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection对象当前持有的所有数据库锁。 

回滚事务

void rollback()
// 取消在当前事务中进行的所有更改,并释放此Connection对象当前持有的所有数据库锁

文章作者: 小靳同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小靳同学 !
评论
 上一篇
Servlet(02) Servlet(02)
Servlet初识Servlet概述 Servlet 是 JavaEE 规范之一。 规范就是接口 Servlet 就 JavaWeb 三大组
2021-11-05
下一篇 
动态代理(01) 动态代理(01)
动态代理概述代理,在我们日常生活之中就有体现,代购,中介,换IP,商家等等,比如有一家美国的大学,可以对全世界招生留学中介(代理 ) 留学中
2021-10-31
  目录