开发环境:

系统:Windows 10

Eclipse:eclipse-jee-2018-12-R-win32-x86_64.zip

MySQL:mysql-installer-community-8.0.15.0.msi

【注】笔者在开发过程中用的Navicat Premium 12查看数据库。关于Navicat Premium 12的安装请参看笔者博文。

Navicat Premium 12安装和破解

5.1 SQL语言简介

SQL语言,是结构化查询语言(Structured Query Language)的简称。是一门特殊母的编程语言。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

SQL语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的结构化查询语言作为数据输入与管理的接口。SQL语言语句可以嵌套,这使他具有极大的灵活性和强大的功能。

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

 DDL(Data Definition Language)数据库定义语言:其实就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上

CREATE TABLE 表名称

(

列名称1 数据类型,

列名称2 数据类型,

列名称3 数据类型,

)

ALTER TABLE table_name

ALTER COLUMN column_name datatype

DROP TABLE 表名称

DROP DATABASE 数据库名称

 DQL(Data Query Language)数据查询语言:数据查询语言DQL用于检索数据库,经常用到的是SELECT子句,FROM子句,WHERE子句。

SELECT <字段名表>

FROM <表或视图名>

WHERE <查询条件>

 DML(Data Manipulation Language)数据操纵语言:就是我们最经常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。

SELECT 列名称 FROM 表名称

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

DELETE FROM 表名称 WHERE 列名称 = 值

 DCL(Data Control Language)数据库控制语言:是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。这个比较少用到。

接下来我们对前三种进行讲解。

5.2 Java操作MySQL

5.2.1 DDL操作

我们来创建一张学生表,字段我们给num,id,name,age,要求num主键,自增。

【代码如下】

package ddl;

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

public class DDL {

public void creatddl() {

// 加载数据库驱动 com.mysql.jdbc.Driver
String driver = "com.mysql.cj.jdbc.Driver";
// 获取mysql连接地址
String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
// 数据名称
String username = "root";
// 数据库密码
String password = "******";//root密码
// 获取一个数据的连接
Connection conn = null;
//创建Statement类对象
Statement stmt = null;

// 获取连接的一个状态
try{
//加载数据库驱动
Class.forName(driver);

//getConnection()方法,连接MySQL数据库!
conn=DriverManager.getConnection(url,username,password);
if(!conn.isClosed()) {
System.out.println("数据库连接成功!");
}

//获取语句对象
stmt = conn.createStatement();
if(!stmt.isClosed()) {
System.out.println("获取对象成功!");
}

//创建数据库
String sql = "DROP TABLE IF EXISTS student";
stmt.executeUpdate(sql);
sql = "CREATE TABLE student ("
+ "num INT NOT NULL AUTO_INCREMENT, "
+ "id VARCHAR(16), PRIMARY KEY (num),"
+ "name VARCHAR(16),"
+ "age INT)";
stmt.executeUpdate(sql);
System.out.println("创建数据库成功!");
}
catch(ClassNotFoundException e){
//数据库驱动类异常处理
System.out.println("数据库驱动加载失败!");
e.printStackTrace();
}
catch(SQLException e1){
//数据库连接失败异常处理
// handle any errors
System.out.println("SQLException: " + e1.getMessage());
System.out.println("SQLState: " + e1.getSQLState());
System.out.println("VendorError: " + e1.getErrorCode());
e1.printStackTrace();
}
catch(Exception e2){
e2.printStackTrace();
}
finally{
try {
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}
catch(SQLException e){
e.printStackTrace();
}
System.out.println("数据库操作成功!");
}
}
}

我们在main函数进行调用。

《数据库 MySQL》第5章 MySQL编程基础(Java)_java


图1

成功运行后,通过Navicat Premium 12可以看到新创建的表。

《数据库 MySQL》第5章 MySQL编程基础(Java)_java_02


图2

5.2.2 DML操作

前文建立了一个学生表,接下来我们向插入数据。

