Java连接数据库JDBC


前言

在Python和Golang我们可以使用pip install和go get 去下载开发中使用到的开源的第三方包,以实现企业级应用的开发;

在Java中使用一系列的JAR包通常用于归档大量的Java类文件、相关的元数据和资源(文本、图片等)文件到1个文件中,以便开发Java平台应用软件或库。

帮助我们实现功能丰富、复杂的企业家应用开发;

 JAR(Java Archive/Java归档)包,不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。

一、JDBC是什么?

Java Database Connectivity简称JDBC,是Java官方(Sun公司)定义的一套Java程序操作所有关系型数据库的规范(接口)

各大数据库厂商为了通过Java来推广自己的数据库产品,实现了JDBC规范(接口)并通过JAR包的形式发布出来给Java开发人员使用,就是数据库驱动(driver)。

现在我们要用Java调MySQL数据库,所以就需要提前下载MySQL提供的的driver,也就是1个JAR包;

二、JDBC数据库操作 

DriverManager驱动管理对象:     可以获取数据库连接对象。
Connection 数据库连接对象: 可以获取执行SQL的对象,可以管理事务操作。
Statement 执行静态SQL对象: 可以执行数据库的增删改查操作

1.创建表(DML)

package cn.zhanggen;

import com.mysql.jdbc.CommunicationsException;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class App { public static void main(String[] args) { Connection connection = null; Statement statement = null; try { Class.forName("com.mysql.jdbc.Driver"); String dbURL = "jdbc:mysql://192.168.56.18:3306/web?characterEncoding=utf8"; connection = DriverManager.getConnection(dbURL, "zhanggen", "123.com"); statement = connection.createStatement(); String createTable="CREATE TABLE IF NOT EXISTS `staffs`(\n" + "`id` INT UNSIGNED AUTO_INCREMENT KEY COMMENT '用户编号',\n" + "`username` VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',\n" + "`age` TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',\n" + "`salary` FLOAT(8,2) NOT NULL DEFAULT 0 COMMENT '薪水'\n" + ")ENGINE=INNODB DEFAULT CHARSET=UTF8;"; statement.executeUpdate(createTable); // String sql = "insert into staffs(username,age,salary) values ('马睿',18,999.19),('张景辉',58,999.19);"; // statement.executeUpdate(sql); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { System.out.println("11"); e.printStackTrace(); } finally { if (statement != null) { try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }

2.新增记录

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Insert01 {
    public static void main(String[] args) throws Exception {
        //1.将MySQL服务器提供的jar包中的Driver接口实现类,注册到JVM
        Driver driver = new com.mysql.jdbc.Driver();
        DriverManager.registerDriver(driver);

        //2.通过DriverManager在java工程和MySQL服务器之间建立1个连接通道;
        String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8";
        Connection conn = DriverManager.getConnection(dbURL, "yourusername", "yourpassword");

        //3.在通道中创建1个交通工具
        PreparedStatement ps = conn.prepareStatement("");

        //4.通过交通工具将SQL命令推送到MySQL服务器上执行
        String sql = "insert into staffs(username,age,salary) values ('Martin',18,999.19),('Tom',58,999.19);";

        //5.执行插入SQL命令
        int counter = ps.executeUpdate(sql);
        System.out.println(counter);

        //6.关闭数据库连接资源
        if (conn != null) {
            conn.close();
        }

        if (ps != null) {
            ps.close();
        }

    }


}

3.更新记录

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class update02 {
    public static void main(String[] args) throws Exception {
        //1.将MySQL服务器提供的jar包中的Driver接口实现类,注册到JVM中
//        Driver driver = new com.mysql.jdbc.Driver();
//        DriverManager.registerDriver(driver);
        Class.forName("com.mysql.jdbc.Driver");

        //2.通过DriverManager建立数据库连接通道
        String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8";
        Connection conn = DriverManager.getConnection(dbURL, "用户", "密码");

        //3.在通道上创建1个运输SQL的交通工具.
        PreparedStatement ps = conn.prepareStatement("");

        //4.使用交通工具运输SQL;
        String sql = "update staffs set age=18 where username='Martin';";
        int couner = ps.executeUpdate(sql);
        System.out.printf("更新了%s条数据\n", couner);

        //5.回收数据库资源
        if (conn != null) {
            conn.close();
        }

        if (ps != null) {
            ps.close();
        }


    }
}

4.查询

import java.sql.*;
import java.util.Arrays;

public class Select03 {
    public static void main(String[] args) throws Exception {
        //1.完成driver注册
        Class.forName("com.mysql.jdbc.Driver");

        //3.创建数据库连接
        String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8";
        Connection conn = DriverManager.getConnection(dbURL, "用户", "密码");

        //4.创建交通工具
        PreparedStatement ps = conn.prepareStatement("");


        //5.使用交通工具,执行SQL获取查询结果【临时表】
        String sql = "select username, age,salary from staffs;";

        //6.返回ResultSet接口的实现类对象
        ResultSet rs = ps.executeQuery(sql);

        //7.ResultSet对象的数据,next()执行一次,指针向下移动一行;
        /*
        如果指针指向位置是1个具体数据行,    此时next()将返回true
        如果指针指向的位置不是1个具体数据行,此时next()将返回false
         */
        while (rs.next()) {
            String name = rs.getString("username");
            int age = rs.getInt("age");
            float salary = rs.getFloat("salary");
            System.out.println("姓名:" + name + "年龄:" + age + "工资:" + salary);
        }

        //8.回收数据库连接资源
        if (rs != null) {
            rs.close();
        }

        if (ps != null) {
            ps.close();
        }

        if (conn != null) {
            conn.close();
        }


    }
}

5.SQL预编译和批量执行

SQL预编译可以防止SQL注入,批量执行可以提升SQL执行的效率;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class prepareStatement04 {
    public static void main(String[] args) throws Exception {
        //1.注册MySQL的driver
        Class.forName("com.mysql.jdbc.Driver");
        //2.创建数据库连接
        String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8";
        Connection conn = DriverManager.getConnection(dbURL, "用户", "密码");
        //3.预编译形式的SQL语句
        String preparedSQL = "insert into staffs(username,age,salary) values (?,?,?);";
        PreparedStatement ps = conn.prepareStatement(preparedSQL);
        //4.生成批量操作的SQL语句
        for (int i = 0; i <= 100; i++) {
            ps.setString(1, "张根" + i);
            ps.setInt(2, 18);
            ps.setDouble(3, 191222.12);
            ps.addBatch();
        }
        //5.一次性批量执行100条SQL语句
        ps.executeBatch();

        //6.释放数据库资源
        if (ps != null) {
            ps.close();
        }
        if (conn != null) {
            conn.close();
        }


    }
}

6.jdbc事务操作

connection.setAutoCommit(false):开启事务
commit():事务
提交/执行
rollback:事务回滚
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Transaction05 {
    //jdbc的事务操作
    public static void main(String[] args) throws Exception {
        //1.注册MySQL driver
        Class.forName("com.mysql.jdbc.Driver");
        //2.创建数据库连接
        String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8";
        Connection conn = DriverManager.getConnection(dbURL, "用户", "密码");
        //3.命令启动事务相当于执行start transaction;
        conn.setAutoCommit(false);
        PreparedStatement ps = conn.prepareStatement("");
        String sql1 = "delete from staffs where username='张根85';";
        String sql2 = "delete from staffs where username='张根86';";

        try {
            int count1 = ps.executeUpdate(sql1);
            int count2 = ps.executeUpdate(sql2);
            System.out.println(count1);
            System.out.println(count2);
            conn.commit();
        } catch (SQLException e) {
            //SQL执行出现异常回滚
            System.out.println("回滚了!");
            conn.rollback();
        } finally {
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }

        }


    }
}

三、DAO封装

ORM可以帮助我们把数据中表映射为class类,把每表中的每条记录映射为object对象,使我们可以通过代码操作数据库,在这个基础之上我们还可以进一步对操作数据库的代码进行封装,那就是使用DAO层。

在Java中我们可以使用DAO类对JDB操作表的细节进行代码封装;

DAO(Database Access Object)是指可以提供数据库访问对象的类

作用:数据库访问对象(DAO)在开发时提供针对某1张表的增删改查操作细节;

优势:DAO可以提高代码封装性,通过数据库访问对象可以避免反复书写SQL以及JDBC开发步骤的书写;

开发规则:

1个DAO类中封装1张表的封装细节;

DAO类命名规则:表名+Dao,比如对employee表的增删改查操作细节进行封装,此时的DAO就应该命名为EmployeeDAO;

DAO类所在包的命名规则:公司网站的域名.dao,例如com.le.dao;

参考