一、持久化

持久化(Persistence),是将数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在数据库中,或者是存储在磁盘文件中、XML文件中等等。

  • JDBC就是一种持久化机制,文件IO也是一种持久化机制;
  • 浅显的理解,在一定周期内保持不变的就是持久化,,持久化是针对时间来说的。数据库中的数据就是持久化了的数据,自己要不去修改或删除;

二、JDBC简介

1、什么是JDBC

JDBC(Java Data Base Connectivity 数据库连接)是一种用于执行SQL语句的Java API ,可以为多种数据库提供统一访问,它是由一组用Java语言编写的类和接口组成。 JDBC提供了一组标准,据此可以构建更高级别的工具和接口,使数据库开发人员能够编写数据库应用程序。

  • 有了JDBC向各种数据库发送SQL语句就是一件很容易的事;
  • Java数据库连接体系结构是用于Java应用程序

2、JDBC的三大作用

  1. 与数据库建库建立连接;
  2. 将Java中拼写的SQL语句发送到数据库中执行;
  3. 处理执行结果。

3、JDBC简介

  • JDBC在JavaEE开发中的作用:
    1、在技术上,JDBC实现了数据的添加、删除、修改、查询等操作,是Java应用程序与数据通信的桥梁。
    2、软件开发中界面负责数据输入,并将输入的数据提交给Java程序,Java程序通过JDBC将数据保存到数据库中。JDBC也负责从数据库中获取数据,然后将数据交给Java程序,最后Java程序将数据交给界面显示,如下图所示:

4、JDBC API

  • Java程序访问数据库,使用JDBC提供的一套标准的API,这套API主要是接口,有各个数据库厂商提供,并封装成jar报的形式提供给开发人员,如下图所示:
  • 在实际项目开发当中,我们要确定连接的数据库,在对应的数据库官方网站下载厂商已经实现的数据库连接用的驱动jar包,将驱动jar包导入到我们的项目中即可完成对特定数据库连接的支持。
  • 项目支持了数据库的连接之后,就需要开发人员开发具体的程序来实现数据库数据的操作。Java提供了以下接口和类俩支持和数据库之间的操作:

类或接口

作用

java.sql.DriverManager 类

表示数据库驱动包的管理对象

java.sql.Connection 接口

表示数据库的连接对象

java.sql.Statement 接口

表示发送SQL给数据库执行对象

java.sql.PreparedStatement 接口

java.sql.Statement的子接口,表示SQL预编译对象

java.sql.ResultSet接口

表示从数据库查询返回的结果数据

  • JDBC在运行时大致步骤如下图,执行的顺序如下:
    1、由DriverManager()类驱动数据库;
    2、由Connection()接口负责将Java程序和数据库连接起来;
    3、由Statement()接口将SQL语句发送到数据库中;
    4、由ResultSet接口处理数据库返回的结果集。

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_数据库

1、DriverManager类:

  • DriverManager管理一组JDBC驱动程序的基本服务,可以通过该类来建立并获取和指定数据库之间的链接。

返回值

方法名称

Connection

getConnection(String url, String str2)

Connection

getConnection(String url)

  • 数据库连接字符串:
    DriverManager类在加载数据库驱动时,需要指明url,这里url通常称作数据库连接字符串。数据库连接字符串用于确定连接协议、连接的数据库服务器、端口号、数据库名称及其连接参数。

数据库连接字符串格式如下:

主协议:子协议://数据库服务器:端口号/数据库名称:?连接参数

2、Connection接口

  • Connection接口的作用让Java程序与数据库之间建立连接。只有在数据库连接后 ,才能将SQL语句发送到数据库中执行。Connection接口常用方法如下表:

返回值

方法名称

Statement

statement() 创建一个Statement对象将SQL语句发送到数据库

PreparedStatement

PreparedStatement(String sql) 创建一个PreparedStatement对象来讲参数化的SQL语句发送到数据库

PreparedStatement

prepareStatement(String SQL, int autoGeneratedKets) 创建一个默认的PreparedStatement对象,该对象能获取自动生成的键

void

setAutoCommit(Boolean autoCommit) 将此连接的自动提交模式设定为给定状态

void

commit() 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection对象当前持有的所有数据库锁

void

rollback() 取消在当前食事务中进行的所有更改,并释放此 Connection对象当前持有的所有数据库锁

boolean

isClosed() 查询此Connection对象是否已经关闭

void

close() 立即释放此Connection对象的数据库和JDBC资源,而不是等待他们自动释放

3、Statement接口

  • Statement接口负责将SQL语句发送到数据库中,并告知数据库执行SQL语句,获取数据执行的结果。Statement接口常用的方法如下表:

返回值

方法名称

boolean

execute(String sql) 执行给定的SQL语句该句可能返回多个结果

boolean

execute(Sreing sql ,int autoGeneratedKeys) 执行给定的SQL语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于获取

int

executeUpdate(String sql) 执行给定的SQL语句,该语句可能为INSERT、UPDATE、DELETE语句,或者不返回任何内容的SQL语句

int

executeUpdate(String sql, int autoGeneratedKey) 执行给定的SQL语句,并用给定标记通知驱动程序由此Statement生成的自动生成键是否可用于获取

ResultSet

executeQuery(String sql) 执行给定的SQL语句,该语句返回单个ResultSet对象

boolean

isClosed() 获取是否已关闭了此Statement对象

void

close() 立即释放此Statement的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作

4、PreparedStatement接口

  • PreparedStatement接口是Statement接口的子接口,表示预编译的SQL语句的对象,SQL对象被预编译并存储在Preparement对象中,然后可以使此对象多次高效的执行该语句。

返回值

方法名称

boolean

execute() 在此PreparedSetment对象中执行SQL语句,该语句可以是任何种类的SQL语句

void

setObject(int parameterindex, Object x) 使用给定对象指定参数的值

int

executeUpdate(int parameterIndex, Object x) 在此PreparedStatement对象中执行SQL语句,给语句必须是一个DML语句

ResultSet

executeQuery() 在此PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象

5、ResultSet接口

  • ResultSet接口表示查询的结果集,通常通过执行查询数据库的语句生成。ResultSet对象具有指向其当前数据行的光标。最初,光标被置于前一行之前,next烦方法将光标移至下一行,因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。

返回值

方法名称

boolean

next() 将光标从当前位置向前移一行

Object

getObject(int columnIndex) 以Java编程语言中Object的形式获取此ResultSet对象的当前行中指定的列的值

Object

getObject(String cloumnLabel) 以Java编程语言中Object的形式获取此ResultSet对象的当前行中指定的列的值

boolean

isClosed() 获取此ResultSet对象是否已关闭

void

close() 立即释放此ResultSet对象的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作

6、ResultSetMeteData接口

  • ResultSetMeteData接口可用于获取关于ResultSet对象中列的类型和属性信息的对象,列的类型和属性信息称为表的元数据。

返回值

方法名称

String

getCatelogName(int column) 获取指定列的表目录名称。

String

getColumnClassName(int column) 如果调用方法ResultSet.getObject从列表中获取值,则返回构造其实例的Java类的完全限定名。

int

getColumnCount() 返回ResultSet对象中的列数。

int

getColumnDisplaySize(int column) 指示指定列的最大标准宽度,以字符为单位。

String

getColumnLabel(int column) 6. 处理执行结果;

String

getColumnName(int column) 获取指定列的名称。

int

getColumnType(int column) 获取指定列的SQL类型。

String

getColumnTypeName(int column) 获取指定列的数据库特定的类型名称。

int

getPrecision(int column) 获取指定列的指定列宽。

int

getScale(int column) 获取指定列的小数点右边的位数。

String

getSchemaName(int column) 获取指定列的表模式。

String

getNameTable(int column) 获取指定列的名称。

boolean

isAutoIncrement(int column) 指示是否自动为指定列进行编号。

boolean

isCaseSensitive(int column) 指示列的大小写是否有关系。

boolean

isCurrency(int column) 只是指定的列是否是一个哈希代码值。

boolean

isDefinitelyWritable(int column) 指示在指定的列上进行写操作是否明确可以获得成功。

int

isNullable(int column) 指示指定列中列中的值是否可以为null

boolean

isReadOnly(int column) 只是指定的列是否明确不可写入。

boolean

isSearchable(int column) 指示是否可以在where子句中使用指定的列。

boolean

isSigned(int column) 指示指定列中的值是否带正负号。

boolean

isWritable(int column) 指示在指定列上进行写操作的是否可以获得成功。

三、使用JDBC实现部门管理业务

JDBC操作数据库分为7步

  1. 导入数据库驱动jar包;
  2. 注册数据库驱动程序;
  3. 建立和数据库之间的连接;
  4. 拼写SQL语句;
  5. 向数据库发送并执行SQL语句;
  6. 处理执行结果;
  7. 关闭资源。

1、创建数据库以及实体表

  • 创建数据库命名为:jdbcdemo,在jdbcdemo数据库中创建user表,user表的结构如下表。利用jdbcdemo数据库完成jdbc操作数据库的任务。

列名称

类型

约束

id

int

主键、自增长

username

varchar(20)

用户名

userpass

varchar(20)

密码

createDate

Datetime

创建时间

  • 创建测试jdbc数据库
CREATE DATABASE IF NOT EXISTS jdbcdemo;
USE jdbcdemo;
CREATE TABLE users(
	id INT AUTO_INCREMENT PRIMARY KEY,
	username VARCHAR(20),
	userpass VARCHAR(20),
	createDate Datetime
);

2、实现添加用户业务

业务分析:

  1. 创建java project ,命名为UserManager;
  2. 在UserManager项目中创建一个目录,命名为libs;
  3. 将MySQL驱动jar包导入到libs目录中;
  4. 将libs目录中的MySQL驱动jar包添加到构建路径中;
  5. 在scr中创建包,命名为:com.husung.jdbc.test01;
  6. 在com.husung.jdbc.test01包中创建AddUser类;
  7. 在AddUser类中创建main方法;
  8. 在main方法中编写添加用户代码。

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_mysql_02


将libs目录下的jar包添加到构建路径中的方法File —> Project Structure —>Project Settings —> Modules 进行如下设置:

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_SQL_03


mondodb 在 Java 中清空表字段内容 java jdbc删除数据_SQL_04

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_mysql_05


mondodb 在 Java 中清空表字段内容 java jdbc删除数据_sql_06

添加用户

/**
 * 使用jdbc添加用户的实例
 *
 * @Author 郑虎虎
 * date 2020/11/29 20:44
 */

package com.husung.jdbc.test01;

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

public class AddUserDemo {
    public static void main(String[] args) {
        addUser("宋江", "123456");
        addUser("晁盖","123456");
        addUser("吴用","123456");
        addUser("武松","123456");
    }

    /**
     * 添加用户的方法
     *
     * @param username 用户名称
     * @param userpass 用户密码
     */
    public static void addUser(String username, String userpass) {
        Connection conn = null;
        Statement stat = null;

        try {
            // 1、注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2、建立和数据库之间的连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "数据库名称", "数据库密码");
            // 3、拼写SQL语句
            String sql = "INSERT INTO users(username, userpass) values('" + username + "', '" + userpass + "')";
            // 4、向数据库发送并执行SQL语句
            stat = conn.createStatement();
            int rows = stat.executeUpdate(sql);
            // 5、处理执行结果
            System.out.println("数据库中有" + rows + "条语句执行成功...");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            // 6、关闭资源
            if (stat != null) {
                try {
                    stat.close();
                    stat = null;
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                    conn = null;
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_sql_07

  • 查看数据库中是否插入:
SELECT
	id,
	username,
	userpass
FROM
	users;

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_SQL_08

3、实现修改密码业务

目标: 将id为1的用户的密码更改为789。

/**
 * 通过jdbc修改用户密码的实例
 *
 * @Author 郑虎虎
 * date 2020/11/29 21:53
 */


package com.husung.jdbc.test01;

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

public class UpdateUserDemo {
    public static void main(String[] args) {
        updateUser(1,"789");
    }

    /**
     * 修改用户
     * @param id
     * @param userpass
     */
    public static void updateUser(int id, String userpass){
        Connection conn = null;
        Statement stat = null;

        try {
            // 1、注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2、建立和数据库之间的连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "数据库名称", "数据库密码");
            // 3、拼写sql语句
            String sql = "UPDATE users SET userpass='789' WHERE id=1;";
            // 4、向数据库发送并执行SQL对象
            stat = conn.createStatement();
            int rows = stat.executeUpdate(sql);
            // 5、处理执行结果
            System.out.println("数据库中有" + rows + "条语句执行了。");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally{
            // 6、关闭资源
            if (stat != null) {
                try {
                    stat.close();
                    stat = null;
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                    conn = null;
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_数据库_09

  • 在数据库中查看
SELECT
	id,
	username,
	userpass
FROM
	users
WHERE
	id = 1;

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_SQL_10

4、实现删除用户业务

/**
 * 使用jdbc删除用户的实例
 *
 * @Author 郑虎虎
 * date 2020/11/30 11:41
 */

package com.husung.jdbc.test01;

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

public class DeleteUser {
    public static void main(String[] args) {
        delete(1);
    }

    /**
     * 根据id删除用户
     * @param id
     */
    public static void delete(int id){
        Connection conn = null;
        Statement stat = null;
        try {
            // 1、注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2、建立和数据之间的连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "数据库名称", "数据库密码");

            // 3、拼写SQL语句
            String sql = "DELETE FROM users WHERE id='1';";

            // 4、向数据库发送并执行SQL
            stat = conn.createStatement();
            int rows = stat.executeUpdate(sql);

            // 5、处理执行结果
            System.out.println("数据库中有" + rows + "条语句执行了!");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {
            // 6、关闭资源
            if (stat != null) {
                try {
                    stat.close();
                    stat = null;
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                    conn = null;
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_sql_11

  • 在数据库中查看:
SELECT
	id,
	username,
	userpass
FROM
	users;

mondodb 在 Java 中清空表字段内容 java jdbc删除数据_SQL_12