• mysql的jdbc入门学习小结


    转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html

    一、jdbc基本概念
    jdbc : Java Database Connectivity
    sun公司为了统一对数据库的操作,定义了一套api,称之为jdbc
    这套api完全由接口组成,我们在编写程序的时候针对接口进行调用
    这些接口交给数据库厂家去实现, 不同的数据库厂商会提供不同的实现类,
    这些实现类被我们称作数据库的驱动。

    一流公司定标准
    二流公司做服务
    三流公司做产品

    数据库驱动交给数据库厂商制作的优点:
        1.Java开发人员只需要维护Java应用和一套统一的规范
        2.数据库厂商提供具体的Java驱动程序,数据库厂商如果改变了
        数据库底层的实现,数据库厂商要随之更新驱动程序,不会影响到
        已经完成的Java应用程序。

    简单来说使用Java代码发送SQL语句的技术,就是jdbc

    二、实现jdbc程序的条件
     1.需要知道连接数据库服务器所在地
             需要数据库的IP地址和端口号
             ip定位到主机
             端口号:定位到程序
     2.需要知道数据库的用户名和密码
     
    三、如何实现jdbc连接MySQL数据库?
        1.导入数据库的驱动程序
            mysql-connector-java-5.0.8-bin.jar
        2.注册数据库的驱动
            DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
        3.建立与mysql数据库的连接
            String url = "jdbc:mysql://localhost:3306/test";//jdbc是主协议,mysql是子协议
            String user = "root";
            String password = "root";
            Connection conn = DriverManager.getConnection(url, user, password);
        4.创建用于发送sql语句的 Statement 对象
            Statement stmt = conn.createStatement();
        5. 编写SQL语句
            String sql = "select * from users";
        6.发送sql, 获得结果集
            ResultSet rs = stmt.executeQuery(sql);
        7.处理结果集
            System.out.println("id | name   | password | email  | birthday");
            while(rs.next()) {
                // 有第一行
                int id = rs.getInt("id");    // 通过列名取值比较直观
                String name = rs.getString("name");
                String psw = rs.getString("password");
                String email = rs.getString("email");
                Date birthday = rs.getDate("birthday");
                System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
            }
        8.关闭数据库连接,最后打开的资源最先释放,释放之前需要判断资源是否已经断开
            rs.close();
            stmt.close();
            conn.close();
    四、jdbc程序详解
    1. 注册驱动
        DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
        上面的语句会导致注册两次驱动
        原因在于,查看Driver类的源码会发现在静态代码块中完成了注册驱动的工作,
        也就是说注册驱动其实很简单,只需要加载驱动类即可
        Class.forName(“com.mysql.jdbc.Driver”);
    2. 创建数据库的连接
        Connection conn = DriverManager.getConnection(url, user, password);
        其中:

        url, 相当于数据库的访问地址,程序员通过url指定需要访问的数据库

         //连接数据库的url
        //jdbc主协议,mysql是子协议
        //jdbc协议:数据库子协议://主机:端口号:/数据库名

        jdbc:mysql:[]//localhost:3306/test?参数名:参数值
        其中jdbc为主协议,mysql为子协议,localhost为主机名,3306为端口号,test为数据库名
        url的后面可以跟参数,常用的参数有:user=root&password=root&characterEncoding=UTF-8

        如果url地址后面跟了user和password,创建Connection对象时将不必再次传入值
        Connection conn = DriverManager.getConnection(url);

        补充说明: 如果访问的localhost:3306,url 可省写为jdbc:mysql:///test
    3. Connection 对象
        Connection对象用于表示与某个数据库之间的连接,在程序中对数据库的所有操作都需要通过此对象来完成
        常用方法有:
        createStatement():创建向数据库发送sql的statement对象。
        prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
        prepareCall(sql):创建执行存储过程的callableStatement对象。 
        setAutoCommit(boolean autoCommit):设置事务是否自动提交。 
        commit() :在链接上提交事务。
        rollback() :在此链接上回滚事务。

    4. Statement 对象
        用于向数据库发送sql语句
        execute(String sql):用于向数据库发送任意sql语句
        executeQuery(String sql) :只能向数据发送查询语句。(常用)
        executeUpdate(String sql):只能向数据库发送insert、update或delete语句(常用)
        addBatch(String sql) :把多条sql语句放到一个批处理中。
        executeBatch():向数据库发送一批sql语句执行。 

    5. ResultSet 对象
        对于查询操作,该对象特别重要,因为它专门用于封装结果集
        存储的形式就是一种表格的形式,同样是列+行,说白了就和我们在 dos 命令行窗口查询的结果一样

        遍历方式:
        一开始游标指向结果集第一行, 也就是表头
        通过 next 将游标移向下一行, 如果没有下一行,该方法会返回false
        获得当前行的数据需要调用get方法:
        get(int index)获得第几列  列数从1开始
        get(String columnName) 根据列名获得值  常用

        注意:数据库的数据类型与java中数据类型的对应关系

        
        ResultSet对象的常用方法
        next():移动到下一行
        previous():移动到前一行
        absolute(int row):移动到指定行
        beforeFirst():移动resultSet的最前面。
        afterLast() :移动到resultSet的最后面。
    6. 释放数据库资源
        因为数据允许的并发访问连接数量往往都比较有限,使用完成后,需要释放资源

        在java程序中,我们应该将最终必须要执行的代码放到finally当中
        释放资源的代码
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }

        if(stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }

        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
        
    7. 防止 sql 注入
        在 service 层进行逻辑判断
        使用PreparedStatement对象

    package cn.test.jdbc.dao;

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Date;
    import java.util.Properties;



    import com.mysql.jdbc.Driver;

    public class JDBCDemo {
        //连接数据库的url的写法
        //jdbc主协议,mysql是子协议
        //jdbc协议:数据库子协议://主机:端口号:/数据库名
        private String url="jdbc:mysql://localhost:3306/day15";
        //用户名
        String username = "root";
        //密码
        String password = "Name-66437";
        @Test
        public void main(String [] args) throws SQLException{
            //1.创建一个驱动程序的类对象
            Driver driver = new com.mysql.jdbc.Driver();
            //设置用户名和密码
            Properties props = new Properties();
            props.setProperty("username", username);
            props.setProperty("password", password);
            
            //2.连接数据库
            Connection conn = driver.connect(url, props);
            Statement stmt = conn.createStatement();
            String sql = "select * from student";
            ResultSet rs = stmt.executeQuery(sql);
            //7.处理结果集
            System.out.println("id | name   | password | email  | birthday");
            while(rs.next()) {
                // 有第一行
                int id = rs.getInt("id");    // 通过列名取值比较直观
                String name = rs.getString("name");
                String psw = rs.getString("password");
                String email = rs.getString("email");
                Date birthday = rs.getDate("birthday");
                System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
            }
            //释放资源的代码
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                rs = null;
            }

            if(stmt!=null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                stmt = null;
            }

            if(conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                conn = null;
            }
        }
    }

  • 相关阅读:
    GitHub 和 Gitee 开源免费 10 个超赞后台管理面板,看完惊呆了!
    LeetCode234.回文链表
    LeetCode104.二叉树的最大深度
    LeetCode142.环形链表II(链表中环的入口节点)
    云原生动态周刊:你订阅 GitHub README 播客了吗?
    云原生爱好者周刊:Crossplane 成为 CNCF 孵化项目
    凌晨 12 点突发 istio 生产事故!一顿操作猛如虎解决了
    新东方在有状态服务 In K8s 的实践
    面向无人驾驶 “云端大脑” 可用性的云原生实践
    Qunar 云原生容器化落地实践
  • 原文地址:https://www.cnblogs.com/zihan1120/p/4462943.html
Copyright © 2020-2023  润新知