数据库可以看做是一组相关数据的集合。

1.数据持久技术简介

将数据保留在存储介质中,需要的时候能够找到他们。并且可以对数据进行修改,就属于数据持久化。

Java中数据持久化技术很多

1.1 文本文件

通过Java I/O技术将数据保存在本地文件中,然后进行读写操作,这些文件一般是结构化文档,如XML、JSON、CSV等文件。结构化文档就是文件内部采取某种方式将数据组织起来。

1.2 对象序列化

序列化用于将某个对象及其他的状态写入到文件中,它保证了被写入的对象之间的关系,当需要这个对象时,可以完整地从文件重新构造出来,并保持原来的状态。在Java中实现java.io.Serilizable接口的对象才能被序列化和反序列化。Java还提供两个流ObjectInputStream和ObjectOutputStream。但序列化不支持事务处理、查询或者向不同的用户共享数据。序列化只适用于最简单的应用,或者在某些无法有效的支持数据库的嵌入式系统中。

1.3 数据库

将数据保存在数据库中是不错的选择,数据库后面是一个数据库管理系统,它支持事务并发处理,并发访问,高级查询和SQL语言。Java对象保存到数据库中主要的技术有JDBC、EJB、ORM框架等。JDBC将重点介绍

2.MySQL

2.1 连接

mysql -h localhost -u root -p

2.2 常用命令


2.2.1 help

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
notee     (\t) Don't write into outfile.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.
2.2.2 退出
quie/exit
2.2.3数据库管理
命令    解释
show databases; 查看数据库
create database DBName; 创建数据库
use DBName; 使用数据库
drop database DBName; 删除数据库
mysql> create database DBName;
Query OK, 1 row affected (0.00 sec)

mysql> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dbname             |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.01 sec)

mysql> use dbname;
Database changed

mysql> drop database dbname;
Query OK, 0 rows affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.00 sec)

2.2.4数据表管理

数据表操作命令:
命令 解释
show tables 展示当前数据库下的所有表格
desc tableName 展示tableName的表结构
mysql> use world
Database changed
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.00 sec)

mysql> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql>

3.JDBC技术

Java中的数据库编程是通过JDBC实现的。使用JDBC技术涉及三种不同的角色:Java官方、开发人员、数据库厂商。如下图。

  • Java官方提供JBDC接口,Connection、Statement和ResultSet等
  • 数据厂商为了支持Java使用自己的数据库,根据这些接口提供了具体的实现类,这些具体类称为JDBC Driver
  • 对于开发人员而言,JDBC提供了一致的API,开发人员不用关心实现接口的细节。

3.1 JDBC API

JDBC API为Java开发者使用数据库提供了统一的编程接口,它由一组Java类和接口组成。这种类和接口来自java.sql和javax.sql两个包。
  • java.sql:这个包中的类和接口主要针对基本的数据编程服务,如连接、执行、预编译、批处理查询等。
  • javax.sql为数据库方面的高级操作提供了接口和类,提供分布式服务、连接池和行集等。

3.2 加载驱动程序

在编程实现数据库连接时,JVM必须先加载特定厂商提供的数据库驱动程序。使用Class.forName()方法实现驱动程序的加载过程。
不同驱动的加载方法如下:
//JDBC-ODBC桥接,Java自带
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//数据库厂商提供
Class.feoName("特定的JDBC驱动程序类名");
//加载MySQL驱动程序,需要预先MySQL驱动程序所在的路径
Class.forName("com.mysql.jdbc.Driver");

3.3 建立数据连接

  • static Connection getConnection(String url):尝试通过一个URL建立数据库连接。DriverManager会试图从已注册的驱动中选择恰当的驱动来建立连接。
  • static Connection getConnection(String url, Properties info):尝试通过url建立数据库连接,一些连接参数可以按照键值对的形式放置到info中,Properties是Hashtable的子类。是一种Map结构。
  • static Connection getConnection(String url, String user, String password)。
