JDBC简介和用JDBC连接数据库

时间:2021-07-21 22:52:11

大家好,我是一个爱举铁的程序员Shr


本篇文章介绍JDBC,还有用JDBC连接数据库添加数据,查询数据。


源码地址:https://github.com/ShrMus/Dao/tree/master/dao_20180603/src/main/java/com/shrmus/jdbc01


一、什么是JDBC

JDBC的全称是Java DataBase ConnectivityJava数据库连接,它一套用来连接数据库的规范。我个人的理解JDBCJava程序和数据库之间的桥梁。


二、为什么要使用JDBC

它可以和数据库建立连接,发送操作数据库的SQL语句,接收SQL语句的执行结果。


三、JDBC中的重要元素

3.1 驱动包

项目中导入驱动包才能使用JDBC,连接不同的数据库需要对应的Jar包。

SQL Server导入sqljdbc.jar

MySQL导入mysql-connector-java-5.0.4-bin.jar5.0.4是版本号)

Oracle导入ojdbc6.jar


3.2 连接地址

连接数据库系统的URL是不一样的。

SQL Server :jdbc:sqlserver://localhost:1433;DatabaseName=数据库名

MySQL :jdbc:mysql://127.0.0.1:3306/数据库名

Oracle :jdbc:oracle:thin:@localhost:1521:orclorclOracle数据库实例)


3.3 用户名和密码

登录数据库系统的用户名和密码


3.4 DriverManager

管理数据库中所有驱动程序。


3.5 Connection接口

与数据库的连接,通过DriverManager类获取。

Connection connection = riverManager.getConnection();


3.6 Statement接口

在建立连接的基础上向数据库发送SQL语句,用于执行静态的SQL语句。通过连接对象获取。

Statement statement = connection .createStatement();


3.7 PreparedStatement接口

该接口继承Statement接口,用于执行动态的SQL语句。通过连接对象获取。

PreparedStatement prepareStatement = connection .prepareStatement(sql);


3.8 ResultSet接口

类似一张数据表,用来暂时存放数据库查询操作所获得的结果集

ResultSet resultSet = statement.executeQuery(sql);


四、JDBC操作数据

4.1 创建数据库,新建表

创建数据库dao_20180603,新建表jdbc01_student

CREATE TABLE `jdbc01_student` (
  `stu_id` int(11) NOT NULL,
  `stu_name` varchar(20) default NULL,
  `stu_age` int(11) default NULL,
  `stu_gender` int(11) default NULL,
  PRIMARY KEY  (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


4.2 连接数据库

public class DBUtil {
    /*  数据库驱动,其实就是对应的jar中的驱动类的全路径
        MySQL:      com.mysql.jdbc.Driver
           SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver
           Oracle 11g: oracle.jdbc.driver.OracleDriver
     */
    private static final String DRIVE_STRING = "com.mysql.jdbc.Driver";
    /*  数据库连接URL,数据库名为dao_20180603
        MySQL:      jdbc:mysql://localhost:3306/dao_20180603
         SQL Server: jdbc:sqlserver://localhost:1433;databaseName=dao_20180603
         Oracle 11g: jdbc:oracle:thin:@localhost:1521:orcl
     */
    private static final String URL_STRING = "jdbc:mysql://localhost:3306/dao_20180603?characterEncoding=utf8";
    // 数据库用户名
    private static final String USER_STRING = "root";
    // 数据库密码
    private static final String PASSWORD_STRING = "shrmus";
    // 数据库连接对象
    public static Connection connection;
    // SQL执行对象
    public static Statement statement;
    // 结果集对象
    public static ResultSet resultSet;
    // 加载驱动
    static {
        try {
            Class.forName(DRIVE_STRING);
        } catch (ClassNotFoundException e) {
            System.err.println("加载数据库驱动失败!");
        }
    }
    /**
     * 获取数据库连接对象
     * @return
     */
    public static Connection getConnection() {
        try {
            connection = DriverManager.getConnection(URL_STRING, USER_STRING, PASSWORD_STRING);
        } catch (SQLException e) {
            System.err.println("获取数据库连接对象失败!");
        }
        return connection;
    }
    /**
     * 关闭数据库连接对象
     * @param connection
     */
    public static void close(Connection connection) {
        if(null != connection) {
            try {
                connection.close();
            } catch (SQLException e) {
                System.err.println("关闭数据库连接对象失败!");
            }
        }
    }
    /**
     * 关闭SQL执行对象
     * @param statement
     */
    public static void close(Statement statement) {
        if(null != statement) {
            try {
                statement.close();
            } catch (SQLException e) {
                System.err.println("关闭SQL执行对象失败!");
            }
        }
    }
    /**
     * 关闭结果集对象
     * @param resultSet
     */
    public static void close(ResultSet resultSet) {
        if(null != resultSet) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                System.err.println("关闭结果集对象失败!");
            }
        }
    }
    /**
     * 关闭数据库连接对象,SQL执行对象,结果集对象
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet, Statement statement, Connection connection){
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                System.err.println("关闭结果集对象失败!");
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                System.err.println("关闭SQL执行对象失败!");
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                System.err.println("关闭数据库连接对象失败!");
            }
        }
    }
}

4.3 添加一条记录到数据库

4.3.1 新建一个实体类

public class Student {
    private int id;
    private String name;
    private int age;
    private int gender;
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + "]";
    }
    public Student() {
    }
    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 int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getGender() {
        return gender;
    }
    public void setGender(int gender) {
        this.gender = gender;
    }
}


4.3.2 新建一个Dao

public class StudentDao {
    /**
     * 添加一条记录
     * @param student
     * @return
     */
    public int addStudent(Student student) {
        // 受影响的行数
        int acceptRow = 0;
        // 获取数据库连接对象
        Connection connection = DBUtil.getConnection();
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            // 获取SQL执行对象
            statement = connection.createStatement();
            // sql语句
            String sql = "insert into jdbc01_student(stu_id,stu_name,stu_age,stu_gender) "
            + "values("+student.getId()+",'"+student.getName()+"',"+student.getAge()+","+student.getGender()+")";
            System.out.println(sql);
            acceptRow = statement.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接
            DBUtil.close(resultSet, statement, connection);
        }
        return acceptRow;
    }
}

