zoukankan      html  css  js  c++  java
  • JDBC开发,数据库的连接

     

    JDBC开发步骤

      1.建完工程后,右击工程,new,新建一个文件夹Folder,装jar包,
            2.将下载好的驱动包打开,找到jar文件,CTRL+C,选中装jar包的文件夹,CTRL+V,
            3.选中添加的jar,右键,Build Path,Add to Build Path
            4.新建一个包,再新建一个自定义类
            5.注册驱动:Class.forName("com.mysql.jdbc.Driver");throws异常
            6.获得链接,
              数据库的url:jdbc:mysql://localhost:3306/数据库名    
                 //解决中文乱码:在url中数据库名后加?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE        
               Connection con = DriverManager.getConnection("");
              导包,java.sql,throws异常
                 
            7.获得语句执行平台
                        通过连接对象获取对SQL语句的执行者对象
                        Statement stm=链接对象.createStatement();
            8.执行sql语句
                        使用执行者对象,向数据库执行SQL语句
                        获取到数据库的执行后的结果
                        
    例子:

             

    package com.oricle.Demo01;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class Demo01 {
    
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            /*        1.建完工程后,右击工程,new,新建一个文件夹Folder,装jar包,
             *         2.将下载好的驱动包打开,找到jar文件,CTRL+C,选中装jar包的文件夹,CTRL+V,
             *         3.选中添加的jar,右键,Build Path,Add to Build Path 
             *         4.新建一个包,再新建一个自定义类
             *         5.注册驱动:Class.forName("com.mysql.jdbc.Driver");throws异常
             *         6.获得链接,
                 *         数据库的url:jdbc:mysql://localhost:3306/数据库名    
                 *         //解决中文乱码:在url中数据库名后加?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE        
             *             Connection con = DriverManager.getConnection("");
             *             导包,java.sql,throws异常
             *             
                    7.获得语句执行平台
                        通过连接对象获取对SQL语句的执行者对象
                        Statement stm=链接对象.createStatement();
                    8.执行sql语句
                        使用执行者对象,向数据库执行SQL语句
                        获取到数据库的执行后的结果
                        
             *         
            */
                //1注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2获得链接
                String url="jdbc:mysql://localhost:3306/fuxi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE";
                String user="root";
                String password="123456";
                Connection con=DriverManager.getConnection(url, user, password);
                //3获得语句执行平台
                Statement stm=con.createStatement();
                //4.执行语句
                String sql="delete from sort where sid=5";
                stm.execute(sql);//增删改
                //5.针对于查询操作
                //6,先开的后关
                stm.close();
                con.close();
                
                
        }
    
    }

     用集合来装从数据库里面获取的数据

    自定义一个类,类名和数据库名一致

    package com.oricle.demo01;
    
    public class sort {
        private int sid;
        private String sname;
        private String sdesc;
        public int getSid() {
            return sid;
        }
        public void setSid(int sid) {
            this.sid = sid;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public String getSdesc() {
            return sdesc;
        }
        public void setSdesc(String sdesc) {
            this.sdesc = sdesc;
        }
        @Override
        public String toString() {
            return "sort [sid=" + sid + ", sname=" + sname + ", sdesc=" + sdesc + "]";
        }
        
    }

    测试类:

    package com.oricle.demo01;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    
    public class demo03 {
    
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            // 1注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2获取连接
            String url="jdbc:mysql://localhost:3306/fuxi";
            String user="root";
            String password="123456";
            Connection co=DriverManager.getConnection(url, user, password);
            // 3获得预处理对象
            Statement s=co.createStatement();
            // 4 SQL语句占位符设置实际参数
            // 5执行SQL语句
    
            String sql="select *from sort";
            ResultSet rs=s.executeQuery(sql);
            
            //6处理结果集
            ArrayList<sort> as=new ArrayList<sort>();//创建集合用来装新建sort对象
            //遍历
            while(rs.next()){
                sort so=new sort();//自定义一个类,类名和数据库名一致,创建对象
                so.setSid(rs.getInt("sid"));//把获取当前行的分类id利用set方法存入对象的成员变量中,
                so.setSname(rs.getString("sname"));
                so.setSdesc(rs.getString("sdesc"));
                as.add(so);//把该对象添加到集合as中
    
            }
            System.out.println(as);//打印集合里面内容
            
            //7释放资源
            rs.close();
            s.close();
            co.close();
            
        }
    
    }

    注册驱动

    代码:Class.forName("com.mysql.jdbc.Driver");

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

    DriverManager工具类,提供注册驱动的方法 registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册:

    DriverManager.registerDriver(new com.mysql.jdbc.Driver());

    以上代码不推荐使用,存在两方面不足

    1. 硬编码,后期不易于程序扩展和维护
    2. 驱动被注册两次。

    通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。

    如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。

    查询com.mysql.jdbc.Driver源码,发现Driver类“主动”将自己进行注册,重复

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());//注册
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    ……
    }

    获得链接

    代码:Connection con = DriverManager.getConnection
    (“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);

    获取连接需要方法

     DriverManager.getConnection(url,username,password);

      三个参数分别表示,url 需要连接数据库的位置(网址) user用户名  password 密码

      下面是mysql的url:

    jdbc:mysql://localhost:3306/mydb

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

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

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

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

    获得语句执行平台

    String sql = "某SQL语句";
    获取Statement语句执行平台:Statement stmt = con.createStatement();
    常用方法:
      int executeUpdate(String sql); --执行insert update delete语句.
      ResultSet executeQuery(String sql); --执行select语句.
      boolean execute(String sql); --执行select返回true 执行其他的语句返回false.

    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来解决对应的问题。

    package com.oricle.demo01;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class demo05 {
    
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            // TODO Auto-generated method stub
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/fuxi";
            String user="root";
            String password="123456";
            Connection co=DriverManager.getConnection(url, user, password);
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入用户名:");
            String uname=sc.next();
            System.out.println("请输入密码:");
            String pwd=sc.next();
            String sql="select * from user where uname=? and pwd=?";
            PreparedStatement pst=co.prepareStatement(sql);
            
            pst.setString(1, uname);
            pst.setString(2,pwd);
            
          ResultSet rs=pst.executeQuery();
            
            while(rs.next()){
                System.out.println(rs.getString("uname")+"..."+rs.getString("pwd"));
            }
            
            rs.close();
            pst.close();
            co.close();
        }
    
    }

    ?占位符,插入数据时,用逗号隔开

    String sql = "insert into sort(sid,sname) values(?,?)";
  • 相关阅读:
    Python解析Yahoo的XML格式的天气预报数据
    如何卸载wineQQ?
    纪念我的第一篇
    hihocoder1062 最近公共祖先·一
    hihocoder1055 刷油漆(树形DP)
    hihocoder1050 树中的最长路径
    hihocoder1049 根据二叉树的先序序列和中序序列求后序序列
    hihocoder1044 状态压缩
    hihocoder1043 完全背包
    hihocoder1038 01背包
  • 原文地址:https://www.cnblogs.com/lzw123-/p/9436011.html
Copyright © 2011-2022 走看看