JDBC★★★★★

=声明==

该文部分代码和内容节选自其他作者文章,仅用作个人学习,特此声明

链接md文档/狂神说java/03.MySql/MySQL基础.md · 大垚大摆/java笔记 - Gitee.com

10、JDBC ★★★★★

10.1 数据库驱动和JDBC

1、数据库驱动

驱动:声卡,显卡,数据库

我们的程序会通过数据库驱动,和数据库打交道!

2、JDBC

SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称JDBC

这些规范的实现由具体的厂商去做~

对于开发人员来说,我们只需要掌握JDBC接口的操作即可!

java.sql

javax.sql

还需要导入一个数据库驱动包 mysql-connector-java-5.1.47.jar


10.2 练习:第一个JDBC程序

1、创建测试用的数据库

CREATE DATABASE jdbcstudy CHARACTER SET utf8 COLLATE utf8_general_ci;

USER jdbcstudy;

CREATE TABLE users(
  `id` INT PRIMARY KEY,
  `name` VARCHAR(40),
  `password` VARCHAR(40),
  `email` VARCHAR(60),
  `birthday` DATE
);

INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`)
VALUES(1,'张三','123456','zs@sina.com','1980-12-04'),
(2,'李四','123456','lisi@sina.com','1981-12-04'),
(3,'王五','123456','wangwu@sina.com','1982-12-04');

2、用IDEA进行测试

  • 创建一个普通项目

  • 导入数据库驱动jar包 (mysql-connector-java-5.1.47.jar)

    • 下载好jar包

    • 复制到 IDEA

    • 导入数据库驱动包即可

  • 编写测试代码

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JdbcFirstDemo {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //1.加载驱动
    //        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //推荐这种写法加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.用户信息和URL
            // useSSL=true可能会报错(是否使用安全的连接为true)
    		// url格式为  jdbc:mysql://localhost:3306/jdbctest(数据库名)?useUnicode=true(支持中文)&characterEncoding=utf8&useSSL=false
            String url = "jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false";
            String userName = "root";
            String passWord = "xy680501*";
            //3.连接成功,数据库对象 Connection代表数据库
            Connection connection = DriverManager.getConnection(url, userName, passWord);
            //4.执行SQl的对象 Statement 执行的sql对象
            Statement statement = connection.createStatement();
            //5.执行SQL的对象 去 执行SQL ,可能存在结果,查看返回的结果
            String sql = "SELECT * FROM users";
            //返回的结果集 结果集中封装了我们全部的查询的结果
            ResultSet resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                System.out.println("id="+resultSet.getObject("id"));
                System.out.println("name="+resultSet.getObject("name"));
                System.out.println("password="+resultSet.getObject("password"));
                System.out.println("email="+resultSet.getObject("email"));
                System.out.println("birthday="+resultSet.getObject("birthday"));
                System.out.println("===============================");
            }
            //6.释放连接
            resultSet.close();
            statement.close();
            connection.close();
        }
    }
    
  • 稍微分析一下上边的java代码

    • 第一步要加载驱动

      /*加载驱动
      方法一:DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      推荐用方法二加载驱动
      */
      Class.forName("com.mysql.jdbc.Driver");
      
    • 第二步要连接数据库

      • 首先,把用户信息和url分别定义为字符串

        /*把用户信息和URL定义为字符串
        useSSL=true可能会报错(是否使用安全的连接为true)
        url格式为  jdbc:mysql://localhost:3306/jdbctest(数据库名)?useUnicode=true(支持中文)&characterEncoding=utf8&useSSL=false
        */
        String url = "jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false";
        String userName = "root";
        String passWord = "xy680501*";
        
      • 然后连接数据库,之后就用connection来代表连接的jdbctest数据库

        //连接数据库,数据库对象(要用到前一步定义的用户信息和URL) 后面就用 Connection 代表数据库
        Connection connection = DriverManager.getConnection(url, userName, passWord);
        
    • 第三步是创建一份对象来执行SQL命令

      这一步就相当于创建一个sql命令栏,在命令栏里写sql语句来进行数据库操作

      //创建一个执行SQl的对象 statement
      Statement statement = connection.createStatement();
      
    • 第四步是用创建的statement对象执行SQL命令

      举个例子:现在我要查询表的全部内容并将查询结果封装为结果集形式

      //执行SQL的对象 去 执行SQL ,可能存在结果,查看返回的结果
      String sql = "SELECT * FROM users";
      //返回的结果集 结果集中封装了我们全部的查询的结果
      ResultSet resultSet = statement.executeQuery(sql);
      while (resultSet.next()) {
          System.out.println("id="+resultSet.getObject("id"));
          System.out.println("name="+resultSet.getObject("name"));
          System.out.println("password="+resultSet.getObject("password"));
          System.out.println("email="+resultSet.getObject("email"));
          System.out.println("birthday="+resultSet.getObject("birthday"));
          System.out.println("===============================");
      }
      
    • 最后要释放连接,否则就会占用大量资源

      //释放连接
      resultSet.close();
      statement.close();
      connection.close();
      
  • 运行结果

    很明显与查询表的内容一致

  • 步骤总结

    • 加载驱动
    • 连接数据库DriverManager
    • 获取执行SQL的对象 Statement
    • 获得返回的结果集
    • 释放连接

10.3 JDBC 对象解释

DriverManager

//1.加载驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//推荐这种写法加载驱动
Class.forName("com.mysql.jdbc.Driver");

Connection connection = DriverManager.getConnection(url, userName, passWord);
// connection代表数据库
// 数据库设置自动提交
// 事务提交
// 事务回滚
connection.setAutoCommit(true);
connection.commit();
connection.rollback();

URL

String url = "jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false";

// mysql默认端口3306
// 协议://主机地址:端口号/数据库名?参数1&参数2&参数3
//mysql8需要写时区
// oracle默认端口1521
// jdbc:oracle:thin:@localhost:1521:sid

Statement 和 PreparedStatement 都是执行sql对象

String sql = "SELECT * FROM users";//编写SQL

statement.executeQuery();//执行查询 返回结果集ResultSet
statement.executeUpdate();//新增,删除,修改,都用这个,返回影响到的的行数
statement.execute();//执行任何SQL
statement.executeBatch();//执行多个SQL

ResultSet 查询的结果集,封装了所有的查询结果

获得指定的数据类型

//在不知道列类型的情况下使用
resultSet.getObject();
//如果知道列类型,就使用指定的类型
resultSet.getString();
resultSet.getInt();
resultSet.getDouble();
resultSet.getBigDecimal();
resultSet.getFloat();
resultSet.getDate();
//...

遍历,指针

resultSet.beforeFirst();//移动到最前面
resultSet.afterLast();//移动到最后面
resultSet.next();//移动到下一个数据
resultSet.previous();//移动到前一行
resultSet.absolute(row);//移动到指定行

释放资源

resultSet.close();
statement.close();
connection.close();//消耗资源

10.4 Statement 对象详解

jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

Statement对象的executeUpdate方法,用于向数据库发送增、删、改的SQL语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发送了变化)。

Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。

CRUD操作-create

使用executeUpdate(String sql)方法完成数据添加操作,示例操作:

Statement statement = connection.createStatement();
String sql = "insert into user(...) values(...)";
int num = statement.executeUpdate(sql);
if (num > 0) {
    System.out.println("插入成功~");
}

CRUD操作-delete

Statement statement = connection.createStatement();
String sql = "delete from user where id=1";
int num = statement.executeUpdate(sql);
if (num > 0) {
    System.out.println("删除成功~");
}

CRUD操作-update

Statement statement = connection.createStatement();
String sql = "update user set name='' where name =''";
int num = statement.executeUpdate(sql);
if (num > 0) {
    System.out.println("修改成功~");
}

CRUD操作-read

Statement statement = connection.createStatement();
String sql = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
    //根据获取列的数据类型,分别调用resultSet的相应方法映射到java对象中
}

用代码实现数据库的增删改查操作

JDBCUtils 用于加载驱动,获取连接(该示例为连接到 jdbctest 数据库)并释放连接

连接到这个数据库

代码位置如下图所示

  1. 提取工具类

    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    /**
     * @ClassName: JDBCUtils
     * @Description: TODO 类描述
     * @Author: xy
     * @Version: 1.0
     */
    public class JDBCUtils {
        private static String driver = null;
        private static String url = null;
        private static String username = null;
        private static String password = null;
    
        static {
            try {
                InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
                Properties properties = new Properties();
                properties.load(in);
    
                driver = properties.getProperty("driver");
                url = properties.getProperty("url");
                username = properties.getProperty("username");
                password = properties.getProperty("password");
    
                //驱动只用加载一次
                Class.forName(driver);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取连接
         */
        public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url, username, password);
        }
    
        /**
         * 释放资源
         */
        public static void release(Connection con, Statement st, ResultSet rs) {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    配置文件db.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false
    username=root
    password=xy680501*
    

1.编写增删改的方法 executeUpdate

  • Insert 编写练习

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * @ClassName: testInsert
     * @Description: TODO 类描述
     * @Author: xy
     * @Version: 1.0
     */
    public class testInsert {
        public static void main(String[] args) {
            Connection con = null;
            Statement st = null;
            ResultSet rs = null;
            try {
                con = JDBCUtils.getConnection();
                st = con.createStatement();
                String sql = "INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`)\n" +
                        "VALUES (4,'钱七','123456','qianqi@sina.com','1988-12-04')";
                int num = st.executeUpdate(sql);
                if (num > 0) {
                    System.out.println("插入成功!");
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.release(con, st, rs);
            }
        }
    }
    

    如下图所示:成功插入了一行记录


  • Delete 编写练习

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * @ClassName: testDelete
     * @Description: TODO 类描述
     * @Author: xy
     * @Version: 1.0
     */
    
    public class testDelete {
        public static void main(String[] args) {
            Connection con = null;
            Statement st = null;
            ResultSet rs = null;
            try {
                con = JDBCUtils.getConnection();
                st = con.createStatement();
                String sql = "DELETE FROM users WHERE `id`=4";
                int num = st.executeUpdate(sql);
                if (num > 0) {
                    System.out.println("删除成功!");
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.release(con, st, rs);
            }
        }
    }
    

    如下图所示:成功删除了一行数据


  • Update 编写练习

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * @ClassName: testUpdate
     * @Description: TODO 类描述
     * @Author: xy
     * @Version: 1.0
     */
    
    public class testUpdate {
        public static void main(String[] args) {
            Connection con = null;
            Statement st = null;
            ResultSet rs = null;
            try {
                con = JDBCUtils.getConnection();
                st = con.createStatement();
                String sql = "UPDATE users SET birthday='1990-12-01' WHERE id=1";
                int num = st.executeUpdate(sql);
                if (num > 0) {
                    System.out.println("更新成功!");
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.release(con, st, rs);
            }
        }
    }
    

    如下图所示:字段id为1处的birthday数据成功修改为1990-12-01


2.编写查询方法 Statement.executeQuery()

package com.xy.MySQL.myMethods;

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

/**
 * @ClassName: testSelect
 * @Description: TODO 类描述
 * @Author: xy
 * @Version: 1.0
 */

public class testSelect {
    public static void main(String[] args) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            st = con.createStatement();
            String sql = "SELECT * FROM users WHERE id=1";
            rs = st.executeQuery(sql);
            while (rs.next()) {
                System.out.println("id="+rs.getInt("id"));
                System.out.println("name="+rs.getString("name"));
                System.out.println("password="+rs.getString("password"));
                System.out.println("email="+rs.getString("email"));
                System.out.println("birthday="+rs.getDate("birthday"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(con, st, rs);
        }
    }
}

如下图所示:成功查询id=1处的id,name,password,email,birthday信息

posted @   无关风月7707  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示