JDBC基础学习--Java学习记录

JDBC: Java的数据库连接规范。

JDBC是一种Java技术可以实现Java代码连接数据库,然后操作数据库。
编程语言最核心的功能之一:就是增删改查处理,分析数据等都要与数据库的数据进行交互。

什么是JDBC:Java DataBase Connectivity:(Java的数据库连接) JDBC是Java访问数据库的`标准规范`
JDBC的作用:Java通过JDBC就可以操作数据库了

JDBC是Java连接数据库的规范:所有的数据库厂商都要按照这个标准来设计连接数据库的实现。
JDBC中都是一些接口,具体的实现交给数据库厂商去实现。
程序员只需要学习JDBC这些接口,然后拿着具体数据库厂商的实现就可以操作对应数据库了。

使用JDBC必须有:
    (1)JDBC规范代码:sun公司提供,已经在JDK中。
    (2)对应的数据库实现:数据库驱动。
     思想:Java定义连接数据库的规范:JDBC
          数据库厂商实现JDBC规范:产生驱动。
          程序员学习JDBC规范即可!

驱动的加载。

    开发JDBC连接数据库的程序需要两个重要因素:
        a.JDBC的规范(JDK自带)
             1. java.sql:JDBC访问数据库的基础包,在JavaSE中的包。如:java.sql.Connection
             2. javax.sql: JDBC访问数据库的扩展包。

        b.对应数据库厂商的驱动:mysql-connector-java-5.1.37-bin.jar
             点击驱动jar包,右键-> add as library
             3. 数据库的驱动,各大数据库厂商来实现。如:MySQL的驱动:
                com.mysql.jdbc.Driver

    MySQL数据库的驱动名称是: com.mysql.jdbc.Driver
    DriverManager:驱动管理器类:
        -- public static void registerDriver(java.sql.Driver driver):注册驱动

    小结:
     从JDK1.5以后这个注册驱动就可以省略了
     注册驱动的企业级写法:
         驱动中com.mysql.jdbc.Driver类中已经通过静态代码块
         实现了驱动对象的创建和自动注册到驱动管理器
         所以我们只需要加载驱动类即可!!
         格式:Class.forName("com.mysql.jdbc.Driver");
 */
     public class DriverDemo01 {
    public static void main(String[] args) throws Exception {
        /** 驱动必须加载才可以使用,否则驱动只是一个死的代码 */
        /** 1.创建驱动对象  */
        //Driver driver = new com.mysql.jdbc.Driver();
        /** 2.给当前程序注册驱动
         *  JDBC提供了一个驱动管理器,负责加载驱动,然后以后
         *  操作数据库都是由驱动管理器来维护的。
         *
         *  驱动是自动注册的!!我们无需手工注册驱动
         */
        // DriverManager.registerDriver(driver);

        /** 驱动中已经通过静态代码块实现了驱动对象的创建和自动注册到驱动管理器
         *  所以我们只需要加载驱动类即可!!
         * */
        Class.forName("com.mysql.jdbc.Driver");


        /** 到这儿就可以使用了,接下来通过驱动管理器使用驱动去连接对应的数据库 */
    }
}
    目标:JDBC获取与数据库的连接对象。
    Java提供了一个连接对象:java.sql.Connection,代表了与数据库的连接通道。

    JDBC获取连接的步骤:
        (1)加载驱动,注册驱动到驱动管理器,操作数据库最终是由驱动完成的。
        (2)通过驱动管理器调用方法得到连接对象。
        (3)通过连接操作数据库
    DriverManager获取连接的方法:
         1.public static Connection getConnection(String url ,java.util.Properties info);
              -- 参数一:连接数据库的地址
                    jdbc:mysql://localhost:3306/dlei?characterEncoding=utf8
                    规范:数据库类型://数据库地址:端口/连接的数据库名称?编码参数等
              -- 参数一:申明连接数据库的用户名和密码。
         2.public static Connection getConnection(String url, String user, String password)
    小结:
        获取连接
        Connection con = DriverManager.getConnection(url,"root","root");

 */
