学习目标:插入记录到数据库表,修改数据库表指定记录,删除数据库表记录,查询数据库记录。
插入记录到数据库表
数据库记录的插入操作是指在数据库表中插入新的记录,插入操作是通过SQL的INSERT语句完成的,Statement 接口的executeUpdate()方法执行SQL更新语句,该方法返回更新的记录数,返回0表示没有更新任何记录。
案例4:编写SQL语句向shoper表中增加一条新的记录,并通过Statement 接口的executeUpdate()方法执行该SQL语句。
在demo包下新建SqlDemoTest3类。代码如下:
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlDemoTest3 {
// 定义JDBC加载路径
static String jdbc = "com.mysql.cj.jdbc.Driver";
// 定义MySQL数据库的连接地址
static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
// 定义MySQL数据库的用户名
static String username = "root";
// 定义MySQL数据库的用户名登录密码
static String password = "~123456q";
public static void main(String[] args) {
Connection conn = null;
Statement statement = null;
try {
// 加载JDBC驱动
Class.forName(jdbc);
// 连接数据库
conn = DriverManager.getConnection(mysqlurl, username, password);
if (null != conn) {
System.out.println(conn);
String name = "打印机专卖店";
String brief = "打印机专业销售";
// 向shoper表中插入一条记录
String sql = "insert into shoper(id,userId,name,brief,log,shopMoney,status,createDate)"
+ "values('0001','00a','" + name + "','" + brief + "','',0.0,0,'2020-01-09')";
// 实例化Statement对象
statement = conn.createStatement();
// 执行SQL INSERT语句
int row = statement.executeUpdate(sql);
if( row == 1 )
{
System.out.println("shoper表添加记录成功");
}
else
{
System.out.println("shoper表添加记录失败");
}
statement.close();
conn.close();
} else {
System.out.println("数据库连接失败");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序使用SQL的INSERT语句在shoper表中插入一条记录,Statement接口的executeUpdate()方法执行SQL的插入语句,如果记录插入成功,会返回插入的记录数,返回0表示没有记录被插入
更新数据库表记录
数据库记录的更新操作是指在数据库表中更新原有记录,更新操作是通过SQL的UPDATE语句完成的,Statement 接口的executeUpdate()方法执行SQL更新语句,该方法返回更新的记录数,返回0表示没有更新任何记录。
案例5:编写SQL语句更新shoper表中的一条记录,并通过Statement 接口的executeUpdate()方法执行该SQL更新语句。
在demo包下新建SqlDemoTest4类。代码如下:
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlDemoTest4 {
// 定义JDBC加载路径
static String jdbc = "com.mysql.cj.jdbc.Driver";
// 定义MySQL数据库的连接地址
static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
// 定义MySQL数据库的用户名
static String username = "root";
// 定义MySQL数据库的用户名登录密码
static String password = "~123456q";
public static void main(String[] args) {
Connection conn = null;
Statement statement = null;
try {
// 加载JDBC驱动
Class.forName(jdbc);
// 连接数据库
conn = DriverManager.getConnection(mysqlurl, username, password);
if (null != conn) {
System.out.println(conn);
String name = "联盟打印机";
// 修改shoper表中的一条记录
String sql = "update shoper set name='" + name + "' where id='0001'";
// 实例化Statement对象
statement = conn.createStatement();
// 执行SQL INSERT语句
int row = statement.executeUpdate(sql);
if( row == 1 )
{
System.out.println("shoper表修改记录成功");
}
else
{
System.out.println("shoper表修改记录失败");
}
statement.close();
conn.close();
} else {
System.out.println("数据库连接失败");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序使用SQL的UPDATE语句修改shoper表的一条记录。修改成功后,可以运行SqlDemoTest2程序,查看修改结果。
删除数据库表记录
数据库记录的删除操作是指在数据库表中删除符合条件的记录,删除操作是通过SQL的DELETE语句完成的,Statement 接口的executeUpdate()方法执行SQL删除语句,该方法返回删除的记录数,返回0表示没有删除任何记录。
案例6:编写SQL语句删除shoper表中的一条记录,并通过Statement 接口的executeUpdate()方法执行该SQL删除语句。
在demo包下新建SqlDemoTest5类。代码如下:
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlDemoTest5 {
// 定义JDBC加载路径
static String jdbc = "com.mysql.cj.jdbc.Driver";
// 定义MySQL数据库的连接地址
static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
// 定义MySQL数据库的用户名
static String username = "root";
// 定义MySQL数据库的用户名登录密码
static String password = "~123456q";
public static void main(String[] args) {
Connection conn = null;
Statement statement = null;
try {
// 加载JDBC驱动
Class.forName(jdbc);
// 连接数据库
conn = DriverManager.getConnection(mysqlurl, username, password);
if (null != conn) {
System.out.println(conn);
String name = "联盟打印机";
// 删除shoper表中id为0001的记录
String sql = "delete from shoper where id='0001'";
// 实例化Statement对象
statement = conn.createStatement();
// 执行SQL INSERT语句
int row = statement.executeUpdate(sql);
if( row == 1 )
{
System.out.println("shoper表删除记录成功");
}
else
{
System.out.println("shoper表删除记录失败");
}
statement.close();
conn.close();
} else {
System.out.println("数据库连接失败");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序使用SQL的DELETE语句删除shoper表的id为0001的记录。删除成功后,可以运行SqlDemoTest2程序,查看修改结果。
SQL语句预处理操作
在前面的数据库操作中,对SQL语句并没有做预处理工作,而是直接把SQL语句提交给了数据库引擎(执行数据库的核心操作),数据库引擎负责把SQL语句转换为可执行的一系列数据库操作命令,然后执行命令,完成相关的数据库操作。如果大量并发的线程同时提交SQL语句给数据库引擎,这显然让数据库引擎吃不消,就会影响数据库执行的速度,甚至会导致数据库崩溃。
JDBC的PreparedStatement接口可以对SQL语句进行预处理(对SQL语句进行预编译),SQL语句的预处理操作就是把数据库引擎解释SQL语句的任务放在客户端执行,提交给数据库引擎的是已经生成的数据库操作命令,这样就提高了数据库的工作效率。
PreparedStatement接口继承了Statement接口,在Statement接口基础上增加了新的方法,新增加的常用方法说明如下:
● boolean ex1ecute()
该方法执行此PreparedStatement对象中的SQL语句,该对象可以是任何类型的SQL语句。
● ResultSet exe1cuteQuery()
该方法执行此PreparedStatement对象中的SQL查询并返回查询生成的ResultSet对象。
● int exe1cuteUpdate()
该方法执行此PreparedStatement对象中的SQL语句,该对象必须是SQL数据操作语言(DML)语句,如INSERT、UPDATE或DELETE;或者是不返回任何内容的SQL语句,如DDL语句。
● void setDate(int parameterIndex, Date x)
该方法将指定的日期对象写入数据库日期字段中。参数parameterIndex表示字段所在记录的列号。参数x为java.sql.Date类型。
● void setInt(int parameterIndex, int x)
该方法将指定的int类型的值写入数据库int类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为int类型。
● void setDouble(int parameterIndex, double x)
该方法将指定的double类型的值写入数据库double类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为double类型。
● void setString(int parameterIndex, String x)
该方法将指定的String类型的值写入数据库字符串类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为String类型。
● void setFloat(int parameterIndex, float x)
该方法将指定的float类型的值写入数据库float类型的字段中。参数parameterIndex表示字段所在记录的列号。参数x为float类型。
● void addBatch()
该方法将SQL更新语句的一组参数添加到此PreparedStatement对象,对SQL更新语句涉及的表中记录进行批量更新。
Connection接口的prepareStatement ()方法可以返回PreparedStatement对象,具体说明如下:
● PreparedStatement prepareStatement(String sql)
该方法创建PreparedStatement对象,用于将编译过的SQL语句发送到数据库。
SQL语句可以预编译并存储在PreparedStatement对象中。然后可以使用此对象多次有效地执行此语句。
案例7:查询shoper表的所有记录,并将记录内容输出到控制台。使用PreparedStatement对象执行SQL语句。
在demo包下新建SqlDemoTest6类。代码如下:
package demo;
import java.math.BigDecimal;
import java.sql.*;
public class SqlDemoTest6 {
// 定义JDBC加载路径
static String jdbc = "com.mysql.cj.jdbc.Driver";
// 定义MySQL数据库的连接地址
static String mysqlurl = "jdbc:mysql://localhost:3306/shop?serverTimezone=GMT%2B8";
// 定义MySQL数据库的用户名
static String username = "root";
// 定义MySQL数据库的用户名登录密码
static String password = "~123456q";
public static void main(String[] args) {
Connection conn = null;
PreparedStatement prepareStatement = null;
try {
// 加载JDBC驱动
Class.forName(jdbc);
// 连接数据库
conn = DriverManager.getConnection(mysqlurl, username, password);
if (null != conn) {
System.out.println(conn);
// 获取表记录数的SQL语句
String sql = "select * from shoper";
// 实例化Statement对象
prepareStatement = conn.prepareStatement(sql);
// 执行SQL查询语句
ResultSet resultset = prepareStatement.executeQuery(sql);
if (null != resultset) {
while( resultset.next() )
{
// 获取id字段内容
String id = resultset.getString("id");
// 获取userId字段内容
String userId = resultset.getString("userId");
// 获取name字段内容
String name = resultset.getString("name");
// 获取brief字段内容
String brief = resultset.getString("brief");
// 获取log字段内容
String log = resultset.getString("log");
// 获取shopMoney字段内容
BigDecimal shopMoney = resultset.getBigDecimal("shopMoney");
// 获取status字段内容
int status = resultset.getInt("status");
// 获取createDate字段内容
Date createDate = resultset.getDate("createDate");
System.out.printf("-----输出第%d条记录-----\n",resultset.getRow());
System.out.println("id:" + id + ";");
System.out.println("userId:" + userId + ";");
System.out.println("name:" + name + ";");
System.out.println("brief:" + brief + ";");
System.out.println("log:" + log + ";");
System.out.println("shopMoney:" + shopMoney.toString() + ";");
System.out.println("status:" + status + ";");
System.out.println("createDate:" + createDate.toString() + ";");
System.out.println("-------------------------------");
}
resultset.close();
} else {
System.out.println("SQL语句执行失败");
}
prepareStatement.close();
conn.close();
} else {
System.out.println("数据库连接失败");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
SqlDemoTest6程序代码和SqlDemoTest2程序代码基本相同,主要区别是PreparedStatement接口替代了Statement接口,conn对象调用的是prepareStatement()方法,而不是createStatement()方法。