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(?,?)";
原文地址:https://www.cnblogs.com/lzw123-/p/9436011.html