JDBC编程:2(数据库的基本操作)

数据库的基本操作

查询数据

在开始前先简单地介绍一下什么是静态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();
        }
    }
}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值