数据库的基本操作
查询数据
在开始前先简单地介绍一下什么是静态SQL和动态SQL:
静态SQL,在编译阶段就可以确定数据库要做什么事情。在某种高级语言中,如果嵌入了SQL语句,而这个SQL语句的主体结构已经明确,例如在Java的一段代码中有一个待执行的SQL“select * from product where product_price>5”,在Java编译阶段,就可以将这段SQL交给数据库管理系统去分析,数据库软件可以对这段SQL进行语法解析,生成数据库方面的可执行代码,这样的SQL称为静态SQL。
动态SQL,而如果嵌入的SQL没有明确给出,如在Java中定义了一个字符串类型的变量sql:String sql;,然后采用PreparedStatement对象的execute方法去执行这个sql,该sql的值可能等于从文本框中读取的一个SQL或者从键盘输入的SQL,但具体是什么,在编译时无法确定,只有等到程序运行起来,在执行的过程中才能确定,这种SQL叫做动态SQL。
例如每一种数据库软件都有能够执行SQL语句的界面,那个界面接收的SQL就是动态SQL,因为数据库厂商在做这个界面时,并不知道用户会输入哪些SQL,只有在该界面执行后,接收了用户的实际输入,才知道SQL是什么。
另外还要注意一点,在SQL中如果某些参数没有确定,如"select * from product where product_price>? and product_price<?",这种语句是静态SQL,不是动态SQL,虽然个别参数的值不知道,但整个SQL的结构已经确定,数据库是可以将它编译的,在执行阶段只需将个别参数的值补充进来即可。
转载于:https://www.cnblogs.com/FengzZ/p/4890045.html
简单地说就是:
静态sql:语句类型在编程时候必须是确定好的,可以还有某些参数还未确定;
动态sql:语句类型可以在运行期间指定,可以在运行过程中键盘或其他途径输入SQL语句。
使用Statement实例执行静态SELECT语句查询记录
例:
package mydatabase;
import java.sql.*;
public class Test2 {
private static final String url = "jdbc:mysql://localhost:3306/study";
private static final String user = "root";
private static final String password="xxx";
static {
try{
//注册JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
}catch (ClassNotFoundException e){
e.printStackTrace(); //输出捕获到的异常信息
}
}
public static void main(String[]args){
try{
Connection connection = DriverManager.getConnection(url,user,password);//获得数据库连接
Statement statement = connection.createStatement(); //createStatement()方法创建并返回一个Statement实例
String sql = "select * from product"; //定义静态SELECT语句
ResultSet resultSet = statement.executeQuery(sql); //执行静态SELECT语句
while(resultSet.next()){ //遍历结果集,通过next()方法可以判断是否还存在符合条件的记录
String name = resultSet.getString(1); //通过列索引获得指定列的值
int price = resultSet.getInt(3); //通过列索引获得指定列的值
System.out.println(name+" "+price); //打印表中信息
}
statement.close(); //立即释放Statement实例占用的数据库和JDBC资源
connection.close(); //立即释放Connection实例占用的数据库和JDBC资源,即关闭数据库连接
}catch (SQLException e){
e.printStackTrace();
}
}
}
结果:
通过PreparedStatement实例执行动态SELECT语句查询记录
例:
package mydatabase;
import java.sql.*;
public class Test4 {
private static final String url = "jdbc:mysql://localhost:3306/study";
private static final String user = "root";
private static final String password = "xxx";
static {
try{
Class.forName("com.mysql.cj.jdbc.Driver");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
public static void main(String[]args){
try{
Connection connection = DriverManager.getConnection(url,user,password);//获得数据库连接
Statement statement = connection.createStatement(); //createStatement()方法创建并返回一个Statement实例
String sql = "select *from product"; //定义静态SELECT语句
PreparedStatement preparedStatement = connection.prepareStatement(sql); //预处理动态INSERT语句
ResultSet resultSet = preparedStatement.executeQuery(); //执行动态INSERT语句
ResultSetMetaData metaData = resultSet.getMetaData(); //获得ResultSetMetaData类的实例
System.out.print(metaData.getColumnName(1)+" "); //通过列索引获得指定列的值
System.out.print(metaData.getColumnName(2)+" ");
System.out.println(metaData.getColumnName(3)); //通过列索引获得指定列的值
while(resultSet.next()){
String name = resultSet.getString(1);
String type = resultSet.getString(2);
int price = resultSet.getInt(3);
System.out.println(name+" "+type+" "+price);
}
resultSet.close();
preparedStatement.close();
connection.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
结果:
插入数据
通过Statement实例执行静态INSERT语句添加单条记录
例:
package mydatabase;
import java.sql.*;
public class Test5 {
private static final String url = "jdbc:mysql://localhost:3306/study";
private static final String user = "root";
private static final String password = "xxx";
static {
try{
Class.forName("com.mysql.cj.jdbc.Driver");
}catch (ClassNotFoundException e){
e.printStackTrace(); //输出捕获的异常信息
}
}
public static void main(String[]args){
try{
Connection connection = DriverManager.getConnection(url,user,password);
Statement statement = connection.createStatement();
String sql = "insert into product (product_name,product_type,product_price,regist_date) " +
"values('内存卡','电子用品',100,'2020-6-3'),('256G硬盘','电子用品',500,'2020-6-3')";
statement.executeUpdate(sql); //执行INSERT语句
statement.close();
connection.close();
System.out.println("插入数据成功!");
}catch (SQLException e){
e.printStackTrace();
}
}
}
结果:
通过PreparedStatement实例执行动态INSERT语句批量添加记录
例:
package mydatabase;
import java.sql.*;
public class Test6 {
private static final String url = "jdbc:mysql://localhost:3306/study";
private static final String user = "root";
private static final String password = "xxx";
static {
try{
Class.forName("com.mysql.cj.jdbc.Driver");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
public static void main(String[]args){
try{
Connection connection = DriverManager.getConnection(url,user,password);
String [][] records = {{"雨伞","生活用品","20","2020-6-3"},{"风扇","生活用品","150","2020-6-3"}};
String sql = "insert into product(product_name,product_type,product_price,regist_date) values(?,?,?,?)";//定义动态INSERT语句
PreparedStatement preparedStatement = connection.prepareStatement(sql); //预处理动态INSERT语句
preparedStatement.clearBatch(); //清空Batch
for (int i=0;i<records.length;i++){
preparedStatement.setString(1,records[i][0]); //为参数赋值
preparedStatement.setString(2,records[i][1]); //为参数赋值
preparedStatement.setInt(3, Integer.valueOf(records[i][2]));//为参数赋值
preparedStatement.setDate(4, Date.valueOf(records[i][3]));//为参数赋值
preparedStatement.addBatch(); //将INSERT语句添加到Batch中
}
preparedStatement.executeBatch(); //批量执行Batch中的INSERT语句
preparedStatement.close();
connection.close();
System.out.println("插入数据成功!");
}catch (SQLException e){
e.printStackTrace();
}
}
}
结果: