JDBC DML/DQL入门操作

   java项目进入mysql-connector-java-5.1.48.jar

   MySQL5.7

一、JDBC概述

1、持久化(persistence)

    1)什么是持久化?

         来自孙卫琴写的《精通Hibernate:Java对象持久化技术详解》中,的解释,感觉还是比较完整:

狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作(持久化就是将有用的数据
以某种技术保存起来,将来可以再次取出来应用,数据库技术,将内存数据一文件的形式保存在永久介质中(磁盘等)都是持久化的例子.)。
    保存:把域对象永久保存到数据库。
    更新:更新数据库中域对象的状态。
    删除:从数据库中删除一个域对象。
    加载:根据特定的OID,把一个域对象从数据库加载到内存。
    查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。

    2)为什么要持久化?

持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。优点:
    通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
    代码重用性高,能够完成大部分数据库操作;
    松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。

2、JDBC(Java DataBase Connectivity)

     JDBC(java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

JDBC访问数据库的主要两种形式:

    1)直接使用JDBC的API访问数据库服务器(MySQL/Oracle)。

    2)间接使用JDBC的API访问数据库服务器,即使用第三方ORM工具(MyBatis/Hibernate等),底层依然是JDBC.

        JDBC是java访问数据库的基石,其他技术都是对JDBC的封装。

JDBC是java访问数据库的一个标准,是进行数据库访问连接的抽象层,接口的具体实现由各大数据库厂商来完成,即驱动包。

JDBC的API在 java.sql包下,在开发中,导包是全部使用java.sql包中的,通用

二、JDBC实现CRUD

1、操作JDBC的步骤:

1、加载注册驱动
2、获取连接对象
3、创建语句对象
4、执行SQL语句
5、释放/关闭资源

2、操作JDBC用到的核心接口:具体查看API

    1)java.sql.Driver接口:

         每个驱动程序类必须实现的接口。

        

        加载注册驱动时,

        通过反射机制会把 com.mysql.jdbc.Driver类字节码加载进JVM,同时,会JVM执行该字节码中的静态代码块。

      

    2)java.sql.DriverManager类: 

         用于管理一组JDBC驱动程序的基本服务 

参数 
url - 连接数据库的URL,以mysql连接
      格式为jdbc:mysql://localhost:3306/数据库名
      如果连接为本机,端口为默认的3306,则可简写为jdbc:mysql:///数据库名 
user - 正在连接的数据库用户名 
password - 用户密码

    3)java.sql.Connection接口:

        与特定数据库的连接(会话)。 执行SQL语句并在连接的上下文中返回结果。

    • Statement createStatement()

      创建一个 Statement对象,用于将SQL语句发送到数据库。

      void close()

      Connection发布此 Connection对象的数据库和JDBC资源,而不是等待它们自动释放。

    4)java.sql.Statement接口:

         用于执行静态SQL语句并返回其生成的结果的对象。

    • void close()

      Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。

      ResultSet executeQuery(String sql)

      执行给定的SQL语句,该语句返回单个 ResultSet对象。

      int executeUpdate(String sql)

      执行给定的SQL语句,这可能是 INSERTUPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。

对于DQL返回查询的结果集
对于DML返回受影响的行数
对于DDL返回0

    5)java.sql.ResultSet接口:

         表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

         ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。

    • void close()

      ResultSet释放此 ResultSet对象的数据库和JDBC资源,而不是等待其自动关闭时发生。

      boolean next()

      将光标从当前位置移动到下一行。

3、创建表

    // 创建t_user表,异常先抛出
    @Test
    public void testCreatTable() throws ClassNotFoundException, SQLException {
        String sql = "CREATE TABLE t_user (id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,username varchar(30) ,age int(11) ) ;";
        //1、加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2、获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "123456");
        //3、创建语句对象
        Statement statement = connection.createStatement();
        //4、执行SQL语句
        int rows = statement.executeUpdate(sql);
        //5、释放/关闭资源
        statement.close();
        connection.close();
        System.out.println(rows); //0
    }

4、新增、修改和删除

    // 新增,修改和删除操作
    @Test
    public void testIUD() throws Exception {
//        String sql = "INSERT INTO t_user(username,age) VALUES('赵云',17)";
//        String sql = "UPDATE t_user SET username='赵子龙' WHERE id = 1";
        String sql = "DELETE FROM t_user WHERE id = '1'";

        //1、加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2、获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
        //3、创建语句对象
        Statement statement = connection.createStatement();
        //4、执行SQL语句
        int rows = statement.executeUpdate(sql);
        //5、释放/关闭资源
        statement.close();
        connection.close();
        System.out.println(rows); //1
    }

5、select查询

1)查询统计记录条数

    /*
    1、查询t_user表共多少条记录
    mysql> SELECT count(id) rows FROM t_user;
            +------+
            | rows |
            +------+
            |    4 |
            +------+
            1 row in set (0.04 sec)
     */
    @Test
    public void testSelectCount() throws Exception {
        String sql = "SELECT count(id) rows FROM t_user";
        //1、加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2、获取连接对象
        Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
        //3、创建语句对象
        Statement statement = connection.createStatement();
        //4、执行SQL语句
        ResultSet resultSet = statement.executeQuery(sql);
        //处理结果集
        if(resultSet.next()){
//            long totalCount = resultSet.getLong(1);
            long totalCount = resultSet.getLong("rows");
            System.out.println(totalCount); //4
        }
        //5、释放/关闭资源
        statement.close();
        connection.close();
    }

2)查询结果集

    /*
    2、查询t_user表中age >= 18 的记录
        mysql> SELECT *  FROM t_user WHERE age >= 18;
        +----+----------+-----+
        | id | username | age |
        +----+----------+-----+
        |  3 | 赵云     |  18 |
        |  4 | 后裔     |  18 |
        |  5 | 猴子     |  19 |
        +----+----------+-----+
        3 rows in set (0.04 sec)
     */
    @Test
    public void testSelect() throws Exception {
        String sql = "SELECT *  FROM t_user WHERE age >= 18";
        //1、加载注册对象
        Class.forName("com.mysql.jdbc.Driver");
        //2、获取连接数据库
        Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
        //3、创建语句对象
        Statement statement = connection.createStatement();
        //4、执行SQL语句
        ResultSet resultSet = statement.executeQuery(sql);
        //处理结果集
        while (resultSet.next()){
            long id = resultSet.getLong("id");
            String username = resultSet.getString("username");
            int age = resultSet.getInt("age");
            System.out.println(id + "," + username + "," + age);
        }
        //5、释放/关闭资源
        statement.close();
        connection.close();
    }

 

     站在前辈的肩膀上,每天进步一点点

ends~

发布了248 篇原创文章 · 获赞 59 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42402854/article/details/100581119