JDBC的使用及其API详解

本文介绍了使用JDBC的原因,它是sun公司推出的标准接口,可让一套Java代码操作所有关系型数据库。还给出了JDBC快速入门步骤,包括创建工程、注册驱动、获取连接等。此外,对JDBC的API进行了详细讲解,如DriverManager、Connection、Statement等,重点提及PreparedStatement可预防SQL注入。

#博学谷IT学习技术支持#


一、为什么使用JDBC

针对不同的的关系型数据库,我们需要编写不同的java代码进行使用。当我们开发时,使用的是Mysql数据库,而上线时需要使用Oracle数据库,我们就需要大批量的修改代码。这明显不是我们想要看到的情况,我们希望的情况是一套java代码操作所有关系型数据库。JDBC便是sun公司推出的一套标准接口,而各个厂商针对改接口提供的实现类便是驱动

二、JDBC快速入门

  • 创建工程,导入数据库连接jar包
  • 注册驱动
	Class.forName("com.mysql.jdbc.Driver");
  • 定义基本数据(url,username,password)
	String username = "root";
	String password = "1234";
	String sql =  “update account set money = 2000 where id = 1;
  • 获取连接
   Connection conn = DriverManager.getConnection(url, username, password);

Java代码需要发送SQL给MySQL服务端,就需要先建立连接

  • 获取执行SQL对象

    执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象

    Statement stmt = conn.createStatement();
    
  • 执行SQL

    stmt.executeUpdate(sql);  
    
  • 处理返回结果

  • 释放资源

源码:

	    //1. 注册驱动
	    Class.forName("com.mysql.jdbc.Driver");
	    //2. 获取连接
	    String url = "jdbc:mysql://127.0.0.1:3306/db1";
	    String username = "root";
	    String password = "1234";
	    Connection conn = DriverManager.getConnection(url, username, password);
	    //3. 定义sql
	    String sql = "update account set money = 2000 where id = 1";
	    //4. 获取执行sql的对象 Statement
	    Statement stmt = conn.createStatement();
	    //5. 执行sql
	    int count = stmt.executeUpdate(sql);//受影响的行数
	    //6. 处理结果
	    System.out.println(count);
	    //7. 释放资源
	    stmt.close();
	    conn.close();

三、API详解

  • DriverManager作用:注册驱动

    • registerDriver方法是用于注册驱动的,但是这里却使用了
      Class.forName("com.mysql.jdbc.Driver");
      
      查看Driver类的源码便可以发现,在它的静态代码块里已经使用DriverManager来调用registerDriver方法进行注册了。
      static{
      	try {
      		DriverManager.registerDriver(new Driver());
      	} catch (SQLException var1) {
      		throw new RuntimeException("Can't register driver!");
      	}
      } 
      
      所以我们只需要加载Driver类,静态代码块便会执行。而这里使用反射来进行加载Driver类。
  • Connection:获取与指定的URL连接

    • 当使用的是本地的mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
    • 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
    • 作用:获取执行SQL的对象;管理事务
  • 获取SQL的普通对象

    Statement stmt = conn.createStatement();
    
  • 重要】 获取SQL的预编译的对象

    Statement stmt = conn.prepareStatement(sql)
    

    该对象用于防止SQL注入现象

  • Statement:

    • 执行DDL,DML语句时使用 int executeUpdate(String sql) 方法,执行DDL也可能不返回内容
    • 执行DQL语句使用ResultSet executeQuery(String sql) 方法,返回值为ResultSet
  • ResultSet:提供了从结果集中获取数据的方法

    • boolean next():将光标从当前位置向前移动一行;判断当前行是否为有效行
    • Xxx getXxx(参数):获取数据
      • 例:int getInt(1):获取id为1的数据
      • String getString(“name”):获取名字为name的数据
  • 重要】 PreparedStatement:

    • SQL注入: sql注入是通过修改定义好的sql语句,来进行对服务器的攻击
      例如:模拟登录案例,用户名随意输入,而密码输入
      ' or '1' = '1
      
      你可能并不懂这有什么意义,可是结合我们java代码中预先定义的sql来进行分析
      String sql = "select * from tb_user where username = '" + name + "'and password = '" + pwd + "'"
      
      拼接到sql语句中便成了
      select * from tb_user where username = 'sadsad' and password = ' '    or   ' 1 ' = ' 1 '
      
      这样无论用户名和密码满不满足条件,后面的 1 = 1 始终满足条件,用or连接,最终是成立的,就可以直接登录了
    • 作用: 预编译SQL语句并执行:预防SQL注入问题
    • 在获取了PreparedStatement的对象之后,上面sql中的从参数会使用?来占位使用。所以使用之前我们需要进行值的设置
      按照位置设置,第一个?便是1,第二个?是2,依次排序。 例如:pstmt.setString(1, name);
      便可以进行执行sql了,方法中无需传入sql,因为之前已经预编译了。
    • 如何解决的SQL注入问题:它会将特殊的字符进行了转义
      select * from tb_user where username = 'sadsad' and password = ' '    or   ' 1 ' = ' 1 '
      
    • 实际上,之前我们并没有开启预编译的功能,只是解决了SQL注入的问题,在url中加上该参数开启预编译
      useServerPrepStmts=true
      

以上便是关于JDBC的入门使用及其API的讲解,如有不足,请指正。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值