初谈JDBC

引言  

  jdbc  java语言操作数据库的技术

简介 

  jdbc 一套java访问数据库的接口 ,通过访问接口 ,可以访问任何数据库

常用的API  

  常见的接口  

    java.sql.Connection 数据库连接 ,只有获得Connection对象,才能连上数据库

    java.sql.PrepareStatement  发送SQL语句的工具  具备发送SQL的功能(方法)

    java.sql.Resultset   结果集  接受数据库执行查询SQL的返回结果

    java.sql.Driver    驱动类   不同的数据库会自动提供具体的实现接口 

    java.sql.DriverManager  管理多个驱动 

 

编程思想  

    创建一个表 ,在数据库中 通过java代码向数据库表中添加数据

 

 

JDBC访问数据库的步骤

  1 加载驱动  【.....不同数据库驱动不一样】

  2 建立连接   【获取数据库连接 Connection】

  3 创建SQL发送的工具  【PrepareStatement 发送SQL的工具】

  4预加载SQL语句    【 将准备的SQL语句发送  不是在代码中执行  是在数据库中执行】

  5 处理结果集   【在发送select语句 会有结果返回 ResultSet】

  6   释放资源  【反向关闭  ResultSet  PrepareStatement Connection 】

 

实际案例 

  需求  向t_person 表中添加一条数据 

 

 

   思路  

 

                  

   

 以Oracle数据库为例

 

 

 

ResultSet  结果集  存放查询结果  

  获取结果集的方法  

  1. next() 移动resultSet的游标,下移一位, 并且通过返回值确定当前行是否有数据.

  2. getXxxx("查询结果列名")---获得rs游标指向的当前行, 列名对应的数据.

  3. getXxxx(列序号)---获得rs游标指向的当前行,列序号对应的数据

 

 

解析驱动加载  

  // 管理驱动  

    public class DriverManager{

      //存放多个driver对象.
       private static List<Driver> drivers  = new CopyOnWriteArrayList<>();

       //真正的注册驱动的代码.
       public static void registDriver(Driver driver){
             drivers.add(driver);
       }

       public static Connection getConnection(String url,String user,String password){
           //...
       }
  }

 

驱动加载 

  // 表面书写: Class.forName("oracle.jdbc.OracleDriver")
  // 如何实现驱动加载?
  public class OracleDriver implements Driver{
     //加载驱动
     static{

    //创建驱动
         Driver driver = new oracle.jdbc.OracleDriver();

    //添加驱动对象, 注册驱动,  加载驱动
         DriverManager.registDriver(driver);
     }
  }

 

动态参数  

  方式一   SQL字符串拼接  

    将变量中的值  通过字符串拼接 绑定在SQL语句中

      优点  可以动态的绑定非数据的部分      应用场景  排序方式的动态拼接

      缺点  SQL注入   

  方式二 pstm 动态参数  

    优点 防止SQL注入  

    缺点  只能动态绑定数据/值得部分 

        不能动态绑定 SQL的关键词 ,列名  

 

步骤   

 

  1. 创建SQL允许将值,用? 站位: delete from t_person where name = ?

    ?在sql只能表示值 数据

    pstm = conn.prepareStatement("delete from t_person where name = ?");
    // insert into t_person values(?,?,?,?,?);
  2. 绑定参数

    对?站位的值,进行替换,绑定.
    pstm.setXxxx(?的序号从1开始,要绑定的具体值);// 将数据绑定在指定的?位置.

    pstm.setInt();  //绑定整数类型的值
    pstm.setString() //绑定字符串的值
    pstm.setDouble();// 绑定double的值
    pstm.setDate();//绑定日期.
  3. 发送sql(执行)

    pstm.executeUpdate();//执行增删改
    pstm.executeQuery();//执行查询.

    

 

 

 

  实例代码

  

 

 

 

 开发应用  

  如果SQL语句要拼接数据  ,使用pstm的?占位符  

  如果SQL语句要拼接非数据  ,使用字符串拼接 

 

 

     

 

 pstm预编辑原理 

  SQL语句的执行过程  

  

 

 

   pstm预编译的执行原理 

  

 

 

 

 

批更新(BatchUpdate)【重要】

核心 PreparedStatement

  1. 将绑定的参数,缓存在java本地.

    pstm.addBatch()

  2. 将缓存在java本地的多组参数,一次性发送给Oracle.

    pstm.executeBatch()

   

        实现思路

  

 

 

       实例代码  

  

 

 

 

  编码优化  

      思路  将通用代码封装到一个函数内部  需要的时候调用  

      作用  简化代码开发  提高代码的可维护性  

    版本1     

 

 

 

  版本2 

    在代码中写死连接值  不方便后续维护   采用配置文件

    

    前置小知识

      properties的配置文件      

          1 ****.properties结尾

          2  格式内容  name=value

    

      Properties对象

        map集合    key 和 value 都是string  

        作用  加载properties配置文件中的内容 到Properties对象内部

      1. load(输入流);//根据文件输入流给定的文件,加载信息到Properties对象中.
      2. getProperty("key");//根据key 获得value

 

   问题 上面的JDBCUtil中  存在以后需要修改的字符串常量配置 (数据库连接相关的)

   解决思路  将常量配置转义配置到配置文件中  提高可维护性  

 

 

 

       获取类加载的输入流   类名.class.getReasourceAsStream(“文件的相对路径”)

      作用  :读取配置文件  

    

 

  最终版  

    加载配置文件的操作只需要操作一次即可      所以放在静态代码块中 

  

 

 

 

 

 

   项目实战设计模型  

    ORM 面向对象思想  将数据库中的一行数据映射成一个java对象  封装数据库数据

     

 

 

 

 标准实例代码

  表 

  

 

  实体类  

  

 

 

 

 作用   将数据库中的数据封装成java对象  便于管理  

  

 

 

 

  DAO模型设计     

    职责  封装数据库访问的所有数据  

  

 

 

   

  JDBC控制事务  

  

核心思想:

  1. 一个功能对应service的一个方法

  2. service一个方法就是不可分割的执行单元

  3. service每个方法的代码都要放在事务控制之内.

Connection事务相关方法:

setAutoCommit(false)--开启事务   将事务控制设置为手动提交.

commit()--提交事务

rollback()--回滚事务 

 

事务控制问题  

  service 和 dao 使用的不是同一个连接  

    解决1 将service的conn通过传递参数的方法传递给dao

      注意 dao接受到service的conn ,dao不能关   service 最后关  

      缺点  所有的dao都需要添加Connection参数   代码污染   

    解决2 使用线程池   都从线程池中取连接  

 

 时间问题   草草收尾   以后有时间再补。。。。。

 

posted @ 2019-09-20 17:00  一颗小毛豆  阅读(129)  评论(0)    收藏  举报