• 使用JDBC连接并操作数据库


    1.数据库驱动

    介于Java程序和MySQL之间的程序。

    2.JDBC

    sun公司为了简化开发人员的操作,提供了一个(Java操作数据库的)规范,俗称JDBC。这些规范的实现由具体的厂商去做。

    对于开发人员来说,只需要掌握JDBC接口的操作即可。JDBC程序介于数据库驱动和应用程序之间。

    3.第一个JDBC程序

    前期工作:

    1.创建一个普通的Java项目

    2.在项目的根目录下创建一个名为lib的包

    3.将mysql数据库驱动jar包复制到lib文件夹中

    4.右键lib文件夹,选中 add as library,这才意味着成功导入了驱动程序包

    连接数据库的步骤总结:

    1、加载驱动

    2、连接数据库 DriverManager

    3、获得执行sql的对象 Statement

    4、获得返回的结果集

    5、释放连接

    DriverManager

    DriverManager.registerDriver(new com.mysql.jdbc.Driver())
    Class.forName("com.mysql.jdbc.Driver()"); 
    ​
    /*
        上面这两行代码的作用都是一样的,第一个是通过向DriverManager.registerDriver方法传递一个驱动对象
    */
    // DriverManager.registerDriver方法源码如下
        public static synchronized void registerDriver(java.sql.Driver driver)
            throws SQLException {
            registerDriver(driver, null);
        }
    // 其内部的registerDriver方法源码如下
        public static synchronized void registerDriver(java.sql.Driver driver,
                DriverAction da)
            throws SQLException {
    ​
            /* Register the driver if it has not already been added to our list */
            if(driver != null) {
                registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
            } else {
                // This is for compatibility with the original DriverManager
                throw new NullPointerException();
            }
            println("registerDriver: " + driver);
        }
    ​
    // 再来看一下com.mysql.jdbc.Driver()的源码
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        public Driver() throws SQLException {
        }
        static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    }
    /*
        可以看到其内部有一个静态代码块,在加载该类的时候,会执行这个静态代码块,这个静态代码块也是执行的
        DriverManager.registerDriver方法,并且传递的是一个驱动对象,所以上面两种加载驱动的方式的本质是一样的
    */
    ​
    Connection connection = DriverManager.getConnection(url, username, password);
    // connection代表数据库
    //数据库设置自动提交
    connection.setAutoCommit()
    //事务提交
    connection.commit()
    //事务回滚
     connection.rollback()

    URL

    String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false";
    // jdbc:mysql://主机地址:port/数据库名?参数1&参数2……

    Statement 执行SQL的对象,PrepareStatement 执行SQL的对象

    String sql = "select * from users";
    Statement statement = connection.createStatement();
    statement.execute();
    statement.executeQuery();    // 查询操作返回 一个结果集ResultSet
    statement.executeUpdate();  // 更新、插入、删除都是使用这个方法,会返回一个受影响的行数
    //5.执行SQL的对象去执行SQL,如果有结果,则查看返回结果

    ResultSet

    获得指定的数据类型

    ResultSet resultSet = statement.executeQuery(sql);  // 结果集封装了我们全部的查询出来的结果
    // 如果直到要获取的字段的类型,就指定类型,否则就是要getObject方法
    resultSet.getObejct();
    resultSet.getString();
    resultSet.getInt();
    resultSet.getDate();

    遍历,指针

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

    释放资源

       resultSet.close();
       statement.close();
       connection.close();

    4.Statement对象

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

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

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

    CRUD操作-insert

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

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

    CRUD操作-delete

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

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

    CRUD操作-update

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

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

    CRUD操作-read

    使用executeQuery方法完成数据查询操作,示例操作:

    Statement st = conn.createStatement();
    String sql = "select * from user where id=1";
    ResultSet rs = st.executeQuery(sql);
    while(rs.next()){
    // 根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
    }

    4.规范化实现

    1.在src文件夹下写一个配置文件db.properties,用于保存连接数据库的关键信息;

    内容如下:

    driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false
    username = 用户名
    password = 密码

    2.新建一个utils包,用于存放连接数据库的工具类,该工具类的代码实现如下:

    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");
    ​
                //1.驱动只用加载一次
                Class.forName(driver);
    ​
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        // 获取连接
        public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url,username,password);
        }
        // 释放连接资源
        public static void relese(Connection conn, 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 (conn!=null){
                try{
                    conn.close();
                }catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    3.在其他的具体业务包里面编写具体操作数据库的代码

    增加操作:

    public class jdbctest02 {
        public static void main(String[] args) {
            Connection conn = null;
            Statement st = null;
            ResultSet rs = null;
    ​
            try {
                conn = jdbcUtils.getConnection(); // 获取数据库连接
                st = conn.createStatement();  //获得SQL的执行对象
                String sql = "insert into users values(4,'lalal','123456','xxx@163.com','2020-01-01')";
                int i = st.executeUpdate(sql);
                if (i>0){
                    System.out.println("插入成功");
                }
    ​
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                jdbcUtils.relese(conn,st,rs);
            }
        }
    }

    删除操作:

    public class jdbctest03 {
        public static void main(String[] args) {
            Connection conn = null;
            Statement st = null;
            ResultSet rs = null;
    ​
            try {
                conn = jdbcUtils.getConnection(); // 获取数据库连接
                st = conn.createStatement();  //获得SQL的执行对象
                String sql = "delete from users where id = 4";
                int i = st.executeUpdate(sql);
                if (i>0){
                    System.out.println("删除成功");
                }
    ​
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                jdbcUtils.relese(conn,st,rs);
            }
        }
    }

    修改操作:

    public class jdbctest04 {
        public static void main(String[] args) {
            Connection conn = null;
            Statement st = null;
            ResultSet rs = null;
    ​
            try {
                conn = jdbcUtils.getConnection(); // 获取数据库连接
                st = conn.createStatement();  //获得SQL的执行对象
                String sql = "update users set name = '库卡卡' where id = 1";
                int i = st.executeUpdate(sql);
                if (i>0){
                    System.out.println("修改成功");
                }
    ​
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                jdbcUtils.relese(conn,st,rs);
            }
        }
    }

    查询操作:

    public class jdbctest05 {
        public static void main(String[] args) {
            Connection conn = null;
            Statement st = null;
            ResultSet rs = null;
    ​
            try {
                conn = jdbcUtils.getConnection(); // 获取数据库连接
                st = conn.createStatement();  //获得SQL的执行对象
                String sql = "select * from users";
                rs = st.executeQuery(sql);
                while (rs.next()){
                    System.out.println("id="+rs.getObject("id"));
                    System.out.println("name="+rs.getObject("name"));
                    System.out.println("pwd="+rs.getObject("password"));
                    System.out.println("email="+rs.getObject("email"));
                    System.out.println("birthday="+rs.getObject("birthday"));
                }
    ​
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                jdbcUtils.relese(conn,st,rs);
            }
        }
    }

    会发现在这些具体的业务实现类里面,除了sql语句之外,其他大致都是一样的。

  • 相关阅读:
    使用MSXML2::IXMLDOMDocument2Ptr每次都要CreateInstance和load(xmlfile)吗?
    .Net程序安装打包的一些经验贡献
    感慨SQL2005中的数据挖掘算法
    COM客户端没法激活托管代码生成的COM Server的原因
    预感~=命中注定
    创业经理10大必备素质
    全局缓存管理工具
    XML DOM的结构概念图解哪里是Element,哪里是Attribute,哪里是Text
    用GetVolumeInformation得到的不是硬盘的序列号,不要再抄这样的错误好吗?
    站在生活的背后
  • 原文地址:https://www.cnblogs.com/yxym2016/p/12689204.html
Copyright © 2020-2023  润新知