Java的JDBC编程(insert、select操作、面试题)

JDBC

      Java Database Connectivity ,Java数据库链接。

      它是一种用于执行SQL语句的Java API,是Java中的数据库连接规范,API由java.sql.*,javax.sql.*包中的一些类和接口组成,为Java开发人员操作数据库提供了一个标准的API,可以对多种关系数据库提供统一的访问。

JDBC优势 

  • Java语言访问数据库操作完全面向抽象接口编程
  • 开发数据库应用不用限制在特定数据库厂商的API
  • 程序的可移植性大大增强

JDBC使用案例 

准备数据库驱动包(mvn repository中下载 ),添加到 项目的依赖中(在项目中创建文件夹lib,把依赖包复制到lib 中),配置该jar包到本项目依赖中:右键点击项目Open Module Settings。 

 1.插入操作

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCInsert {
    public static void main1(String[] args) throws SQLException {
        //JDBC 需要通过以下五个步骤完成开发:
        //1.创建并初始化一个数据源(数据源:数据的来源)
        DataSource dataSource = new MysqlDataSource();//向上转型:父类引用指向子类对象
        //等价于:MysqlDataSource dataSource = new MysqlDataSource);
        //dataSource.setUrl();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java10?characterEncoding=utf8&useSSL=false");//这个方法是子类特有的,向下转型,把父类引用转回子类引用
        //URL:唯一资源定位符 描述网络上的某个资源所在的位置
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("root");
        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3.构建SQL语句
        String sql = "insert into student value(1,'小马')";
        PreparedStatement statement = connection.prepareStatement(sql);
        //使用PreparedStatement提前预编译一下SQL
        //4.执行SQL语句
        int ret = statement.executeUpdate();
        System.out.println("ret = "+ret);
        //5.释放必要的资源
        statement.close();
        connection.close();
    }

优化后:

 //用户动态输入数据
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        //JDBC 需要通过以下五个步骤完成开发:
        //1.创建并初始化一个数据源(数据源:数据的来源)
        DataSource dataSource = new MysqlDataSource();//向上转型:父类引用指向子类对象
        //等价于:MysqlDataSource dataSource = new MysqlDataSource);
        //dataSource.setUrl();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java10?characterEncoding=utf8&useSSL=false");//这个方法是子类特有的,向下转型,把父类引用转回子类引用
        //URL:唯一资源定位符 描述网络上的某个资源所在的位置
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("root");
        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3.构建SQL语句 从控制台读取用户的输入内容
        System.out.println("请输入学生姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入学生学号:");
        int id = scanner.nextInt();
        //4.构建SQL语句
       // String sql = "insert into student value("+id+",'"+name+"')";
        String sql = "insert into student value(?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        //使用PreparedStatement提前预编译一下SQL
        //6.执行SQL语句
        int ret = statement.executeUpdate();
        System.out.println("ret = "+ret);
        //6.释放必要的资源
        statement.close();
        connection.close();
    }

2.查询操作

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCSelect {
    public static void main(String[] args) throws SQLException {
        //1.创建并初始化一个数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java10?characterEncoding=utf8&useSSL=false");//这个方法是子类特有的,向下转型,把父类引用转回子类引用
        //URL:唯一资源定位符 描述网络上的某个资源所在的位置
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("root");
        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3.构建SQL语句
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);
        //4.执行SQL语句
        ResultSet resultSet = statement.executeQuery();
        //遍历结果集合
        while(resultSet.next()){
            //把resultSet想象成一个表格,同时表格里有个光标,初始情况下光标指向表最上层
            //每次调用next,光标往下走一行
            //当光标指向某一行的时候,就可以通过getxxx来获取当前行的数据
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("id="+id+",name="+name);
        }
    }
}

JDBC使用步骤:

1.创建并初始化一个数据源(描述数据库服务器所在位置)

2.和数据库服务器建立连接

3.构建SQL语句

4.执行SQL 

5.释放资源(先释放后创建的)

 常用:DataSource ——> Connection ——>  PreparedStatement ——> ResultSet

面试题:

数据库的两种连接方式及区别:

法一:通过DriverManager(驱动管理类)的静态方法获取

通过反射方式加载驱动包中的类,进一步进行后续操作(代码可读性差,容易产生运行时异常)

法二:通过DataSource(数据源)对象获取

实际应用中会使用DataSource(数据源)对象

区别:

1.DriverManager类来获取Connection连接,无法重复利用,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。

2.DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收。

Statement和PreparedStatement的区别:

(Statement对象只要是将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象:Statement   PreparedStatement  CollableStatement)

Statement:用于执行不带参数的简单SQL语句

PreparedStatement:用于执行带或不带参数的SQL语句,SQL语句会预编译在数据库系统,执行速度快于Statement

 PreparedStatement的优势:提前预编译,效率更高,防止sql注入,更安全

注:sql注入:拼接字符串时,值可能包含其他sql 语句。

String sql = "insert into student value("+id+",'"+name+drop datanase"')";

两种执行SQL的方法:

 executeQuery()方法执行后返回单个结果集 ,通常用于select语句

executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句

ResultSet对象:

        称为结果集,代表符合SQL语句条件的所有行,通过getXXX方法对行中数据进行访问。通过resultSet.next()方法获得某一条记录,使用while获得所有行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值