public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {
        /**  (1)加载驱动,注册驱动到驱动管理器,操作数据库最终是由驱动完成的。 */
        Class.forName("com.mysql.jdbc.Driver");
        /**  (2)通过驱动管理器调用方法得到连接对象。 */
        /*
        // 地址
        String url = "jdbc:mysql://localhost:3306/test";
        // 封装用户名和密码
        Properties pro = new Properties();
        pro.setProperty("user","root");
        pro.setProperty("password","root");
        (3)通过连接操作数据库
        Connection con = DriverManager.getConnection(url , pro); */

        // 地址
        String url = "jdbc:mysql://localhost:3306/test";
        /** (3)连接数据库: 这种方式封装了上面的写法,推荐使用! */
        Connection con = DriverManager.getConnection(url,"root","root");
        System.out.println(con);
    }
}

JDBC代码实现数据的查询操作。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 *  (1)注册驱动
 *  (2)获取连接
 *  (3)得到发送SQL语句的对象Statement
 *       Statement stm = con.createStatement();
 *  (4)正式发送并执行sql语句得到结果集对象ResultSet
 *  (5)解析结果集的数据(遍历结果集)
 *  (6)关闭资源
 *
 *  Statement发送执行sql语句查询数据的方法:
 *        -- boolean execute(String sql):建表操作
 *        -- int executeUpdate(String sql) throws SQLException:增删改数据返回影响的行数
 *        -- ResultSet executeQuery(String sql) throws SQLException:查询数据返回结果集
 *
 *  ResultSet的方法:
 *        -- boolean next():向结果集下一行移动,移动后判断改行是否有数据,有返回true ,反之
 *        -- String getString(String 列名称): 根据列名称取当前行的列值。返回String
 *        -- int getInt(String 列名称): 根据列名称取当前行的列值。返回int
 *        -- double getDouble(String 列名称): 根据列名称取当前行的列值。返回double
 *        -- Object getObject(String 列名称): 根据列名称取当前行的列值。返回Object
 *  小结:
 *      查询数据用:ResultSet executeQuery(String sql) throws SQLException:查询数据返回结果集
 */
