zoukankan      html  css  js  c++  java
  • JDBC(二)

    ##  详解JDBC各个对象

    1、DriverManager对象:驱动管理对象

      *  功能:

        1、注册驱动:告诉程序该使用哪个数据jar包

        static  void  registerDriver(Driver  driver):之策给懂得驱动程序:DriverManager

        而真正写代码使用:Driver.forName("com.mysql.jdbc.Driver");

        通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块

     static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }

        注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

        2、获取数据库连接:

        *  方法:static  Connection  getConnection(String  url, String  user,  String  password)

        *  参数:

          *  url:指定连接的路径

            *  语法:jdbc:mysql://ip地址(域名):端口号/数据库

            *  例子:jdbc:mysql://localhost:3306/db

            *  细节:如果连接的是本机的mysql服务器,并且Mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库

    2、Connection对象:数据库连接对象

      *  功能:

        1、获取执行sql对象:

        *  Statement  createStatement();    

        *  PreparedStatement  prepareStatement(String  sql)

        2、管理事务:

        *  开启事务:setAutoCommit(boolean  autoCommit)  调用该方法,设置参数为false,即开启事务

        *  提交事务:commit()

        *  回滚事务:rollback()

    3、Statement对象:执行sql的对象

      1、执行sql

        1、boolean  execute(String  sql):可以执行任意的sql(了解)

        2、int  executeUpdate(String  sql):执行DML(增删改)语句,DDL(create,alter,drop)语句

          *  返回值:影响的行数,可以通过影响的行数来判断DML语句是否执行成功,返回值>0,执行成功;反之则失败。

        3、ResultSet  executeQuery(String  sql);   执行DQL(select语句)语句

    4、ResultSet对象:结果集对象,封装查询结果

      *  next():游标向下移动一行。判断当前行是否是最后一行末尾(是否有数据);如果是,返回true,否则false。

      *  getXxx():获取数据   

        *  Xxx:代表数据类型   如:int  getInt()    String  getString()

        *  参数:

        1、Int:代表列的编号。从1开始   如:getString(1)   

        2、String:代表列名称  如:getString("name")

      *  注意:

        *  使用步骤:

        1、游标向下移动一行

        2、判断是否有数据

        3、获取数据

    package JDBC.demo02;
    
    import java.sql.*;
    
    /**
     * 查询数据
     */
    public class JDBCDemo03 {
        private static final String url = "jdbc:mysql:///ftj";
        private static final String username = "root";
        private static final String password = "password";
        private static Connection conn;
        private static Statement stmt;
        private static ResultSet rs;
    
        public static void main(String[] args) {
            //获取数据库驱动,5版本之后可以不写
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                //获取连接参数
                conn = DriverManager.getConnection(url, username, password);
                //sql语句
                String sql = "select * from account where id = 1";
                //获取执行sql语句的对象
                stmt = conn.createStatement();
                //执行sql
                rs = stmt.executeQuery(sql);
                //处理结果集
                //让游标向下移动一行
                /*rs.next();
                //获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                int count = rs.getInt("count");
                System.out.println(id+"---"+name+"---"+count);*/
                while (rs.next()) {
                    int id = rs.getInt(1);
                    String name = rs.getString("name");
                    int count = rs.getInt("count");
                    System.out.println(id+"---"+name+"---"+count);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    5、PreparedStatement对象:

      1、SQL注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接。会造成安全性问题

        1、随意输入用户名,随意输入密码 select * from user where username = 'fdsafdsd' and password = 'a' or 'a' = 'a';

      2、解决SQL注入问题:使用PreparedStatement对象来解决

      3、预编译SQL:参数使用?作为占位符   

      4、步骤:

        1、导入驱动jar包

        2、注册驱动

        3、获取数据库连接对象 Connection

        4、定义sql

        *  注意:sql的参数使用?作为占位符。  如:select  *  from  user  where  username = ? and password = ?;

        5、获取执行sql语句的对象  PreparedStatement    Connerction.prepareStatement(String  sql);

        6、给?赋值:

        *  方法:setXxx(参数1,参数2)    参数1:?的位置      参数2:?的值

        7、执行sql,接收返回结果,不需要传递sql语句了

        8、处理结果

        9、释放资源

      5、后期都会使用PreparedStatement对象来完成所有增删改查操作

        1、可以防止sql注入

        2、效率更高

    ##  抽取JDBC工具类:JDBCUtils

      *  目的:简化书写

      *  分析:

      1、注册驱动也抽取

      2、抽取一个方法获取连接对象

        *  需求:不想传递参数(麻烦),还得保证工具类的通用性、

        *  解决方案:配置文件

            *  jdbc.properties

            url=

            user=

            password=

    package JDBC.demo03;
    
    import java.io.FileReader;
    import java.io.IOException;
    import java.net.URL;
    import java.sql.*;
    import java.util.Properties;
    
    /**
     * JDBC工具类
     */
    public class JDBCUtils {
    
        private static String url;
        private static String user;
        private static String password;
        private static String driver;
    
        /**
         * 文件的读取,只需要读取一次即可,拿到这些值,使用静态代码块(随着类的加载而加载,只会加载一次)
         */
        static {
    
            try {
                //读取资源文件,获取值
                //1、创建Properties集合类对象
                Properties properties = new Properties();
                //2、加载文件
                ClassLoader classLoader = JDBCUtils.class.getClassLoader();
                URL res = classLoader.getResource("jdbc.properties");
                String path = res.getPath();
                System.out.println(path);
                //String path = "jdbc.properties";
                //静态代码块只能处理异常,因为不是方法,所以不能抛异常
                properties.load(new FileReader(path));
                //3、获取数据,传值
                url = properties.getProperty("url");
                user = properties.getProperty("user");
                password = properties.getProperty("password");
                driver = properties.getProperty("driver");
                //4、注册驱动
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 获取连接
         *
         * @return 连接对象
         */
        public static Connection getConnection() throws SQLException {
    
            return DriverManager.getConnection(url, user, password);
        }
    
    
        /**
         * 关闭连接
         *
         * @param conn
         * @param stmt
         */
        public static void colseConntection(Connection conn, Statement stmt) {
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        /**
         * 关闭连接
         *
         * @param conn
         * @param stmt
         * @param rs
         */
        public static void colseConntection(Connection conn, Statement stmt, ResultSet rs) {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

      3、抽取方法释放资源

    That which doesn't kill me makes me stronger!
  • 相关阅读:
    HDU_1009_FatMouse' Trade
    WCF配置
    SQL Server ltrim(rtrim()) 去不掉空格
    安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败
    WPF 设置回车触发按钮时间
    WPF:验证登录后关闭登录窗口,显示主窗口的解决方法
    无法获取链接服务器 "XXX" 的 OLE DB 访问接口 "SQLNCLI10" 的架构行集 "DBSCHEMA_TABLES_INFO"。该访问接口支持该接口,但使用该接口时返回了失败代码。
    The current identity ( XXXX) does not have write access to ‘C:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Files’.解决办法
    安装SQL sever2008时显示重新启动计算机规则失败,应该怎么解决?
    清楚数据库日志的方法
  • 原文地址:https://www.cnblogs.com/21seu-ftj/p/12483751.html
Copyright © 2011-2022 走看看