JDBC概述及编程步骤详解

一、JDBC概述

Java Database Connectivity:数据库连接,是一种可执行SQL语句的API。

JDBC是面向接口编程的典型应用:关系型数据库系统类型多样(诸如MySQL,DB2,Oracle),为了实现统一简化开发,Sun公司制定这套标准的API(接口),不同的厂商提供实现,使得依据JDBC开发的数据库程序可以跨平台执行,使用时只需要不同数据库的驱动程序即可。

在这里插入图片描述

大部分的数据库系统都有相应的JDBC驱动程序,当连接某个特定的数据库时,必须有相应的数据库驱动程序。

二、JDBC编程步骤(以MySQL为例)

1、导入jar包

IDEA中,导入相应的JDBC驱动jar包到项目中,并通过add library添加到工作空间。

2、加载数据库驱动

加载数据库驱动,通常使用Class类的forName(驱动类全类名)加载驱动,例如MySQL中加载驱动的方法为:

Class.forName("com.mysql.jdbc.Driver");

需要注意的是,最新的JDBC驱动已经可以通过SPI自动注册驱动类,这种情况下jar中的META-INF/services目录下会包含java.sql.Driver的文件,已经指定了JDBC驱动类,所以该情况下,这步其实可以省略。

在这里插入图片描述

3、通过DriverManager获得Connection对象

利用DriverManager类的静态方法public static Connection getConnection(String url,String user,String password)获取连接对象Connection。

传递参数:数据库URL,用户名user,密码password。

  • 数据库URL的书写方式:jdbc:mysql://服务器名或IP地址:端口号/数据库名[?参数名=参数值]

    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb2","root","123456");
    
  • 如果服务器为本地,在MySQL中可以简写为:

    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb2","123456");
    

另外getConnection还有个重载方法:public static Connection getConnection(String url,java.util.Properties info),将user和password存储到Properties对象中,传入方法即可。

Properties prop = new Properties();
prop.setProperty("user","root");
prop.setProperty("password","123456")

DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb2",prop);

3、定义SQL语句

String sql = "update orders set price = 500 where id = 1";//普通的sql语句

//如果需要执行某些相似的sql语句多次,只有某个地方有改动,可以使用带占位符的sql语句
String sql = "select * from user where username = ? and password = ?";//带占位符的sql语句

4、利用Connection创建Statement对象

//创建最基本的Statement对象
Statement statement = conn.createStatement();

//创建一个预编译sql语句的PreparedStatement对象,后者是前者的子接口。使用时需要将sql语句占位符部分进行填充。
PreparedStatement prs = conn.prepareStatement(sql);

Statement与PreparedStatement:

  • 在执行多次相似的sql语句时,PreparedStatement预编译SQL语句性能更好。

  • PreparedStatement无需凭借SQL语句,编程更加简单(ps:确实简单)。

  • PreparedStatement可以防止SQL注入。

    //SQL注入的例子:
    String sql = "select * from user where username = '"+username+"'and password = '"+password+"'";
    resultSet = statement.executeQuery(sql);
    return resultSet.next();
    

    当我用Statement对象执行拼接完成之后的SQL语句,目的是为了判断是否传入正确的用户名和密码。这时,如果随便输入不存在的用户名dede,密码输入:' or true or ',这时SQL注入之后就会变成下面这个鬼样子:

    select * from user where username = 'dede'and password = ''or true or '';
    

    相当于直接输入了true,非常不合理,而PreparedStatement可以避免SQL注入:

    //PreparedStatement防止SQL注入
    String sql = "select * from user where username = ? and password = ?";
    preparedStatement.setString(1,username);
    preparedStatement.setString(2,password);
    resultSet = preparedStatement.executeQuery();
    
    

5、利用Statement执行SQL语句

无论是Statement还是它的子接口对象,都拥有执行SQL语句的方法,下面是比较重要的几个:

  • boolean excute():可以执行任何的SQL语句,但是比较麻烦,通常不用。(这个方法在子接口里是没有的嗷),如果部清楚SQL语句的类型,可以使用该方法。
  • int executeUpdate():用于执行DML和DDL语句,返回结果是受影响的行数。
//定义sql语句
String sql = "update orders set price = 500 where id = 1";
//获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//执行sql
int count = stmt.executeUpdate(sql);

  • ResultSet executeQuery():只能执行查询语句,返回结果是一个ResultSet结果集。
PreparedStatement preparedStatement = null;
//定义sql语句
String sql = "select * from user where username = ? and password = ?";
//获取PreparedStatement对象
preparedStatement = conn.prepareStatement(sql);
//给对应的占位符赋值,如果不清楚参数类型可以使用setObject()传入参数
preparedStatement.setString(1,password);
//执行查询语句,获取结果集
ResultSet resultSet = preparedStatement.executeQuery();

6、操作ResultSet对象

明确一点,ResultSet对象是通过excuteQuery执行查询语句的结果。原理类似于迭代器,通过指针的移动来获取值。

典型的方法:

  • next():指针一开始指向第一行之前,指针向下移动,返回一个boolean值,代表后面是否有记录,有就返回true,没有就返回false。所以判断是否存在记录可以直接用ResultSet.next();判断。

  • getXxx():用以获取指定行,特定列的值。有许多的重载方法:包括传递指定列数(从1开始,如getInt(1)代表获取该行第一列的INT值),指定参数(传递列名,如getInt("id"),获取改行id字段的值)。

