JDBC - 超快速拿捏


JDBC 介绍

  1、很重要要要要!  Java程序 对 数据库 进行 交互 操作 < =>   Java DataBase Connectivity => 简称 JDBC
  2、JDBC 基于驱动程序 实现 与数据库的 连接 与 操作
  3、可以理解 JDBC 是一堆接口 驱动程序 就是一些 实现 了 JDBC 的类
  4、要熟悉 了解 反射机制 更容易理解JDBC


单词 汇总

Statement | /ˈsteɪtmənt/ 声明     Driver | /ˈdraɪvər/ 驱动     Manager | /ˈmænɪdʒər/ 管理   Connection | /kəˈnekʃn/ 连接
create | /kriˈeɪt/  创造    executeQuery | 执行查询    Result(Set) | /rɪˈzʌl / 结果集   prepared| /prɪˈperd/ 有准备的


一、JDBC使用步骤 - 5 个步骤

 ① 、加载并注册JDBC驱动

    1.1JDBC的驱动长什么样?
     在这里插入图片描述
    1.2添加依赖-把jar包导入工程
    1.3加载JDBC驱动
 浅析:JDBC的驱动是谁提供的? 要看数据库厂商了 加载JDBC驱动 就是 加载 某数据库厂商 提供的 JDBC接口 的 实现类

//用于加载指定的类
Class.forName("com.mysql.cj.jdbc.Driver");
               //该字符串描述了该类的位置

 ② 、创建数据库连接

 程序 和 数据库网络通信

					  //获取数据库连接					url									  用户名  密码
Connection conn = DriverManager.getConnection("jdbc:mysql;//localhost:3306/哪个数据库名字?jdbc:mysql://localhost:3306/babytun?useUnicode=true&amp;character=utf8&amp;useSSL=false&amp;serverTimezone=UTC"
,"root"
,"root")
//返回 Connection对象
//java.sql.Connection是一个接口,具体由驱动实现

 ③ 、创建Statement对象

 Statement对象 是用来执行SQL 语句的

		
Statement stmt = conn.createStatement();
//返回一个 结果集							SQL语句
ResultSet rs = stmt.executeQuery("select * from biao");

注:在结果集中有我们查询的数据,如果要提取出来就要走下面的遍历步骤

 ④ 、遍历查询结果

//next() 是结果集中提供的判断方法 
while(rs.next()){
	//将 当前行 第一列的数据,作为整型获取
	Integer eno = rs.getInt(1)//将 当前行 ename的数据,作为字符串获取
	String ename = rs.getString("ename");
	Float salary = rs.getFloat("salary");
	System.out.println(eno+"-"+ename+""+"-"+salary);
}

 ⑤ 、关闭连接,释放资源

					//当前连接是否被关闭 
if(conn != null && conn.isClosed() == false){
	conn.close();
}

实际要把 conn.close(); 放到 finally 块中


二、SQL注入攻击的应对

利用输入的语句 故意去和SQL语句进行拼接。会造成数据的泄露。
 例···原始语句:

ResultSet rs = stmt.executeQuery("select * from table where ename='" + x + "'");

 如果控制台输入 ' or 1=1 or 1=' SQL语句就会发生拼接 如下所示:

slecr * from table where ename='' or 1=1 or 1=''

 注入攻击 - 应对

   因为执行SQL语句的是 Statement 对象。所以要放弃Statement 改用 PreparedStatement 处理SQL

		