以上方法会抛出SQLConnection异常,需要处理异常。
JDBC语法规则:
jdbc:<subprotocol>:<subname>
它由三部分组成:
(1)协议:jdbc表示协议,他是唯一的,JDBC只有这一种协议
(2)子协议:主要用于识别数据库驱动程序,不同的数据驱动程序的子协议不同。
(3)子名:他属于专门的驱动连接,不同的专有驱动程序可以采用不同的实现。
对于不同的数据库,厂商提供的驱动程序和连接URL都不同。
数据库名 驱动程序 URL
MS SQLServer com.microsoft.SQLServerDriver jdbc.microsoft:sqlserver://[ip]:[port]
JDBC-ODBC sun.jdbc.odbc.JdbcOdbcDriver jdbc:odbc:[odbcsource]
Oracle thin driver oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@[ip]:[port]:[sid]
MySQL com.mysql.jdbc.Driver jdbc:mysql://ip/database
建立数据库连接的代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBC {
    public static void main(String[] args){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("驱动程序加载成功。");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败。");
            //退出
            return;
        }

        String url = "jdbc:mysql://localhost:3306/mysql?vertifyServerCertificate=false&useSSL=false";
        String user = "root";
        String pwd = "1234";

        try (Connection conn = DriverManager.getConnection(url, user, pwd)) {
            System.out.println("数据库连接成功:" + conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
执行结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=53492:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\编程\eclipseJavaCode\IXml\out\production\IXml;E:\编程\eclipseJavaCode\IXml\lib\jaxws-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-rt.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-tools.jar;E:\编程\eclipseJavaCode\IXml\lib\activation.jar;E:\编程\eclipseJavaCode\IXml\lib\FastInfoset.jar;E:\编程\eclipseJavaCode\IXml\lib\gmbal-api-only.jar;E:\编程\eclipseJavaCode\IXml\lib\http.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr173_api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr181-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr250-api.jar;E:\编程\eclipseJavaCode\IXml\lib\management-api.jar;E:\编程\eclipseJavaCode\IXml\lib\mimepull.jar;E:\编程\eclipseJavaCode\IXml\lib\policy.jar;E:\编程\eclipseJavaCode\IXml\lib\resolver.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-api.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\stax-ex.jar;E:\编程\eclipseJavaCode\IXml\lib\streambuffer.jar;E:\编程\eclipseJavaCode\IXml\lib\woodstox.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-xjc.jar;E:\编程\Jar\mysql-connector-java-5.1.47.jar" JDBC
驱动程序加载成功。
数据库连接成功:com.mysql.jdbc.JDBC4Connection@4bf558aa

Process finished with exit code 0
改良写法:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBC {
    public static void main(String[] args){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("驱动程序加载成功。");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败。");
            //退出
            return;
        }

        String url = "jdbc:mysql://localhost:3306/mysql";
        //创建Properties对象
        Properties properties = new Properties();
        properties.setProperty("user" , "root");
        properties.setProperty("password", "1234");
        properties.setProperty("vertifyServerCertificate", "false");
        properties.setProperty("useSSL", "false");

        try (Connection conn = DriverManager.getConnection(url, properties)) {
            System.out.println("数据库连接成功:" + conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
通过读取配置文件的方法进行数据库连接的编码示例:
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBC {
    public static void main(String[] args){
        //加载驱动程序
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("驱动程序加载成功。");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败。");
            //退出
            return;
        }

        //加载配置文件
        Properties properties = new Properties();
        try {
            //属性文件一般放在src中,这种目录称为资源目录,获得资源目录要求通过java反射机制。
            //.class.getClassLoader().getResourceAsStream("config.properties")运行时能够读取config.properties的文件输入流。
            InputStream inputStream = JDBC.class.getClassLoader().getResourceAsStream("config.properties");
            properties.load(inputStream);
        } catch (IOException e) {
            //退出
            return;
        }
        String url = "jdbc:mysql://localhost:3306/mysql";

        try (Connection conn = DriverManager.getConnection(url, properties)) {
            System.out.println("数据库连接成功:" + conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
config.properties文件内容
#MYSQL config properties
user=root
password=1234
useSSL=false
vertifyServerCertificate=false

3.4 三个重要接口

JDBC三个最重要的接口分别是:Connection,Statement和ResultSet。
接口名称 接口介绍 常用方法
Connection接口 java.sql.connection接口实现对象代表与数据库连接
Statement createStatement():创建一个语句对象,语句对象用来将SQL语句发送到数据库。
PreparedStatement prepareStatement():创建一个预编译的语句对象,用来将参数化的SQL语句发送到数据库,参数包含一个或者多个问好“?”占位符。
CallableStatement prepareCall(String sql):创建一个调用存储过程的语句对象,参数是调用的存储过程,参数包含一个或者多个问好“?”占位符。
close():关闭数据库的连接,在用完数据库连接后必须关闭数据库连接
isClosed():判断连接是否已经关闭。
Statement接口
java.sql.Statement称为语句对象,用于提供用于向数据库发出SQL语句,并且给出访问结果。Connection接口提供了生成Statement的方法一般情况下通过connection.createStatement():的方法就能得到Statement对象。
java.sql.Statement:实现对象用来执行基本的SQL语句;
java.sql.PreparedStatement继承Statement接口,实现对象用于执行预编译的SQL语句;
CallableStatement实现对象用于调用数据库中的存储过程。
executeQuery():运行查询语句,返回ResultSet对象。
excuteUpdate():运行更新操作,返回更新操作的行数
close():关闭语句对象。
isClosed():判断语句对象是否已经关闭。
ResultSet接口 Statement执行SQL语句时,如果是SELECT语句,则会逐行返回结果集,结果集通过接口java.sql.ResultSet描述,提供逐行访问结果集的方法,通过该方法能够访问结果集中不同的字段内容。
close():关闭结果集对象。
isClosed():判断结果集对象是否已经关闭。
next():将结果集光标从当前位置向后移动一行。
getString():获得在数据库里是CHAR或者VARCHR等字符串类型的数据,返回值是String类型。
getFloat():获得在数据库里是浮点类型的数据,返回值是float。
getDouble():获取在数据库里是浮点类型的数据,返回值是double。
getDate():获得在数据库里是日期类型的数据,返回值是java.sql.Date。
getBoolbean():获得在数据库里是布尔值类型的数据,返回类型是boolBean
getBlob():获得在数据库里是Blob(二进制大型对象)类型的数据,返回值类型是Blob类型
getClob():获得在数据库是Clob(字符串大型对象)类型的数据,返回值是Clob
以上方法要求有列名称参数或者列索引(从1开始)
Statement对象用于执行不带参数的SQL语句,示例如下。
Connection conn = DriveManager.getConnection("jdbc:odbc:accessdb", "admin", "admin");
Statement stmt = conn.createStatement();
ResultSet rst = stmt.excuteQuery("select userid,name from user");
PreparedStatement对象用于执行带参数的预编译SQL语句,他的典型使用如下。
Connection conn = DriverManager.getConnection("jdbc:odbc:accessdb", "admin", "admin");
PreparedStatement pstmt = conn.prepareStatement("insert into user values(?, ?)");
//绑定第一个参数
pstmt.setString(1, 10);
//绑定第二个参数
pstmt.setString(2, "tom");
CallableStatement对象用于执行对数据库已存储过程的调用,他的典型使用如下:
Connection conn = DriverManger.getConnection("jdbc:odbc:accessdb", "admin", "admin");
strSQL = "{call proc_userinfo(?,?)}";
java.sql.CallableStatement sqlStmt = conn.prepaleCall(strSQL);
sqlStmt.setString(1, "tony");
//执行存储过程
int i = sqlStmt.executeUpdate();
ResultSet 示例代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBC {
    public static void main(String[] args){
        //加载驱动程序
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("驱动程序加载成功。");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败。");
            //退出
            return;
        }

        //加载配置文件
        Properties properties = new Properties();
        try {
            //属性文件一般放在src中,这种目录称为资源目录,获得资源目录要求通过java反射机制。
            //.class.getClassLoader().getResourceAsStream("config.properties")运行时能够读取config.properties的文件输入流。
            InputStream inputStream = JDBC.class.getClassLoader().getResourceAsStream("config.properties");
            properties.load(inputStream);
        } catch (IOException e) {
            //退出
            return;
        }
        String url = "jdbc:mysql://localhost:3306/mysql";

        try (
                Connection conn = DriverManager.getConnection(url, properties);
                Statement statement = conn.createStatement();
                ResultSet resultSet = statement.executeQuery("select user, host from user")) {
            while (resultSet.next()) {
                System.out.printf("user:%s;host:%s\n", resultSet.getString("user"), resultSet.getString("host"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
ResultSet 示例代码执行结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:56005,suspend=y,server=n -javaagent:C:\Users\FL\.IntelliJIdea2019.1\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\编程\eclipseJavaCode\IXml\out\production\IXml;E:\编程\eclipseJavaCode\IXml\lib\jaxws-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-rt.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-tools.jar;E:\编程\eclipseJavaCode\IXml\lib\activation.jar;E:\编程\eclipseJavaCode\IXml\lib\FastInfoset.jar;E:\编程\eclipseJavaCode\IXml\lib\gmbal-api-only.jar;E:\编程\eclipseJavaCode\IXml\lib\http.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr173_api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr181-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr250-api.jar;E:\编程\eclipseJavaCode\IXml\lib\management-api.jar;E:\编程\eclipseJavaCode\IXml\lib\mimepull.jar;E:\编程\eclipseJavaCode\IXml\lib\policy.jar;E:\编程\eclipseJavaCode\IXml\lib\resolver.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-api.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\stax-ex.jar;E:\编程\eclipseJavaCode\IXml\lib\streambuffer.jar;E:\编程\eclipseJavaCode\IXml\lib\woodstox.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-xjc.jar;E:\编程\Jar\mysql-connector-java-5.1.47.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar" JDBC
Connected to the target VM, address: '127.0.0.1:56005', transport: 'socket'
驱动程序加载成功。
user:root;host:localhost
Disconnected from the target VM, address: '127.0.0.1:56005', transport: 'socket'

Process finished with exit code 0

4.案例:数据CRUD操作

CRUD:增(Create)删(Delete)改(Update)查(Read)。
以下案例介绍实现CRUD操作。

4.1数据库编程一般过程

1.加载数据库驱动程序 ··> 2.建立数据库连接 ··> 3.创建语句对象 ··> 4.绑定参数 ··> 5.执行查询(R) ··> 6.遍历结果集 ··> 7.释放资源




5.执行修改(C、U、D) ··>

4.2数据库查询操作

(1)有条件查询
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class CRUDExample {

    //连接数据库url
    static String url;
    //创建Properties对象
    static Properties properties = new Properties();

    //1.驱动程序加载
    static {
        //获得属性文件输入流
        InputStream inputStream = CRUDExample.class.getClassLoader().getResourceAsStream("config.properties");

        try {
            //加载属性文件内容到Properties对象
            properties.load(inputStream);
            //从属性文件中取出url
            url = properties.getProperty("url");
            //从属性文件中取出driver
            String driverClassName = properties.getProperty("driver");
            Class.forName(driverClassName);
            System.out.println("驱动程序加载成功\n");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败\n");
        } catch (IOException e) {
            System.out.println("属性文件加载失败\n");
        }
    }

    public static void main(String[] args) {
        //查询数据
        read();
    }

    //数据查询操作
    public static void read() {

        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            //2.创建数据库连接
            connection = DriverManager.getConnection(url, properties);
            //3.创建语句对象
            preparedStatement = connection.prepareStatement("select name, userid from"
                    +" user where userid > ? order by userid");
            //4.绑定参数
            preparedStatement.setInt(1,0);
            //5.执行查询
            resultSet =preparedStatement.executeQuery();
            //6.遍历结果集
            while (resultSet.next()) {
                System.out.printf("id:%d,name:%s\n", resultSet.getInt("userid"), resultSet.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {

                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {

                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {

                }
            }
        }
    }
}
执行结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:49734,suspend=y,server=n -javaagent:C:\Users\FL\.IntelliJIdea2019.1\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\编程\eclipseJavaCode\IXml\out\production\IXml;E:\编程\eclipseJavaCode\IXml\lib\jaxws-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-rt.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-tools.jar;E:\编程\eclipseJavaCode\IXml\lib\activation.jar;E:\编程\eclipseJavaCode\IXml\lib\FastInfoset.jar;E:\编程\eclipseJavaCode\IXml\lib\gmbal-api-only.jar;E:\编程\eclipseJavaCode\IXml\lib\http.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr173_api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr181-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr250-api.jar;E:\编程\eclipseJavaCode\IXml\lib\management-api.jar;E:\编程\eclipseJavaCode\IXml\lib\mimepull.jar;E:\编程\eclipseJavaCode\IXml\lib\policy.jar;E:\编程\eclipseJavaCode\IXml\lib\resolver.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-api.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\stax-ex.jar;E:\编程\eclipseJavaCode\IXml\lib\streambuffer.jar;E:\编程\eclipseJavaCode\IXml\lib\woodstox.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-xjc.jar;E:\编程\Jar\mysql-connector-java-5.1.47.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar" CRUDExample
Connected to the target VM, address: '127.0.0.1:49734', transport: 'socket'
驱动程序加载成功

id:1,name:aaa
id:2,name:bbb
id:3,name:ccc
id:4,name:ddd
id:5,name:eee
id:6,name:fff
id:7,name:ggg
Disconnected from the target VM, address: '127.0.0.1:49734', transport: 'socket'

Process finished with exit code 0
(2)无条件查询

    //查询最大的用户id
    public static int readMaxUserId() {

        int maxId = 0;
        try (
                //2. 创建数据库连接
                Connection conection = DriverManager.getConnection(url, properties);
                //3. 创建语句对象
                PreparedStatement preparedStatement = conection.prepareStatement("select max(userid) from user");
                //4. 绑定参数
                //preparedStatement.setInt(1, 0);
                //5. 执行查询(R)
                ResultSet resultSet = preparedStatement.executeQuery()) {
            //6. 遍历结果集
            if(resultSet.next()) {
                maxId = resultSet.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return maxId;
    }
执行结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:49978,suspend=y,server=n -javaagent:C:\Users\FL\.IntelliJIdea2019.1\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\编程\eclipseJavaCode\IXml\out\production\IXml;E:\编程\eclipseJavaCode\IXml\lib\jaxws-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-rt.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-tools.jar;E:\编程\eclipseJavaCode\IXml\lib\activation.jar;E:\编程\eclipseJavaCode\IXml\lib\FastInfoset.jar;E:\编程\eclipseJavaCode\IXml\lib\gmbal-api-only.jar;E:\编程\eclipseJavaCode\IXml\lib\http.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr173_api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr181-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr250-api.jar;E:\编程\eclipseJavaCode\IXml\lib\management-api.jar;E:\编程\eclipseJavaCode\IXml\lib\mimepull.jar;E:\编程\eclipseJavaCode\IXml\lib\policy.jar;E:\编程\eclipseJavaCode\IXml\lib\resolver.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-api.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\stax-ex.jar;E:\编程\eclipseJavaCode\IXml\lib\streambuffer.jar;E:\编程\eclipseJavaCode\IXml\lib\woodstox.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-xjc.jar;E:\编程\Jar\mysql-connector-java-5.1.47.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar" CRUDExample
Connected to the target VM, address: '127.0.0.1:49978', transport: 'socket'
驱动程序加载成功

最大id=7
Disconnected from the target VM, address: '127.0.0.1:49978', transport: 'socket'

Process finished with exit code 0

4.3 数据库修改操作

(1)数据插入

//数据插入
    public static void create(String newName) {
        try (   //2. 创建数据库连接
                Connection connection = DriverManager.getConnection(url, properties);
                //3. 创建语句对象
                PreparedStatement preparedStatement = connection.prepareStatement("insert into user (userid, name) values (?, ?)")) {
            //查看最大值
            int maxId = readMaxUserId();

            //4. 绑定参数
            preparedStatement.setInt(1, ++maxId);
            preparedStatement.setString(2, newName);
            //5. 执行修改(C、U、D)
            int affectedRows = preparedStatement.executeUpdate();
            System.out.printf("成功插入%d条数据\n", affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
执行结果
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50201,suspend=y,server=n -javaagent:C:\Users\FL\.IntelliJIdea2019.1\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\编程\eclipseJavaCode\IXml\out\production\IXml;E:\编程\eclipseJavaCode\IXml\lib\jaxws-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-rt.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-tools.jar;E:\编程\eclipseJavaCode\IXml\lib\activation.jar;E:\编程\eclipseJavaCode\IXml\lib\FastInfoset.jar;E:\编程\eclipseJavaCode\IXml\lib\gmbal-api-only.jar;E:\编程\eclipseJavaCode\IXml\lib\http.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr173_api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr181-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr250-api.jar;E:\编程\eclipseJavaCode\IXml\lib\management-api.jar;E:\编程\eclipseJavaCode\IXml\lib\mimepull.jar;E:\编程\eclipseJavaCode\IXml\lib\policy.jar;E:\编程\eclipseJavaCode\IXml\lib\resolver.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-api.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\stax-ex.jar;E:\编程\eclipseJavaCode\IXml\lib\streambuffer.jar;E:\编程\eclipseJavaCode\IXml\lib\woodstox.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-xjc.jar;E:\编程\Jar\mysql-connector-java-5.1.47.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar" CRUDExample
Connected to the target VM, address: '127.0.0.1:50201', transport: 'socket'
驱动程序加载成功

成功插入1条数据Disconnected from the target VM, address: '127.0.0.1:50201', transport: 'socket'

Process finished with exit code 0

(2)数据更新

  //数据更新
    public static void update() {
        try (   //2. 创建数据库连接
                Connection connection = DriverManager.getConnection(url, properties);
                //3. 创建语句对象
                PreparedStatement preparedStatement = connection.prepareStatement("update user set name = ? where userid = ?")) {
            //4.绑定参数
            preparedStatement.setString(1, "Tom");
            preparedStatement.setInt(2, 4);
            //5.执行修改
            int affectedRows = preparedStatement.executeUpdate();

            System.out.printf("成功更新%d条数据\n", affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

(3)数据删除

 //数据删除操作
    public static void delete() {

        try(    //2.创建数据库连接对象
                Connection connection = DriverManager.getConnection(url, properties);
                //3.创建语句对象
                PreparedStatement preparedStatement = connection.prepareStatement("delete from user where userid = ?")) {

            //查询最大值
            int maxInt = readMaxUserId();
            //4. 绑定参数
            preparedStatement.setInt(1, maxInt);
            //5. 执行修改(C、U、D)
            int affectedRows = preparedStatement.executeUpdate();

            System.out.printf("成功删除%d行\n", affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

执行结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50444,suspend=y,server=n -javaagent:C:\Users\FL\.IntelliJIdea2019.1\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\编程\eclipseJavaCode\IXml\out\production\IXml;E:\编程\eclipseJavaCode\IXml\lib\jaxws-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-rt.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxws-tools.jar;E:\编程\eclipseJavaCode\IXml\lib\activation.jar;E:\编程\eclipseJavaCode\IXml\lib\FastInfoset.jar;E:\编程\eclipseJavaCode\IXml\lib\gmbal-api-only.jar;E:\编程\eclipseJavaCode\IXml\lib\http.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr173_api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr181-api.jar;E:\编程\eclipseJavaCode\IXml\lib\jsr250-api.jar;E:\编程\eclipseJavaCode\IXml\lib\management-api.jar;E:\编程\eclipseJavaCode\IXml\lib\mimepull.jar;E:\编程\eclipseJavaCode\IXml\lib\policy.jar;E:\编程\eclipseJavaCode\IXml\lib\resolver.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-api.jar;E:\编程\eclipseJavaCode\IXml\lib\saaj-impl.jar;E:\编程\eclipseJavaCode\IXml\lib\stax-ex.jar;E:\编程\eclipseJavaCode\IXml\lib\streambuffer.jar;E:\编程\eclipseJavaCode\IXml\lib\woodstox.jar;E:\编程\eclipseJavaCode\IXml\lib\jaxb-xjc.jar;E:\编程\Jar\mysql-connector-java-5.1.47.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar" CRUDExample
Connected to the target VM, address: '127.0.0.1:50444', transport: 'socket'
驱动程序加载成功

成功删除1行
Disconnected from the target VM, address: '127.0.0.1:50444', transport: 'socket'

Process finished with exit code 0