zoukankan      html  css  js  c++  java
  • Java学习(JDBC java连接数据库)

    转载于:https://www.cnblogs.com/0328dongbin/p/9134047.html

    Java学习(JDBC java连接数据库)

     

    一、概述

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范

    JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

    JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

    今天我们使用的是mysql的驱动mysql-connector-java-5.1.39-bin.jar

    二、JDBC原理

    Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。

    JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

     三、JDBC开发步骤   重点,必须记住

    1.注册驱动

      用来告诉JVM使用的是哪个生产厂商的驱动

    2.获得链接,链接数据库

      使用JDBC中的类,完成对MySQL数据库的链接 

    3.获得语句执行平台

      通过连接对象获取对SQL语句的执行对象

    4.执行SQL语句

      使用执行对象对数据库执行SQL语句

      获取执行结果

    5.处理结果

      处理结果集,(insert、update、delete无需处理)

    6.释放资源

      调用一堆 close()方法,将调用的对象弹栈

        详细步骤:

      1.导入驱动jar包

      创建lib文件夹,存放所需要的所有jar包。

      选择jar包,右键选择 bulid path 再选择 Add to bulid path

      如图:

            

      2.注册驱动

      代码:class.forName("com.mysql.jdbc.Dirver"); 

        JDBC规范定义驱动接口:java.sql.Driver,MySql驱动包提供了实现类:com.mysql.jdbc.Driver

       3.获得链接

         代码:Connection conn=DiverManager.getConnection("jdbc:Mysql://localhost:3306/goods,'root','123456'");

           获取连接需要方法 DriverManager.getConnection(url,username,password),三个参数分别表示,url 需要连接数据库的位置(网址) user用户名  password 密  

                 url比较复杂,下面是mysql的url: 

            jdbc:mysql://localhost:3306/mydb

         JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。

           第一部分是jdbc,这是固定的;

           第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;

                     第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb)组成。

       4.获得SQL语句执政平台

       代码:String sql="某sql语句";

       获取Statement语句执行平台:Statement stmt=con.createStatement();

       常用方法:

       (1)int executeUpdate(String sql); ------ 执行intert 、update、delete(增删改操作)语句

          (2)ResultSet executeQuery(String sql);-------执行select(查询操作) 语句

          (3) boolean execute(String sql); --执行select返回true 执行其他的语句返回false.

      5.处理结果集(执行insert、update、delete无需处理)

        ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,

       这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:

       代码:rs.next();//指向第一行    

             rs.getInt(1);//获取第一行第一列的数据

     

      常用方法:

     (1)Object getObject(int index) / Object getObject(String name) 获得任意对象

        (2)  String getString(int index) / Object getObject(String name) 获得字符串

        (3)  int getInt(int index) / Object getObject(String name) 获得整形

        (4)  double getDouble(int index) / Object getObject(String name) 获得双精度浮点型

        6.释放资源

      与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。

      实例代码: 

     

               rs.close();

               stmt.close();

               con.close();

     

       四、SQL注入问题

     

    假设有登录案例SQL语句如下:

        SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

    此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’  OR ‘a’=’a时,则真正执行的代码变为:

        SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

    此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。

    为此,我们使用PreparedStatement来解决对应的问题。

      五、预处理对象

     

    使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。

    String sql = "insert into sort(sid,sname) values(?,?)";;
    PreparedStatement预处理对象代码:
    PreparedStatement psmt = conn.prepareStatement(sql);

      常用方法:  

     

      1.    执行SQL语句:

      int executeUpdate(); --执行insert update delete语句.

      ResultSet executeQuery(); --执行select语句.

      boolean execute(); --执行select返回true 执行其他的语句返回false.

    2.设置实际参数

      void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。在将此值发送到数据库时,驱动程序将它转换成一个 SQL Xxx类型值。

       例如:

       setString(2, "家用电器") 把SQL语句中第2个位置的占位符? 替换成实际参数 "家用电器"

     实例代码:

      

     
    package com.oracle.Demo01;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import com.mysql.jdbc.Driver;
    
    public class demo01 {
    
        public static void main(String[] args) throws SQLException, ClassNotFoundException {
            // TODO Auto-generated method stub
    //        1.    注册驱动.
    //        告知JVM使用的是哪一个数据库的驱动
            //DriverManager.registerDriver(new Driver());
                //    把com.mysql.jdbc.Driver这个实现类直接扔到内存里
                //  扔到内存之后调用static静态代码块
                //  静态代码块中注册驱动
            Class.forName("com.mysql.jdbc.Driver");   //com.mysql.jdbc为驱动所在包
    //        2.    获得连接对象.
    //        使用JDBC中的类,完成对MySQL数据库的连接
            //jdbc:mysql://localhost:3306/数据库名
            String url="jdbc:mysql://localhost:3306/goods?characterEncoding=utf-8";
            String username="root";
            String password="123456";
            Connection conn=DriverManager.getConnection(url, username, password);
    //        3.    获得语句执行平台
    //        通过连接对象获取对SQL语句的执行者对象
            Statement sta=conn.createStatement();   //接收一定要用java里面的  导包导SQL里的
    //        4.    执行sql语句
    //        使用执行者对象,向数据库执行SQL语句
    //        获取到数据库的执行后的结果
         //添加 String sql="insert into sort(sname,sdesc) value('电子设备','都是骗男人的')"; int row=sta.executeUpdate(sql); System.out.println(row); //修改 String sql="update sort set sname='玩具' where sid='1'"; int row=sta.executeUpdate(sql); System.out.println(row); //查询 String sql="select * from sort"; //删除 String sql="delete from sort where sid='1'"; // 5. 处理结果 (仅用于查询) ResultSet rs=sta.executeQuery(sql); while(rs.next()){
            System.out.println(rs.getInt("sid")+"..."+rs.getString("sname")+"..."+rs.getString("sdesc")); } // 6. 释放资源. (先开的后关) // 调用一堆close()方法 关闭对象 rs.close(); sta.close(); conn.close(); } }
     

     封装JDBK方法:

     
    package com.oracle.Demo01;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBCUtils {

        //提供获取连接的方法

    private static Connection conn=null;
        static{
            try {
                Class.forName("com.mysql.jdbc.Driver");
                String url="jdbc:mysql://localhost:3306/goods?characterEncoding=utf-8";
                String username="root";
                String password="123456";
                conn=DriverManager.getConnection(url,username,password);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                throw new RuntimeException(e+"数据库连接失败");
            } 
            
        }
        //获取数据库连接对象
        public static Connection getConnection(){
            return conn;
        }
        //关闭数据库的方法
        public static void close(ResultSet rs,Statement sta,Connection conn){
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(sta!=null){
                try {
                    sta.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        public static void close(Statement sta,Connection conn){
            if(sta!=null){
                try {
                    sta.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
    }
     

     Test类:

     
    package com.oracle.Demo01;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class Test {
    
        public static void main(String[] args) throws SQLException {
            // TODO Auto-generated method stub
                Connection conn=JDBCUtils.getConnection();
                String sql="insert into user(username,password) value(?,?)";
                PreparedStatement pst=conn.prepareStatement(sql);
                pst.setString(1, "李四");
                pst.setString(2, "123456789");
                int row=pst.executeUpdate();
                System.out.println(row);
                JDBCUtils.close(pst, conn);
        }
    
    }
     
  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/wsnan/p/11715227.html
Copyright © 2011-2022 走看看