【代码如下】

package dml;

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

public class DML {

public void setdml() {

// 加载数据库驱动 com.mysql.jdbc.Driver
String driver = "com.mysql.cj.jdbc.Driver";
// 获取mysql连接地址
String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
// 数据名称
String username = "root";
// 数据库密码
String password = "******";//root密码
// 获取一个数据的连接
Connection conn = null;
//创建Statement类对象
Statement stmt = null;

// 获取连接的一个状态
try{
//加载数据库驱动
Class.forName(driver);

//getConnection()方法,连接MySQL数据库!
conn=DriverManager.getConnection(url,username,password);
if(!conn.isClosed()) {
System.out.println("数据库连接成功!");
}

//获取语句对象
stmt = conn.createStatement();
if(!stmt.isClosed()) {
System.out.println("获取对象成功!");
}
//要执行的SQL语句
String sql1 = "INSERT INTO student (num,id,name,age) "
+ "values (1,'1001','小文',20)";
stmt.executeUpdate(sql1);

String sql2 = "INSERT INTO student (num,id,name,age) "
+ "values (2,'1002','小明',21)";
stmt.executeUpdate(sql2);

String sql3 = "UPDATE student SET age=22 WHERE id='1001'";
stmt.executeUpdate(sql3);

String sql4 = "DELETE FROM student WHERE id='1002'";
stmt.executeUpdate(sql4);
}
catch(ClassNotFoundException e){
//数据库驱动类异常处理
System.out.println("数据库驱动加载失败!");
e.printStackTrace();
}
catch(SQLException e1){
//数据库连接失败异常处理
// handle any errors
System.out.println("SQLException: " + e1.getMessage());
System.out.println("SQLState: " + e1.getSQLState());
System.out.println("VendorError: " + e1.getErrorCode());
e1.printStackTrace();
}
catch(Exception e2){
e2.printStackTrace();
}
finally{
try {
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}
catch(SQLException e){
e.printStackTrace();
}
System.out.println("数据库操作成功!");
}
}
}

我们在main函数进行调用。

《数据库 MySQL》第5章 MySQL编程基础(Java)_数据库_03


图3

成功运行后,通过Navicat Premium 12可以看到新创建的表。

《数据库 MySQL》第5章 MySQL编程基础(Java)_数据库_04


图4

我们操作数据库把数据写下代码中很不方便,其实eclipse也可传递参数。直接看代码。

【代码如下】

// DMLargs.java

package dmlargs;

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

public class DMLargs {

public void setdmlargs(int num,String id,String name,int age) {

// 加载数据库驱动 com.mysql.jdbc.Driver
String driver = "com.mysql.cj.jdbc.Driver";
// 获取mysql连接地址
String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
// 数据名称
String username = "root";
// 数据库密码
String password = "******";//root密码
// 获取一个数据的连接
Connection conn = null;
//创建Statement类对象
Statement stmt = null;

// 获取连接的一个状态
try{
//加载数据库驱动
Class.forName(driver);

//getConnection()方法,连接MySQL数据库!
conn=DriverManager.getConnection(url,username,password);
if(!conn.isClosed()) {
System.out.println("数据库连接成功!");
}

//获取语句对象
stmt = conn.createStatement();
if(!stmt.isClosed()) {
System.out.println("获取对象成功!");
}

//要执行的SQL语句
String sql = "INSERT INTO student (num,id,name,age) "
+ "values (" + num + ",'" + id + "','" + name + "'," + age + ")";
stmt.executeUpdate(sql);

}
catch(ClassNotFoundException e){
//数据库驱动类异常处理
System.out.println("数据库驱动加载失败!");
e.printStackTrace();
}
catch(SQLException e1){
//数据库连接失败异常处理
// handle any errors
System.out.println("SQLException: " + e1.getMessage());
System.out.println("SQLState: " + e1.getSQLState());
System.out.println("VendorError: " + e1.getErrorCode());
e1.printStackTrace();
}
catch(Exception e2){
e2.printStackTrace();
}
finally{
try {
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}
catch(SQLException e){
e.printStackTrace();
}
System.out.println("数据库操作成功!");
}
}
}

​//Main.java​

package com;

import dmlargs.DMLargs;

public class Main {

public static void main(String[] args) {

int num = 0,age = 0;

if(args.length != 4) {
System.out.println("Parameter Error! Please Input Again!");
System.exit(-1);
}

try {
num = Integer.parseInt(args[0]);
}
catch (NumberFormatException e) {
System.out.println("Parameter Error! Deptno should be Number Format!");
System.exit(-1);
}
try {
age = Integer.parseInt(args[3]);
}
catch (NumberFormatException e) {
System.out.println("Parameter Error! Deptno should be Number Format!");
System.exit(-1);
}

String id = args[1];
String name = args[2];

//DMLargs操作
//插入数据
DMLargs dmlargs = new DMLargs();
dmlargs.setdmlargs(num,id,name,age);
}
}

我们在main函数进行调用。

《数据库 MySQL》第5章 MySQL编程基础(Java)_java_05


图5 运行结果需要输入参数,具体操作如下所示。

《数据库 MySQL》第5章 MySQL编程基础(Java)_sql_06


图6

《数据库 MySQL》第5章 MySQL编程基础(Java)_java_07


图7

成功操作后,通过Navicat Premium 12可以看到新增的数据。

《数据库 MySQL》第5章 MySQL编程基础(Java)_sql_08


图8

当然啦,删除、修改欧式一样道理,笔者就不在赘述了。

前文使用insert来向表中插入语句很是麻烦,是不是有更简单好用的接口,答案是肯定有的。接下来谈谈PreparedStatement的使用,查看JDK API不难得知,PreparedStatement接口是继承自Statement接口。区别在于PreparedStatement表示预编译得SQL语句的对象,也就是说SQL语句被预编译并存储在PreparedStatement对象中,然后可以使用此对象多次高效地执行改语句。

【代码如下】

// DMLPrepStmt.java

package dmlprepstmt;

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

public class DMLPrepStmt {

public void setdmlprepstmt(int num,String id,String name,int age) {

// 加载数据库驱动 com.mysql.jdbc.Driver
String driver = "com.mysql.cj.jdbc.Driver";
// 获取mysql连接地址
String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
// 数据名称
String username = "root";
// 数据库密码
String password = "******";//root密码
// 获取一个数据的连接
Connection conn = null;
//创建PreparedStatement类对象
PreparedStatement pstmt = null;

// 获取连接的一个状态
try{
//加载数据库驱动
Class.forName(driver);

//getConnection()方法,连接MySQL数据库!
conn=DriverManager.getConnection(url,username,password);
if(!conn.isClosed()) {
System.out.println("数据库连接成功!");
}

//要执行的SQL语句
pstmt = conn.prepareStatement("insert into student values (?, ?, ?, ?)");
pstmt.setInt(1, num);
pstmt.setString(2, id);
pstmt.setString(3, name);
pstmt.setInt(4, age);
pstmt.executeUpdate();


}
catch(ClassNotFoundException e){
//数据库驱动类异常处理
System.out.println("数据库驱动加载失败!");
e.printStackTrace();
}
catch(SQLException e1){
//数据库连接失败异常处理
// handle any errors
System.out.println("SQLException: " + e1.getMessage());
System.out.println("SQLState: " + e1.getSQLState());
System.out.println("VendorError: " + e1.getErrorCode());
e1.printStackTrace();
}
catch(Exception e2){
e2.printStackTrace();
}
finally{
try {
if(pstmt != null) {
pstmt.close();
pstmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}
catch(SQLException e){
e.printStackTrace();
}
System.out.println("数据库操作成功!");
}
}
}

​//Main.java​

package com;

import dmlprepstmt.DMLPrepStmt;

public class Main {

public static void main(String[] args) {

int num = 0,age = 0;

if(args.length != 4) {
System.out.println("Parameter Error! Please Input Again!");
System.exit(-1);
}

try {
num = Integer.parseInt(args[0]);
}
catch (NumberFormatException e) {
System.out.println("Parameter Error! Deptno should be Number Format!");
System.exit(-1);
}
try {
age = Integer.parseInt(args[3]);
}
catch (NumberFormatException e) {
System.out.println("Parameter Error! Deptno should be Number Format!");
System.exit(-1);
}

String id = args[1];
String name = args[2];

//DMLPrepStmt操作
//插入数据
DMLPrepStmt dmlprepstmt = new DMLPrepStmt();
dmlprepstmt.setdmlprepstmt(num, id, name, age);
}
}

我们在main函数进行调用。

《数据库 MySQL》第5章 MySQL编程基础(Java)_sql_09


图9

运行结果需要输入参数,具体操作如下所示。

《数据库 MySQL》第5章 MySQL编程基础(Java)_java_10


图10

《数据库 MySQL》第5章 MySQL编程基础(Java)_sql_11


图11

《数据库 MySQL》第5章 MySQL编程基础(Java)_MySQL_12


图12

5.2.3 DQL操作

DQL就是对数据库进行查询。废话不说,直接看代码。

【代码如下】

package dql;

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

public class DQL {

public void setdql() {

// 加载数据库驱动 com.mysql.jdbc.Driver
String driver = "com.mysql.cj.jdbc.Driver";
// 获取mysql连接地址
String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
// 数据名称
String username = "root";
// 数据库密码
String password = "******";//root密码
// 获取一个数据的连接
Connection conn = null;
//创建Statement类对象
Statement stmt = null;
//ResultSet类,存放结果
ResultSet rs = null;

// 获取连接的一个状态
try{
//加载数据库驱动
Class.forName(driver);

//getConnection()方法,连接MySQL数据库!
conn=DriverManager.getConnection(url,username,password);
if(!conn.isClosed()) {
System.out.println("数据库连接成功!");
}

//获取语句对象
stmt = conn.createStatement();
if(!stmt.isClosed()) {
System.out.println("获取对象成功!");
}
//要执行的SQL语句
String sql = "select * from student" ;

//第四步:ResultSet类,用来存放获取的结果集!
rs = stmt.executeQuery(sql);

System.out.println("执行结果如下所示:");
System.out.println("-------------------------------");
System.out.println("num" + "\t" + "id" + "\t" + "name"+"\t"+"age");

String num;
String id;
String name=null;
String age;
while(rs.next())
{
//获取‘num’这列数据
num=rs.getString("num");
//获取‘id’这列数据
id=rs.getString("id");
//获取‘name’这列数据
name=rs.getString("name");
//获取‘age’这列数据
age=rs.getString("age");

//输出结果
System.out.println(num + "\t"+ id + "\t" + name + "\t" + age);
}

}
catch(ClassNotFoundException e){
//数据库驱动类异常处理
System.out.println("数据库驱动加载失败!");
e.printStackTrace();
}
catch(SQLException e1){
//数据库连接失败异常处理
// handle any errors
System.out.println("SQLException: " + e1.getMessage());
System.out.println("SQLState: " + e1.getSQLState());
System.out.println("VendorError: " + e1.getErrorCode());
e1.printStackTrace();
}
catch(Exception e2){
e2.printStackTrace();
}
finally{
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}
catch(SQLException e){
e.printStackTrace();
}
System.out.println("数据库操作成功!");
}
}
}

我们在main函数进行调用。

《数据库 MySQL》第5章 MySQL编程基础(Java)_sql_13


图13

运行结果如下。

《数据库 MySQL》第5章 MySQL编程基础(Java)_java_14


图14

参考:

​https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html​

​https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html​