//打印所有记录
while(resultSet.next()) {
    //获取数据
    int id = resultSet.getInt(1);
    String product = resultSet.getString("product");
    int price = resultSet.getInt("price");

    System.out.println(id + "--" + product + "--" + price);
}

7、回收数据库资源

回收数据库资源有两种方式:

Connection、Statement、ResultSet都继承了AutoCloseable接口,都可以使用Java7的try-with-resources自动关闭资源的try语句来关闭:

    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        try (
                Connection conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/mydb2","123456");
                Statement stmt = conn.createStatement())
        {
            String sql = "update orders set price = 500 where id = 1";
            int count = stmt.executeUpdate(sql);
            System.out.println(count);
        }
    }

还有就是传统的try……catch语句:

    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/mydb2","123456");
            stmt = conn.createStatement();
            String sql = "update orders set price = 500 where id = 1";
            int count = stmt.executeUpdate(sql);
            System.out.println(count);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //避免空指针异常
            if(stmt!=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

参考资料:《疯狂Java讲义》

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


连接数据库的方式:第一种方式:ODBC:开放数据库连接是微软公司开放服务结构中有关数据库的一个组成部分,是数据库访问接口标准。ODBC是基于C语言实现的。提供了语言和数据库进行交互的一致性的接口,便于语言和数据库通信以及语言对数据库的各种操作。第二种方式:JDBC(本章重点)在Java中,
JDBCRequest 使用VariableNamesmysql:数据库连接池对象variousname:设置的变量名称 如何使用该变量a_#、b_#、c_#、d_#:代表行数a_1:第1行、第1列b_2:第2行、第2列
 1.JDBCDBC(JavaDataBaseConnectivity):Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。JDBC是数据库与Java代码的桥梁。JDBC中定义了操作数据库的各种接口和类型:增删改基本操作:(1)获取连接:Connectionconnection=
1.需要jar包的支持:java.sqljavax.sqlmysql-conneter-java...连接驱动(必须要导入)<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></depend
1.简介Activiti是一个业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。在Java工作流引擎中可谓是主流,我们的项目也是使用的这个框架进行流程相关的开发。与流程息息相关的就是我们的流程定义BPMN文件,包含有一系列
1.JDBC体系系统一组规范:接口JDBC接口(API)包括两个层次:面向应用的API:JavaAPI,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)面向数据库的API:JavaDriverAPI,供开发商开发数据库驱动程序JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接
原文链接JDBC一般指Java数据库连接(JavaDatabaseConnectivity)api应用程序接口(API):可以调用或者使用类/接口/方法等去完成某个目标。API制定的类/方法可以做什么。API由开发人员调用。spi服务提供接口(SPI):需要继承或实现某些类/接口/方法等去完成某个目标。SPI告诉你
spring.shardingsphere.datasource.names=#省略数据源配置,请参考用法#标准分表配置spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes=#描述数据源名称和实际表,分隔符为点,多个数据节点用逗号分隔,支持内联表达式。Absent表示仅对数据库进行分片
1问题Cannotloaddriverclass:com.mysql.cj.jdbc.Driver 2解决方案2.1已解决2.1.1首先,去查看项目中MySQL的版本如果找不到,说明可能还没有jdbc驱动,需要配置或者引入       (1)如果是直接引用的jar包,就去lib文件夹中查看,后缀是版
JDBC一、JDBC概述什么是JDBC?JDBC是使用Java语言操作关系型数据库的一套API。这套API是交由不同的数据库厂商实现的。我们利用JDBC编写操作数据库的代码,真正执行的是各个数据库的实现类(驱动)。全称:(JavaDataBaseConnectivity)Java数据库连接。JDBC的好处面向接口编
说明:/*需要引入依赖<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency>*/代码:objec
1.概要在“配置元件”中添加“JDBCConnectionConfiguration”。配置如下图: 2.重点:配置人大金仓数据库连接下面着重介绍人大金仓数据库连接配置:DatabaseURL输入:jdbc:kingbase8://192.132.180.101:54321/hj_yc   (备注:应输入 jdbc:kingbase8://IP:
JDBC概念:JavaDataBaseconnectivityJava数据库连接,Java语言操作数据库JDBc本质∶其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
Mybatis核心配置文件习惯上命名mybatis-config.xml,整合Spring之后,整个配置文件可以省略核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息标签顺序顺序出错会报错propertiessettingstypeAliasestypeHandlersobjectFactoryobjectWrapperFa
JDBC1.概念:JavaDataBaseConnectivityJava数据库连接,Java语言操作数据库JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
  1.出现这个问题的原因 :在安装mysql的时候时区设置的不正确,mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用+8:00格式使用的数据库是MySQL,没有指定MySQL驱动版本的情况下它自动依赖的驱动是8.0.12很高的版本,这是由于数据库和系统时区差异所造成的,在jdbc连
一、环境准备1.数据库创建2个库2个表:xdclass_shop_order_0product_order_0product_order_1ad_configproduct_order_item_0product_order_item_1xdclass_shop_order_1product_order_0product_order_1ad_configproduct_order_item_0product_order_item_1数据
编写配置文件(application.yml)spring:datasource:username:rootpassword:123456url:jdbc:mysql://localhost:3306/mybatis?useUnicode&characterEncoding=utf-8driver-class-name:com.mysql.cj.jdbc.Driver测试连接@SpringBootTestclassSprin
结构图pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http:/
MySql链接url参数详解 jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]... 常用的几个较为重要的参数: 参数名称参数说明缺省值最低版本要求 user 数据库用户名(用于连接数据库) 所有版本passWord用户密码(用于连接