public class JDBCQueryDemo01 {
    public static void main(String[] args) {
        Connection con =  null ;
        Statement stm = null ;
        ResultSet rs = null ;
        try {
            // (1)注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // (2)获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/test";
            con = DriverManager.getConnection(url,"root","root");
            // (3)得到发送SQL语句的对象Statement
            stm = con.createStatement();

            // (4)正式发送并执行sql语句得到结果集对象ResultSet
//            ResultSet rs = stm.executeQuery("select * from tb_user ");
            rs = stm.executeQuery("select * from tb_user where id > 3");
            // (5)解析结果集的数据(遍历结果集)
            //  rs.next():往下移动光标,移动到下一行,看下一行是否有数据有返回true,反之
            while(rs.next()){
                    // 根据列名称取当前行的列值
//                    int id = rs.getInt(0); // 不推荐,按照位置找当前行的列值
                    int id = rs.getInt("id");
                    String logiName = rs.getString("loginName");
                    String passWord = rs.getString("passWord");
                    String userName = rs.getObject("userName")+"";
//                    String userName = rs.getString("userName");
                    System.out.println("id="+id+",lginName="+logiName+",passWord="+passWord
                +",userName="+userName);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // (5)关闭资源
            try{
                if(stm!=null)stm.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                if(con!=null)con.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                if(rs!=null)rs.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
     目标:JDBC事务的引入。

     转账功能:
        一个账户减去500 ,另一个账户加500

     Connection`接口中与事务有关的方法
         1.
         void setAutoCommit(boolean autoCommit) throws SQLException;
         false:开启事务, ture:关闭事务

         2.
         void commit() throws SQLException;
         提交事务

         3.
         void rollback() throws SQLException;
         回滚事务
     小结:
        这个事物只在一次连接中操作有效,用完以后,数据库依然是自动提交!!

 */
public class TransactionDemo01 {
    public static void main(String[] args) {
        Connection con =  null ;
        Statement stm = null ;
        try {
            // (1)注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // (2)获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/test";
            con = DriverManager.getConnection(url,"root","root");
            /** 1.事物开启的第一个步骤:关闭自动提交 */
            con.setAutoCommit(false);
            // (3)得到发送SQL语句的对象Statement
            stm = con.createStatement();
            // (4)一个账户-500
            int count = stm.executeUpdate("update account set balance = balance - 500 where name ='张三'");
            System.out.println("给张三-500结果:"+count);
            // int i = 10 / 0;
            int count1 = stm.executeUpdate("update account set balance = balance + 500 where name ='李四'");
            System.out.println("给李四+500结果:"+count1);
            /** 2.事物开启的第二个步骤:无异常就提交*/
            con.commit();// 提交事物!!
            System.out.println("事物提交!!转账成功!");
        } catch (Exception e) {
            e.printStackTrace();
            try {
                /** 3.事物开启的第三个步骤:有异常就回滚*/
                con.rollback(); // 回滚事物!!
                System.out.println("事物被回滚了!!转账失败!");
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            // (5)关闭资源
            try{
                if(stm!=null)stm.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                if(con!=null)con.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

 目标: 连接工厂的设计。

    什么是连接工厂(工厂模式):
        工厂就是集中生成连接,关闭连接,配置连接信息的地方,
        工厂只需要一个,以后项目任何地方要用连接找工厂,要释放连接找工厂
        要更改数据的配置信息找工厂。
    连接工厂要提供三个功能:
        1.配置信息
        2.生产连接
        3.释放资源
    小结:
        请使用连接工厂!连接工厂的目的:简化代码!优化系统的维护和扩展!!
 */
public class ConnectionFactory {

    /**
     *  1.配置信息:常量做配置
     *  驱动名称!
     */
    public static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
    /**
     * 数据库的连接地址
     */
    public static final String DATA_BASE_URL =  "jdbc:mysql://127.0.0.1:3306/test";
    /**
     * 数据库的用户名
     */
    public static final String USER_NAME =  "root";
    /**
     * 数据库的密码
     */
    public static final String PASS_WORD =  "root";

    /** 注册驱动:*/
    static{
        try {
            Class.forName(DRIVER_NAME);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    /**
     *  2.生产连接
     */
    public static Connection getConnection() throws Exception {
        // (2)获取连接
        return  DriverManager.getConnection(DATA_BASE_URL,USER_NAME,PASS_WORD);
    }


    /**
     *  3.关闭资源
     * @param con 连接对象
     * @param stm 发送SQL语句的对象
     * @param rs  结果集对象
     */
    public static void close(Connection con , Statement stm  ,ResultSet rs) {
        try{
            if(stm!=null)stm.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        try{
            if(con!=null)con.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        try{
            if(rs!=null)rs.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }




}

 *  目标:连接工厂的使用!!
 */
public class JDBCQueryDemo02 {
    public static void main(String[] args) {
        Connection con =  null ;
        Statement stm = null ;
        ResultSet rs = null ;
        try {

            con = ConnectionFactory.getConnection();
            // (3)得到发送SQL语句的对象Statement
            stm = con.createStatement();
            // (4)正式发送并执行sql语句得到结果集对象ResultSet
//            ResultSet rs = stm.executeQuery("select * from tb_user ");
            rs = stm.executeQuery("select * from tb_user where id > 3");
            // (5)解析结果集的数据(遍历结果集)
            //  rs.next():往下移动光标,移动到下一行,看下一行是否有数据有返回true,反之
            while(rs.next()){
                    // 根据列名称取当前行的列值
//                    int id = rs.getInt(0); // 不推荐,按照位置找当前行的列值
                    int id = rs.getInt("id");
                    String logiName = rs.getString("loginName");
                    String passWord = rs.getString("passWord");
                    String userName = rs.getObject("userName")+"";
//                    String userName = rs.getString("userName");
                    System.out.println("id="+id+",lginName="+logiName+",passWord="+passWord
                +",userName="+userName);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源!
            ConnectionFactory.close(con,stm,rs);
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容