美文网首页Java
JDBC编程一一jdbc原理和基础编程

JDBC编程一一jdbc原理和基础编程

作者: Help_II | 来源:发表于2020-12-04 14:02 被阅读0次

    JDBC

    什么是JDBC

    Java Database Connectivity:Java访问数据库的解决方案。
    JDBC是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。
    JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。

    JDBC接口及数据库厂商实现

    JDBC中定义了一些接口:
    1、驱动管理:
    DriverManager
    2、连接接口
    Connection
    DatabasemetaData
    3、语句对象接口
    Statement
    PreparedStatement
    CallableStatement
    4、结果集接口
    ResultSet
    ResultSetMetaData

    JDBC工作原理

    JDBC只定义接口,具体实现由各个数据库厂商负责。
    程序员使用时只需要调用接口,实际调用的是底层数据库厂商的实现部分。

    通过JDBC访问数据库的过程

    JDBC访问数据库的工作过程:
    加载驱动,建立连接
    创建语句对象
    执行SQL语句
    处理结果集
    关闭连接

    Driver接口及驱动类加载

    要使用JDBC接口,需要先将对应数据库的实现部分(驱动)加载进来。
    驱动类加载方式(Oracle):

    Class.forName("oracle.jdbc.driver.OracleDriver");
    

    这条语句的含义是:装载驱动类,驱动类通过static块实现在DriverManager中的“自动注册”。

    Connection接口

    Connection接口负责应用程序对数据库的连接,在加载驱动之后,使用url、username、password三个参数,创建到具体数据库的连接。

    Class.forName("oracle.jdbc.OracleDriver")
    //根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
    Connection conn = DriverManager.getConnection(
    "jdbc:oracle:thin:@192.168.0.26:1521:tarena",
    "openlab","open123");
    

    需要注意的是:Connection只是接口,真正的实现是由数据库厂商提供的驱动包完成的。

    Statement接口

    Statement接口用来处理发送到数据库的SQL语句对象,通过Connection对象创建。主要有三个常用方法:

    Statement stmt=conn.createStatement();
    //1.execute方法,如果执行的sql是查询语句且有结果集则返回true,如果是非查询语句或者没有结果集,返回false
    boolean flag = stmt.execute(sql);
    //2.执行查询语句,返回结果集
    ResultSetrs = stmt.executeQuery(sql);
    //3.执行DML语句,返回影响的记录数
    int flag = stmt.executeUpdate(sql);
    

    ResultSet接口

    执行查询SQL语句后返回的结果集,由ResultSet接口接收。
    常用处理方式:遍历 / 判断是否有结果(登录)。

    String sql = "select * from emp";
    ResultSetrs = stmt.executeQuery(sql);
    while (rs.next()) {
        System.out.println(rs.getInt("empno")+",“
           +rs.getString("ename") );
    }
    

    查询的结果存放在ResultSet对象的一系列行中,指针的最初位置在行首,使用next()方法用来在行间移动,getXXX()方法用来取得字段的内容。

    处理结果集ResultSet

    ResultSet代表DQL查询结果,是2维结果. 其内部维护了一个读取数据的游标,默认情况在,游标在第一行数据之前, 当调用next() 方法时候, 游标会向下移动,并将返回结果集中是否包含数据, 如果包含数据就返回true. 结果集还提供了很好getXXX方法用于获取结果集游标指向当前行数据.

    原理:

    处理结果集ResultSet原理

    案例:

    /**
     * 执行DQL 语句 
     */
    public class Demo03 {
        public static void main(String[] args) 
            throws Exception{
            //注册驱动
            String driver="oracle.jdbc.OracleDriver";;
            Class.forName(driver);
            //连接数据库
            String url="jdbc:oracle:thin:@192.168.201.227:1521:orcl";
            String user="openlab";
            String pwd="open123";
            Connection conn=DriverManager.getConnection(
                    url, user, pwd);
            //创建Statement
            Statement st=conn.createStatement();
            //执行SQL(dql)
            String sql="select id, name "
                    + "from robin_demo ";
            ResultSet rs=st.executeQuery(sql);
            //处理结果 ...
            //rs结果集中包含一个游标,游标默认在结果集
            //的第一行之前
            //rs.next():移动结果集游标到下一行
            //检查是否有数据, 如果有返回true, 否则false
            while(rs.next()){
                //getXXX(列名): 返回结果集当前行中
                // 指定列名的数据.
                int id = rs.getInt("id");
                String name=rs.getString("name");
                //输出查询结果
                System.out.println(id+","+name);
            }
            //关闭连接
            conn.close();
        }
    }
    
    

    使用Properties 读取配置文件

    Properties 是Java中专门用于读取配置文件的API.

    1. 其底层就是文本文件IO
    2. Properties 本身 实现 Map接口, 内部是散列表
    3. Properties限定了key和Value都是String 类型.

    Properties 常用API方法:

    • load(流) 读取一个配置文件
    • String getProperty(key) 读取一个属性值

    使用步骤:

    1. 创建Properties对象
    2. 利用load方法读取配置文件
    3. 利用getProperty查询属性文件的内容

    案例, 读取配置文件:

    在resource 文件夹中添加配置文件 db.properties:

    # db.properties
    jdbc.driver=oracle.jdbc.OracleDriver
    jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl
    jdbc.username=openlab
    jdbc.password=open123
    
    

    使用Properties读取配置文件内容:

    public class Demo05 {
        public static void main(String[] args)
            throws IOException{
            // Properties 就是为了读取
            // *.properties 文件而设计的API
            // 其底层就是文本文件IO
            // Properties 本身 实现 Map接口
            // 内部是散列表, 限定了key和Value都是
            // String 类型.
    
            //方法: load(流) 将文件就读取为散列表
            //String getProperty(key) 查询value
    
            //使用步骤
            //1 创建 Properties 对象
            Properties cfg = new Properties();
            System.out.println(cfg);
            System.out.println(cfg.size());
            System.out.println(cfg.isEmpty());
            //2\. 利用load方法读取文件
            InputStream in=
                Demo05.class.getClassLoader()
                .getResourceAsStream("db.properties");
            //执行以后,将文件内容读取到散列表中了
            cfg.load(in); 
            System.out.println(cfg);
            System.out.println(cfg.size());
    
            //3\. 查找文件内容, 就是读取文件内容
            String s=
                cfg.getProperty("jdbc.driver");
            System.out.println(s); 
        }
    }
    
    

    利用配置文件可以将程序中的参数保存到配置文件中, 修改程序参数只需要修改配置文件即可.

    管理数据库连接

    在软件中数据库连接使用非常频繁, 如果每次都创建连接, 就会造成代码的大量冗余, 常规的做法是建立数据库连接工具类, 封装数据库连接过程, 统一数据库连接过程, 使用时候就可以简化代码.

    实现步骤:

    1. 创建数据库连接参数文件 db.properties

    2. 创建DbUtils.java 封装数据库连接方法

      • 利用Properties读取配置文件夹中的数据库连接参数
      • 创建方法 getConnection 封装数据库连接过程
    3. 使用 getConnection 方法

    创建配置文件 db.properties

    # db.properties
    jdbc.driver=oracle.jdbc.OracleDriver
    jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl
    jdbc.username=openlab
    jdbc.password=open123
    
    

    创建DbUtils.java

    public class DbUtils {
        static String driver;
        static String url;
        static String username;
        static String password;
    
        //读取文件中的数据库连接参数
        static{
            //初始化静态属性
            //1\. 利用Properties 读取配置文件
            //2\. 从配置文件中查找 相应参数值
            try{
                Properties cfg=new Properties();
                InputStream in=
                    DbUtils.class.getClassLoader()
                    .getResourceAsStream("db.properties");
                cfg.load(in);
                System.out.println(cfg); 
                //初始化 连接参数 
                driver=cfg.getProperty("jdbc.driver");
                url=cfg.getProperty("jdbc.url");
                username=cfg.getProperty("jdbc.username");
                password=cfg.getProperty("jdbc.password");
                in.close();
            }catch(Exception e){
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 封装创建数据库连接的过程
         * 简化数据库连接
         */
        public static Connection getConnection(){
            try{
                Class.forName(driver);
                Connection conn=
                    DriverManager.getConnection(
                    url, username, password);
                return conn;
            }catch(Exception e){
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    
        //DbUtils.java
        /*
         * 关闭数据库的连接方法, 封装复杂的关闭过程
         */
        public static void close(Connection conn){
            if(conn!=null){
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace(); 
                }
            }
        }
    }
    
    

    说明:

    1. driver url username password 是4个数据库连接参数, 因为只需要一份,则定义为静态变量.
    2. 静态代码块的目的是从配置文件中读取4个数据库连接参数的值.
    3. getConnection方法封装了数据库连接过程
    4. close方法封装了数据库连接关闭的过程

    DbUtils 的使用:

    public class Demo06 {
        public static void main(String[] args) {
            Connection conn=null;
            try{
                conn=DbUtils.getConnection();
                Statement st=conn.createStatement();
                String sql="select * from robin_demo";
                ResultSet rs=st.executeQuery(sql);
                while(rs.next()){
                    int id=rs.getInt("id");
                    String name=rs.getString("name");
                    System.out.println(id+","+name);
                }
                rs.close();//释放查询结果
                st.close();//释放语句对象
            }catch(Exception e){
                e.printStackTrace();
            }finally {
                DbUtils.close(conn);
            }
        }
    }
    
    

    显然: 使用DbUtils可以简化JDBC代码的书写.
    这个代码中在finally中关闭数据库连接, 其好处是可靠关闭连接.

    最后,如果大家对这些内容感兴趣的话可以持续关注我,每天都有更新喔~
    当然,需要以往的内容也可以找我阅读哦,我这里都整合起来了方便大家阅读,详情点击这里!!!

    相关文章

      网友评论

        本文标题:JDBC编程一一jdbc原理和基础编程

        本文链接:https://www.haomeiwen.com/subject/yptiwktx.html