Statement stmt = conn.createStatement();
//返回一个 结果集							SQL语句
ResultSet rs = stmt.executeQuery("select * from biao where ename='" + x + "'"");

                   上面代码 改成 下方形式
  上面代码中SQL 查询是放在 executeQuery() 中执行的。
  下面代码 则是 先 放入SQL语句,然后调用excuteQuery()。

PreparedStatement pstmt= conn.preoareStatement("select * from biao where ename=?");
pstmt.setString(1,x);//设置SQL参数,参数从第一个开始
ResultSet rs = pstmt.executeQuery();

============================================== JDBC 基操完结================================================



============================================== 优化、使用细节================================================

三、封装 DBUtils 工具类

  其实也就是把一些重复的代码 整合起来 放进某些方法中,啥时候使用啥时候调用。这样JDBC 使用起来会很舒服。
  比如:创建连接部分+关闭连接部分

public class DBUtils{
	//获取连接,返回Connection对象
	public static Connection getConnection()throw 各种异常{
	Class.forName("com.mysql.cj.jdbc.Driver");
	Connection conn = DriverManager.getConnection(url,user,password);
	return conn;
	}
	//关闭连接,释放资源						prepardeStatement是Statement的子接口,关Statement一样
	public static void closeConnection(ResultSet rs,Statement stmt,Connection conn){
	rs.close();
	stmt.close();
	conn.close();
	}
}

四、事务机制

  为了防止程序在操作数据库中 出现意外情况 导致 数据 传递过程出现 异常:
   要么把事情做完,要么不做,不能做一半
  MySQL通过事务区作为数据缓冲地带:
  ·通过 事务区机制 等待程序发起 commit提交 或者 robllback回滚:
  ···如果commit提交成功 所有事务区的数据 将写入表中。
  ···如果robllack 永远不会写入目标表 会将事务区中做好的 数据 撤销掉。
注:日常开发中 大多数都需要手动控制事务机制。
   提交指令:commit      回滚指令:rollback

 JDBC的 两种 事务模式

  ①、自动提交事务模式

     每执行一次execute...();时都会提交一次
     不书写 默认 是 开启状态:

conn.setAutoCommit(true)

     关闭自动提交:

//关闭自动提交
conn.setAutoCommit(false)

  ②、手动提交事务模式

     1、获取数据库连接以后
     2、手动 书写 关闭自动提交
     3、然后 显示调用 conn.commit()conn.rollback() 方法管理事务
   注:如果提交过程出现异常,当然  conn.rollback();  要写在 catch块 里面 进行事务的回滚。


五、实体类的封装分页、JDBC中 Date日期对象的处理、批处理

        此处跳过…🙏


六、连接池

  连接池好比是仓库
  连接池 负责创建管理连接,程序只 负责取用与归还

 Druid 使用步骤

   1、如何获取?GitHub上搜寻Druid并下载
       Alt
   2、把该jar包 加入依赖
   3、src目录下创建 druid-config.propertues 属性文件

//驱动类的名字
driverClassName=com.mysql.cj.jdbc.Driver
url=......
userName=...
password=...
//如果要在程序 启动的时候 初始化 一定数量的数据库连接 	下面继续配置
initialSize=10 //初始的数量
maxActive=20

   4、如何利用Druid对 上面 属性文件 进行加载和读取呢?
    ·4.1、加载属性文件
      Properties properties = new Properties(); //利用 Properties对象 来保存编写的 属性文件信息
      String str= 当前类名.class.getResource("/druid-config.properties").getpath();//获取属性文件路径
      str = new URLDecoder().decode(str,"UTF-8")//确保获取的路径名正确 例如遇到空格等 进行转化
      properties.load(new FileInputStream(str));//将属性文件的物理地址,放到文件输入流中 完成加载.
    ·4.2、获取DataSource数据源对象
     注:DataSource 是 java.sql包中提供的一个接口,利用DataSource指代我们要操作的数据库是什么
       所谓的 数据源 就是 数据库在JDBC中的别称
      DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    ·4.3、创建数据库连接
      Connection conn = dataSource .getConnection();
   5、关闭连接
     不使用连接池:conn.close(); 关闭连接
     使用连接池:conn.close(); 将连接 回收 至连接池



 C3P0 使用步骤

   1、如何获取?百度C3P0 官网
      在这里插入图片描述
   2、把该jar包 加入依赖
   3、src目录下创建 c3p0-config.xml 配置文件
     注:文件名 固定

<?xml version="1.0" encoding="UTF-8"?>
此文件根节点固定
<c3p0-config>
	默认配置信息
	<default-config>
			驱动类名
		<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
			连接字符串
		<property name="jdbcUrl">......</property>
		<property name="user">...</property>
		<property name="password">...</property>
		初始化连接属性
		<property name="initialPoolSize">10</property>
		<property name="maxPoolSize">20</property>
	</default-config>
</c3p0-config>

   4、如何利用C3P0对 上面 配置文件 进行加载和读取呢?
    ·4.1、加载配置文件
    ·4.2、创建DataSource
     DataSource dataSource = new CombopooledDataSource();
    ·4.3、得到数据库连接
     Connection conn = dataSource.getConnection();
   5、关闭连接

总结:即使是不同的连接池产品 主要步骤也就是
1、加载相应的文件
2、拿到数据源对象
3、获取数据库连接


七、Apache Commons DBUtils

  • 由Apache提供的开源JDBC工具类库
  • 简单封装了JDBC
  • 支持 druid、c3p0

     使用步骤

       1、什么是Commons DBUtils?
       在这里插入图片描述

      2、加入依赖

      3、如何使用?(无非查询 和 写 这两块的操作)
      ·3.1、查询如下:
       因为 支持 连接池 所以在获取 连接池以后

    Properties properties = new Properties(); 
    String str= 当前类名.class.getResource("/druid-config.properties").getpath();
    str = new URLDecoder().decode(str,"UTF-8")
    properties.load(new FileInputStream(str));
    获取DataSource数据源对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    
    //查询执行者			      传入  指定哪一个数据库 进行操作
    QueryRunner qr = new QueryRunner(dataSource);
    		//将结果自动转换成实体类
    List<实体类> list = qr.query("select * from table limit ?,10",
    							//查询结果要转换成哪个实体对象
    							new BeanListHandler<>(实体类的名.class),
    							//用数组进行 SQL参数传值
    							new Object[]{1});
    

       上面没有涉及到 任何连接的操作,在执行query方法的时候,DBUtils会自动创建连接。当执行完毕后自动关闭。
      ·3.2、更改如下:
        因为 一些列 写操作 牵扯到事务,所以需要获取数据库连接

    Properties properties = new Properties(); 
    String str= 当前类名.class.getResource("/druid-config.properties").getpath();
    str = new URLDecoder().decode(str,"UTF-8")
    properties.load(new FileInputStream(str));
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    创建数据库连接
    Connection conn = datSource.getConnection();
    conn.setAutoCommit(false);  				//关闭自动提交
    
    
    String sql = "update table set salary=salary+1000 where eno=?";
    					不用传入数据源对象
    QueryRunner qr = new QueryRunner();
    					//  sql 要传入的参数
    qr.update(conn,sql,new Object[]{1007});
    conn.commit();
    再往下就是响应的 connn.rollback()回滚、以及资源的释放或关闭
    

    总结

           我爱你 ~  任凭上面的代码雨阑珊,淋不湿屋内的你,我是代码雨,你还是你。💔💔💔


                         🙏愿: 宇宙的尽头没有JDBC。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值