JDBC---数据库连接

一.JDBC的概述

1.JDBC(Java DateBase Connectivity) java数据库连接。

是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,
它由一组用Java语言编写的类和接口组成。

有了JDBC,java开发人员就只需要写一次程序,就可以访问不同的数据库,但是不同的数据库具体的连接细节是不同的,并且这些细节不是通过java来实现的,是由数据库的开发商来实现,java设计出一系列连接数据库的接口规范。

eg:mysql-connector-java-8.0.16.jar 就是由mysql官方开发实现的,具体连接数据库的功能代码。

二.JDBC的搭建

1.在项目中添加 .jar 文件。

JDBC---数据库连接_第1张图片

 将需要导进项目中的 .jar 包放在 lib 文件夹下。导进来之后就可以在项目中去使用包中的类等。

2.加载驱动类。

注册JDBC驱动程序:这需要初始化驱动程序,这样就可以打开与数据库的通信信道。

 Class.forName("com.mysql.cj.jdbc.Driver");
        //或者:
 DriverManager.registerDriver(new Driver());

3.建立与数据库的连接。

 使用 java.sql包下的DriverManager中的getConnection()方法去获得数据对象JDBC---数据库连接_第2张图片

getConnection()中有三个参数:

String url的标准格式:jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库名?serverTimezone=Asia/Shanghai (注意:这是标准格式,其中只需要对数据库名更改即可,一般都是连接自己主机,需要连接其他主机需更换端口号)

String user:用户名

String password:密码

此方法会返回一个Connection对象:

Connection connection = DriverManager.getConnection(url, user, password);

 4.发送sql。

执行sql语句需要调用Connection中的createStatement()方法获得Statement对象。

Statement st = connection.createStatement();

 再通过Statement中的executeU0pdate("sql:")中书写sql语句。

eg:现在要为专业表添加一个数学专业。

st.executeUpdate("insert into major(name) values ('数学')");

 5.关闭数据库的连接。

st.close();
connection.close();

搭建的完整代码如下:


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class demo1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //2.加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        //或者:
        //DriverManager.registerDriver(new Driver());

        //3.建立与数据库的连接,获得数据对象
        String url="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai";
        String user="root";//账号
        String password="";//密码
        Connection connection = DriverManager.getConnection(url, user, password);

        //4.发送sql
        Statement st = connection.createStatement();
        st.executeUpdate("insert into major(name) values ('数学')");

        //5.关闭数据库的链接
        st.close();
        connection.close();
    }
}

 连接步骤只是针对于sql语句为(增删改)的情况,需要select还请注意结果集处理。

 三.prepareStatement和Statement

1.Statement

使用Statement的sql语句中,想要将参数放到sql语句中去就必须通过字符出纳的拼接完成。

public void save(int id,String name,String gender,String birthday,String number,String address,int majorid) throws ClassNotFoundException, SQLException {
        //加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取连接对象
        Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai","root"," ");

        Statement st = connection.createStatement();
        //发送sql
        st.executeUpdate("insert into student(id,name,gender,birthday,number,address,rag_time,majorid) values ("+id+",'"+name+"','"+gender+"','"+birthday+"','"+number+"','"+address+"',now(),"+majorid+")");

        connection.close();
        st.close();
    }

拼接变量:

对于String类型的变量来说:' " +变量名+ " ' 

对于数据变量(整型,浮点型变量)来说:" +变量名+ "

2.prepareStatement

使用prepareStatement的sql语句中,先用占位符(?)占位,然后再通过setObject方法赋值进去,不需要拼接字符串。

public void save(String name,String gender,String birthday,String number,String address,int majorid) throws ClassNotFoundException, SQLException {
        //加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");

        Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai","root","");

        PreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,number,address,rag_time,majorid) values (?,?,?,?,?,now(),?)");

        ps.setObject(1,name);
        ps.setObject(2,gender);
        ps.setObject(3,birthday);
        ps.setObject(4,number);
        ps.setObject(5,address);
        ps.setObject(6,majorid);

        //真正执行sql
        ps.executeUpdate();
        //关闭连接
        ps.close();
        connection.close();
    }

注意:setObject()中的参数1指的是sql语句中占位符的排序位置,不是 sql语句的排序位置,参数2就是需要的变量。

3.区别

PreparedStatement和Statement 区别

相同点: 都是向数据库发送sql

不同点
     Statement:   将参数直接拼接到sql中, 要拼接字符串,写起来麻烦, 安全性差, 可以在参数中拼接 or 1=1。

     PreparedStatement : 先用?占位, 然后通过setObject方法赋值, 写起来不用拼接字符串, 安全可靠的在赋值时进行检测,可以防止sql注入攻击。

四.结果集处理

增删改使用的是executeUpdate()

查询用的是executeQuery()

ps.executeUpdate();//增删改

ResultSet rs = ps.executeQuery(); //查询

PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中,使用ResultSet中的next()方法获得下一行数据,使用getXXX(String name)方法获得值。

查询结果返回的是一个包装的对象,对象中的信息就是查询的信息。(返回值可以是一个对象,也可以是一个对象数组或者对象集合等)

eg:现在的sql语句为下:

查询信息只有一组:

PreparedStatement ps = connection.prepareStatement("select id,name,gender,birthday,number,address,rag_time from student where id=?");

ps.setObject(1,id);

需要将信息封装到类中 ,我们自然是要去创建一个类,同时定义一些变量来存储查询的信息(注意:必须要使用标准的JavaBeen去定义类中的属性)如下例子:


import java.util.Date;

public class Student {
    private int id;
    private String name;
    private String gender;
    private Date birthday;
    private String number;
    private String address;
    private Date ragTime;

    public Date getRagTime() {
        return ragTime;
    }

    public void setRagTime(Date ragTime) {
        this.ragTime = ragTime;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", birthday=" + birthday +
                ", number='" + number + '\'' +
                ", address='" + address + '\'' +
                ", ragTime=" + ragTime +
                '}';
    }
}

需要查询信息并且将信息封装到类的对象中:

ResultSet rs = ps.executeQuery();
        Student student=null;
        while(rs.next()){
            student=new Student();
            student.setId(rs.getInt("id"));
            student.setName(rs.getString("name"));
            student.setGender(rs.getString("gender"));
            student.setBirthday(rs.getDate("birthday"));
            student.setNumber(rs.getString("number"));
            student.setAddress(rs.getString("address"));
            student.setRagTime(rs.getTimestamp("rag_time"));
        }

若查询信息有多组时,就需要用到对象集合(也是相同道理):

PreparedStatement ps = connection.prepareStatement("select id,name,gender,birthday,number,address,rag_time from student where gender=?");
        ps.setObject(1,gender);

        ResultSet rs = ps.executeQuery();
        ArrayList students=new ArrayList<>();
        while(rs.next()){
            Student student=new Student();
            student.setId(rs.getInt("id"));
            student.setName(rs.getString("name"));
            student.setGender(rs.getString("gender"));
            student.setBirthday(rs.getDate("birthday"));
            student.setNumber(rs.getString("number"));
            student.setAddress(rs.getString("address"));
            student.setRagTime(rs.getTimestamp("rag_time"));
            students.add(student);
        }

你可能感兴趣的:(java)