4.3.3 新建一个Service

public class StudentService {
    /**
     * 添加一个学生的信息
     * @param student
     * @return
     */
    public int addStudent(Student student) {
        StudentDao studentDao = new StudentDao();
        int accpetRow = studentDao.addStudent(student);
        return accpetRow;
    }
}


4.3.4 新建一个测试类

public class StudentTest {
    @Test
    public void addStudent() throws Exception{
        StudentService studentService = new StudentService();
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(20);
        student.setGender(1);
        studentService.addStudent(student);
    }
}


执行测试类中的addStudent()方法就往数据库中添加了一条记录。

JDBC简介和用JDBC连接数据库

数据库中能查找到这条记录,那怎么在程序中查找到这条记录呢。接下来要讲的就是查找数据库中的记录。


4.4 查询数据库中的记录

4.4.1 Dao类中添加查询方法

    /**
     * 查找所有学生
     * @return
     */
    public List<Student> getStudentList(){
        List<Student> studentList = new ArrayList<>();
        // 获取数据库连接对象
        Connection connection = DBUtil.getConnection();
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            // 获取SQL执行对象
            statement = connection.createStatement();
            // sql语句
            String sql = "select stu_id,stu_name,stu_age,stu_gender from jdbc01_student";
            // 获取结果集
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                Student student = new Student();
                // 根据列名获取值
                String idString = resultSet.getString("stu_id");
                String nameString = resultSet.getString("stu_name");
                String ageString = resultSet.getString("stu_age");
                String genderString = resultSet.getString("stu_gender");
                int id = Integer.parseInt(idString);
                int age = Integer.parseInt(ageString);
                int gender = Integer.parseInt(genderString);
                // 封装学生的信息
                student.setId(id);
                student.setName(nameString);
                student.setAge(age);
                student.setGender(gender);
                // 添加到集合中
                studentList.add(student);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接
            DBUtil.close(resultSet, statement, connection);
        }
        return studentList;
    }

4.4.2 Service类中添加查询方法

    /**
     * 查找所有学生
     * @return
     */
    public List<Student> getStudentList(){
        StudentDao studentDao = new StudentDao();
        List<Student> studentList = studentDao.getStudentList();
        return studentList;
    }


4.4.3 在测试类中添加查询方法

    @Test
    public void getStudentList() throws Exception{
        StudentService studentService = new StudentService();
        List<Student> studentList = studentService.getStudentList();
        for(Student student : studentList) {
            System.out.println(student);
        }
    }


执行测试类中的查询方法就可以看到控制台打印的信息了。

Student [id=1, name=张三, age=20, gender=1]


修改和删除的代码我就不写了,读者可以自己根据查询和添加自己练习。


源码地址:https://github.com/ShrMus/Dao/tree/master/dao_20180603/src/main/java/com/shrmus/jdbc01