day01

JDBC

JDBC 是什么

JDBC是Java应用程序和数据库之间的通信桥梁,是Java应用程序访问数据库的通道.

  1. JDBC标准主要有一组接口组成,其好处是统一了各种数据访问方式.
  2. JDBC接口的实现类称为数据库驱动,由各个数据库厂商提供.使用JDBC必须导入这个驱动!

一定要知道驱动是什么!!

使用JDBC

JDBC使用步骤:

  1. 导入JDBC驱动jar
    • 使用Maven可以便捷的导入数据库驱动.
  2. 注册JDBC驱动
    • 参数:“驱动程序类名”
    • Class.forName("驱动程序名");
  3. 获得Connnection对象
    • 需要3个参数:url,username,password
    • 连接到数据库
  4. 创建Statement(语句)对象
    • conn.createStatement()方法创建对象
    • 用于执行 SQL 语句
    • execute(ddl) 执行任何SQL,常用执行DDL 数据定义语言
    • executeUpdate(dml) 执行DML 语句,如:insert update delete 数据操纵语句
    • executeQuery(dql) 执行DQL语句,如:select
  5. 处理SQL执行结果:
    • execute(ddl) 如果没有异常则成功.
    • executeUpdate(dml) 返回数字,表示更新“行”数量,抛出异常则失败
    • executeQuery(dql) 返回ResultSet(结果集)对象,代表2维查询结果
      使用for遍历处理,如果查询失败抛出异常!
  6. 关闭数据连接!关闭数据连接!关闭数据连接!
    • conn.close();

案例:

public class Demo01 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
//      System.out.println("OK!");
        //链接到数据库
        String url = "jdbc:mysql://localhost:3306/tedustore";
        String username = "root";
        String password = "admin";
        //getConnection() 方法查找并并且尝试
        //链接到数据库,如果不成功讲抛出异常
        Connection conn = DriverManager.getConnection(url, username, password);
        System.out.println(conn.getClass());
        //输出conn应用对象的实际类型
        //证明:驱动程序提供了Connection接口的实现类
        //创建“语句”对象
        Statement st = conn.createStatement();
        //执行SQL(ddl)
        String ddl = "create table robin_demo(id int,name varchar(20))";
        boolean b = st.execute(ddl);
        //返回结果:true 表示有结果集
        //        false 没有结果集
        //        创建失败抛出异常
        //如何判断结果:如果没有异常,则创建成功
        System.out.println(b);
        conn.close();
    }
}

执行 DML 语句 案例:

/**
 * 执行DML语句
 * @author ghang
 *
 */
public class Demo02 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //连接到数据库
        String url = "jdbc:mysql://localhost:3306/tedustore";
        String username = "root";
        String password = "admin";
        Connection conn = DriverManager.getConnection(url, username, password);
        //创建 Statement
        Statement st = conn.createStatement();
        //执行DML,使用executeUpdate方法
//      String dml = "insert into robin_demo(id,name) values(1,'TOM')";
//      String dml = "update robin_demo set name='Jerry' where id =1";
        String dml = "delete from robin_demo where id=1";
        int n = st.executeUpdate(dml);
        System.out.println(n);
        //关闭连接!!
        conn.close();
        //select * from rabin_demo
    }
}

处理结果集ResultSet

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

rs.nexe() 检查是否有当前行

RessultSet rs = st.executeQuery(sql);

原理:

1.png

案例:

public class Demo03 {
    public static void main(String[] args) throws Exception {
        //注册驱动
        String driver = "com.mysql.jdbc.Driver";
        Class.forName(driver);
        //连接数据库
        String url = "jdbc:mysql://localhost:3306/tedustore";
        String user = "root";
        String pwd = "admin";
        Connection conn = DriverManager.getConnection(url, user, pwd);
        //创建Statement
        Statement st = conn.createStatement();
        
        //执行SQL
        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. Prpperties限定了key和Value都是String 类型.

Properties 常用API方法:

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

使用步骤:

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

案例:

在resource 文件夹中添加配置文件:

# db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tedustore
jdbc.username=root
jdbc.password=admin

使用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. 利用loag方法读取文件
        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);
    }
}

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

管理数据库连接

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

实现步骤:ccc

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

创建配置文件 db.propertes

#jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tedustore
jdbc.username=root
jdbc.password=admin

创建DbUtils.java

public class DbUtils {
    static String driver;
    static String url;
    static String username;
    static String password;

    //读取文件中的数据库连接参数
    static {
        try {
            //初始化静态
            //1. 利用Properties 读取配置文件
            //2. 从配置文件中查找 相应参数值
            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();
        }
    }

    /**
     * 封装创建数据库连接的过程
     * 简化数据库连接
     */
    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);
        }
    }

    /**
     * 关闭数据库的连接,封装复杂的关闭过程
     */
    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方法封装了数据库连接关闭的过程

     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中关闭数据库连接,其好处是可靠关闭连接.


作业:

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • 非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿记笔记啊记笔记 Hibernate的简介 什么是Hib...
    键盘瞎阅读 725评论 0 7
  • 本文包括传统JDBC的缺点连接池原理自定义连接池开源数据库连接池DBCP连接池C3P0连接池Tomcat内置连接池...
    廖少少阅读 16,738评论 0 37
  • 这周的课听得有些迷糊,现在记录下,以备后面查看。 七剑客: 1.同步 2.网络 http1.0和http1.1的区...
    shenhua8369阅读 172评论 0 0