zoukankan      html  css  js  c++  java
  • jdbc基础

    1、什么是jdbc

      sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来同一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了
     

    2、使用jbdc发送sql的前提

        登录数据库服务器(连接数据库服务器)

                数据库的IP地址

                端口

                数据库用户名

                密码

    3、使用jdbc连接数据的步骤

     1.注册数据库驱动
       DriverManager.registerDriver(new Driver());//缺点一:观察mysqlDriver源码发现此方法导致了数据库驱动被注册了两次。缺点二:整个程序域mysql数据库驱动绑定增加了耦合性
       Class.forName(“com.mysql.jdbc.Driver”);
       2.获取连接
       DriverManager.getConnection(url, user, password);
         ~url的写法:
            Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
            SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
            MySql—jdbc:mysql://localhost:3306/sid
         ~url可以接的参数
            user、password
            useUnicode=true&characterEncoding=UTF-8

      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day10", "root", "root");  

       3.获取传输器
        createStatement():创建向数据库发送sql的statement对象。
        prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

       Statement stat = conn.createStatement();
       4.利用传输器执行sql语句获取结果集
          executeQuery(String sql) :用于向数据发送查询语句。
          executeUpdate(String sql):用于向数据库发送insert、update或delete语句
          execute(String sql):用于向数据库发送任意sql语句

       ResultSet rs = stat.executeQuery("select * from user");

       5.遍历结果集取出结构
          ResultSet以表的样式在内存中保存了查询结果,其中还维护了一个游标,最开始的时候游标在第一行之前,每调用一次next()方法就试图下移一行,如果移动成功返回true;
          ResultSet还提供了很多个Get方法,用来获取查询结果中的不同类型的数据
          除了next方法,还有以下方法可以用来遍历结果集:
             next():移动到下一行
             Previous():移动到前一行
             absolute(int row):移动到指定行
             beforeFirst():移动resultSet的最前面。
             afterLast() :移动到resultSet的最后面。

          while(rs.next()){
             String name = rs.getString("name");
             System.out.println(name);
            }
       6.释放资源
          conn是一个有限的资源,用完立即要释放表
          stat占用内存,所以使用完后也要释放
          rs占用内存,所以使用完后也要释放
          释放时后创建的先释放

          rs.close();
          stat.close();
          conn.close();

    4、jdbc接口的核心api

      java.sql.*   和  javax.sql.*

     

                                |- Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。

                                         |- connect(url, properties):  连接数据库的方法。

                                                            url: 连接数据库的URL

                                                                     URL语法: jdbc协议:数据库子协议://主机:端口/数据库

                                                                     user: 数据库的用户名

                                                                     password: 数据库用户密码

                                |- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序

                                         |-registerDriver(driver)  : 注册驱动类对象

                                         |-Connection getConnection(url,user,password);  获取连接对象

     

                                |- Connection接口: 表示java程序和数据库的连接对象。

                                                   |- Statement createStatement() : 创建Statement对象

                                                   |- PreparedStatement prepareStatement(String sql)  创建PreparedStatement对象

                                                   |- CallableStatement prepareCall(String sql) 创建CallableStatement对象

     

                                |- Statement接口: 用于执行静态的sql语句

                                                   |- int executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML)

                                                   |- ResultSet executeQuery(String sql)  :执行的静态的查询sql语句(DQL)

     

                                         |-PreparedStatement接口:用于执行预编译sql语句

                                                            |- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)

                                                            |-ResultSet executeQuery()  : 执行预编译的查询sql语句(DQL)

     

                                                   |-CallableStatement接口:用于执行存储过程的sql语句(call xxx)

                                                                     |-ResultSet executeQuery()  : 调用存储过程的方法

     

     

                                |- ResultSet接口:用于封装查询出来的数据

                                                   |- boolean next() : 将光标移动到下一行

                                                   |-getXX() : 获取列的值

    5、jdbc链接数据库的比较

    import java.sql.Connection;
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.util.Properties;
    
    import org.junit.Test;
    /**
     * jdbc连接数据库
     * 
     *
     */
    public class Demo1 {
        //连接数据库的URL
        private String url = "jdbc:mysql://localhost:3306/day17";
                            // jdbc协议:数据库子协议:主机:端口/连接的数据库   //
    
        private String user = "root";//用户名
        private String password = "root";//密码
        
        /**
         * 第一种方法
         * @throws Exception
         */
        @Test
        public void test1() throws Exception{
            //1.创建驱动程序类对象
            Driver driver = new com.mysql.jdbc.Driver(); //新版本
            //Driver driver = new org.gjt.mm.mysql.Driver(); //旧版本
            
            //设置用户名和密码
            Properties props = new Properties();
            props.setProperty("user", user);
            props.setProperty("password", password);
            
            //2.连接数据库,返回连接对象
            Connection conn = driver.connect(url, props);
            
            System.out.println(conn);
        }
        
        /**
         * 使用驱动管理器类连接数据库(注册了两次,没必要)
         * @throws Exception
         */
        @Test
        public void test2() throws Exception{
            Driver driver = new com.mysql.jdbc.Driver();
            //Driver driver2 = new com.oracle.jdbc.Driver();
            //1.注册驱动程序(可以注册多个驱动程序)
            DriverManager.registerDriver(driver);
            //DriverManager.registerDriver(driver2);
            
            //2.连接到具体的数据库
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println(conn);
            
        }
        
        /**
         * (推荐使用这种方式连接数据库)
         * 推荐使用加载驱动程序类  来 注册驱动程序 
         * @throws Exception
         */
        @Test
        public void test3() throws Exception{
            //Driver driver = new com.mysql.jdbc.Driver();
            
            //通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            
            //Driver driver2 = new com.oracle.jdbc.Driver();
            //1.注册驱动程序(可以注册多个驱动程序)
            //DriverManager.registerDriver(driver);
            //DriverManager.registerDriver(driver2);
            
            //2.连接到具体的数据库
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println(conn);
            
        }
    
    }

    一个优化后的完整代码

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class JDBCDemo1 {
    
        private String url = "jdbc:mysql://localhost:3306/mydata";
        private String user = "root";
        private String password = "root";
    
        @Test
        public static void main(String[] args){
            Connection conn = null;
            Statement stat = null;
            ResultSet rs = null;
            try{
                //1.注册数据库驱动
                Class.forName("com.mysql.jdbc.Driver");
                /*//2.获取数据库连接
                conn = DriverManager.getConnection("jdbc:mysql:///mydata?user=root&password=root");*/
                //2.获取连接对象,上面一种方法也可以
                conn = DriverManager.getConnection(url, user, password);        
                //3.获取传输器对象
                stat = conn.createStatement();
                //4.利用传输器传输sql语句到数据库中执行,获取结果集对象
                rs = stat.executeQuery("select * from user");
                //5.遍历结果集获取查询结果
                while(rs.next()){
                    String name = rs.getString("name");
                    System.out.println(name);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                //6.关闭资源(顺序:后打开的先关闭)
                if(rs!=null){
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        rs = null;
                    }
                }
                if(stat!=null){
                    try {
                        stat.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        stat = null;
                    }
                }
                if(conn!=null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        conn = null;
                    }
                }
            }
        }
    }

    使用工具类优化后的代码

    1、配置文件db.properties 放在src下

    url=jdbc:mysql://localhost:3306/maydata
    user=root
    password=root
    driverClass=com.mysql.jdbc.Driver

    2、工具类

    /**
     * jdbc工具类
     * 
     *
     */
    public class JdbcUtils {
        private static String url = null;
        private static String user = null;
        private static String password = null;
        private static String driverClass = null;
        
        /**
         * 静态代码块中(只加载一次)
         */
        static{
            try {
                //读取db.properties文件
                Properties props = new Properties();
                /**
                 *  . 代表java命令运行的目录
                 *  在java项目下,. java命令的运行目录从项目的根目录开始
                 *  在web项目下,  . java命令的而运行目录从tomcat/bin目录开始
                 *  所以不能使用点.
                 */
                //FileInputStream in = new FileInputStream("./src/db.properties");
                
                /**
                 * 使用类路径的读取方式
                 *  / : 斜杠表示classpath的根目录
                 *     在java项目下,classpath的根目录从bin目录开始
                 *     在web项目下,classpath的根目录从WEB-INF/classes目录开始
                 */
                InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
                
                //加载文件
                props.load(in);
                //读取信息
                url = props.getProperty("url");
                user = props.getProperty("user");
                password = props.getProperty("password");
                driverClass = props.getProperty("driverClass");
                
                
                //注册驱动程序
                Class.forName(driverClass);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("驱程程序注册出错");
            }
        }
    
        /**
         * 抽取获取连接对象的方法
         */
        public static Connection getConn(){
            try {
                Connection conn = DriverManager.getConnection(url, user, password);
                return conn;
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        
        
        /**
         * 释放资源的方法
         */
        
        public static void close(ResultSet rs, Statement stat,Connection conn){
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    rs = null;
                }
            }
            if(stat!=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    stat = null;
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    conn = null;
                }
            }
        
        }
    }

    3、使用工具类的实现数据的CRUD

    public class JDBCDemo2 {
    
        @Test
        public void add() {
            Connection conn = null;
            Statement stat = null;
            try {
                // 1.注册数据库驱动
                // 2.获取连接
                conn = JDBCUtils.getConn();
                // 3.获取传输器对象
                stat = conn.createStatement();
                // 4.执行sql语句
                int count = stat.executeUpdate("insert into user values (null,'zhaoliu','123456','zhaoliu@qq.com','1999-09-09')");
                // 5.处理结果
                if (count > 0) {
                    System.out.println("执行成功!影响到的行数为" + count);
                } else {
                    System.out.println("执行失败!!");
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //6.关闭资源
                JDBCUtils.close(null, stat, conn);
            }
        }
    }
        @Test
        public void delete(){
            Connection conn = null;
            Statement stat = null;
            ResultSet rs = null;
            try{
                conn = JDBCUtils.getConn();
                stat =  conn.createStatement();
                stat.executeUpdate("delete from user where name='zhaoliu'");
            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                JDBCUtils.close(rs, stat, conn);
            }
        }
        
        @Test
        public void find(){
            Connection conn = null;
            Statement stat = null;
            ResultSet rs = null;
            try{
                conn = JDBCUtils.getConn();
                stat =  conn.createStatement();
                rs = stat.executeQuery("select * from user where name='zhaoliu'");
                while(rs.next()){
                    String name = rs.getString("name");
                    String password = rs.getString("password");
                    System.out.println(name+":"+password);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                JDBCUtils.close(rs, stat, conn);
            }
        }
        
        @Test
        public void update() {
            Connection conn = null;
            Statement stat = null;
            try{
                conn = JDBCUtils.getConn();
                stat =  conn.createStatement();
                stat.executeUpdate("update user set password=999 where name='zhaoliu'");
            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                JDBCUtils.close(null, stat, conn);
            }
        }
        
        
  • 相关阅读:
    600+ 道 Java面试题及答案整理(2021最新版)
    Spring Boot + Web Socket 实现扫码登录,这种方式太香了!!
    小团队适合引入 Spring Cloud 微服务吗?
    Netty 通道怎么区分对应的用户?
    软件开发打败了 80 %的程序员
    一个最简单的消息队列,带你理解 RabbitMQ!
    厉害了,Netty 轻松实现文件上传!
    Netty 是如何解决 TCP 粘包拆包的?
    图解 Git,一目了然!
    面试官:谈谈分布式一致性机制,我一脸懵逼。。
  • 原文地址:https://www.cnblogs.com/flei/p/6727288.html
Copyright © 2011-2022 走看看