Java高级特性 - JDBC(上)

第1关:JDBC连接数据库
任务描述
本关任务:使用jdbc连接数据库并完成创建数据库和创建表的操作。
相关知识
JDBC API提供以下接口和类:
DriverManager:此类管理数据库驱动程序列表。可在JDBC下识别某个子协议的第一个驱动程序,用于建立数据库连接。
Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。
Connection:此接口具有用于联系数据库的所有方法。 Connection对象表示通信上下文,即与数据库的所有通信仅通过连接对象。
Statement:用于执行静态SQL语句并返回它所生成结果的对象。一些派生接口还可接受参数,如PrepareStatement。
ResultSet:提供检索不同类型字段的方法。(操作对象为Statement执行SQL查询后的结果)
SQLException:此类处理数据库应用程序中发生的任何错误。
使用JDBC的步骤如下:
加载数据库驱动 → 建立数据库连接(Connection) → 创建执行SQL语句的Statement对象 → 处理执行结果(ResultSet) → 释放资源
为了完成本关任务,你需要掌握:1.如何加载数据库驱动;2.如何建立数据库连接;3.如何执行编写的SQL语句;4.释放资源。
加载数据库驱动
驱动加载是为了打开与数据库的通信通道。
在注册驱动前我们需要装载特定厂商的数据库驱动程序,导入mysq-connector-java的jar包,方法是在项目中建立lib目录,在其下放入jar包。
在这里插入图片描述
然后右键jar包 Build Path→Add to Build Path完成jar包导入。将jar包导入项目之后我们就开始注册驱动:
Java加载数据库驱动通常是使用Class类的静态方法forName(),语法格式如下:

Class.forName(String driverManager)

示例:

try {
    Class.forName("com.mysql.jdbc.Driver" );
} catch (ClassNotFoundException e) {
    e.printStackT\frace();
}

如果加载成功,会将加载的驱动类注册给DriverManager;加载失败,会抛出ClassNotFoundException异常。
建立连接
成功加载完数据库驱动后,就可以建立数据库的连接了,使用DriverManager的静态方法getConnection()来实现。如下:

Connection conn = DriverManager.getConnection(url, user, password);

URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接信息。
若不存在数据库,只建立连接,URL的写法为:
在这里插入图片描述
若存在数据库test,URL的写法为:
在这里插入图片描述
其中localhost可以换成IP地址127.0.0.1,3306为MySQL数据库的默认端口号,user和password对应数据库的用户名和密码。
执行编写的SQL语句
连接建立完毕后,就可以使用Connection接口的createStatement()方法来获取Statement对象;并通过executeUpdate()方法来执行SQL语句。
创建statement对象

try {
  Statement statement = conn.createStatement();
} catch (SQLException e) {
  e.printStackT\frace();
}

创建数据库

try {
  String sql1="drop database if exists test";
  String sql2="create database test";
  statement.executeUpdate(sql1);//执行sql语句
  statement.executeUpdate(sql2);
} catch (SQLException e) {
  e.printStackT\frace();
}

创建表

try {
  statement.executeUpdate("use test");//选择在哪个数据库中操作
  String sql = "create table table1(" +
                  "column1 int not null, " +
                  "column2 varchar(255)" +
                  ")";
  statement.executeUpdate(sql);
} catch (SQLException e) {
  e.printStackT\frace();
}

释放资源
Jdbc程序运行完后,切记要释放程序在运行过程中创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。
特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。
Connection的使用原则是尽量晚创建,尽量早的释放。
为确保资源释放代码能运行,资源释放代码一定要放在finally语句中。

finally {
    try {
        if(statement!=null)
            statement.close();
        if(conn!=null)
            conn.close();
    } catch (SQLException e) {
        e.printStackT\frace();
    }
}

编程要求
在右侧编辑器补充代码,完成下列相应任务:
加载数据库驱动;【平台数据库连接的用户(user)为root,密码(password)为123123】
创建数据库mysql_db;
创建表student。
student表结构为:
| 字段名 | 类型 | 备注 | 约束 |
| :————: | :————: | :————: |
| id | int | 学生id | 非空 |
| name | varchar(20) | 学生姓名 | 无 |
| sex | varchar(4) | 学生性别 | 无 |
| age | int | 学生年龄 | 无 |
测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
id INT(11)
name VARCHAR(20)
sex VARCHAR(4)
age INT(11)
开始你的任务吧,祝你成功!
参考代码:

package jdbc;
import java.sql.*;
public class jdbcConn {
    public static void getConn() {
        /**********    Begin   **********/
        try {
			//1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        /**********    End   **********/
        /**********    Begin   **********/
        Connection conn = null;
        Statement statement = null;
        //2.建立连接并创建数据库和表
        String url = "jdbc:mysql://127.0.0.1:3306/";
		String user = "root";
		String password = "123123";
		try{
			conn = DriverManager.getConnection(url,user,password);
			statement = conn.createStatement();
  			statement.executeUpdate("drop database if exists test");//执行sql语句
  			statement.executeUpdate("create database mysql_db");
			statement.executeUpdate("use mysql_db");
			String sql = "create table student("+
						 "id int not null,"+
						 "name varchar(20),"+
						 "sex varchar(4),"+
						 "age int)";
			statement.executeUpdate(sql);
		}catch (SQLException e){
			e.printStackTrace();
		}
        /**********    End   **********/
        finally {
            try {
                if(statement!=null)
                    statement.close();
                if(conn!=null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}

第2关:JDBC对表中数据的操作
任务描述
本关任务:使用JDBC完成数据插入和查询。
相关知识
为了完成本关任务,你需要掌握:1.在连接时如何指定数据库;2.向指定表中插入数据;3.遍历表中数据。
指定数据库连接
当我们已经有数据库时,可以直接在连接时指定数据库,如下指定与test_db数据库建立连接:

String url = "jdbc:mysql://localhost:3306/test_db";
Connection conn = DriverManager.getConnection (url,"root","123123" );

当在连接时指定数据库后,我们就不用编写SQL语句进行选择数据库了。
向指定表中插入数据
建立连接之后,编写向表中插入数据的sql语句,使用Statement对象的executeUpdate()方法来执行该sql语句就可向表中修改数据(该方法适用于insert、update、delete的sql语句),当sql语句为查询语句时,则使用executeQuery()方法

try {
    Statement statement = conn.createStatement();
    statement.executeUpdate("insert into table1(column1,column2) values(101,'xxx')");
} catch (SQLException e) {
    e.printStackT\frace();
}

PreparedStatement
上述直接使用Statement向表中插入数据,操作中存在SQL注入危险,脱离上述表,如下例:

String id = "5";
String sql = "delete from tablename where id=" +  id;
Statement st = conn.createStatement();
st.executeQuery(sql);//查询到表中将无数据
//如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录

为预防这种情况的SQL注入,PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态的把参数传给PreprareStatement,即使参数里有敏感字符如or '1=1’数据库也会作为参数的一个字段属性值来处理而不会作为一个SQL指令)
PreparedStatement使用如下:

PreparedStatement statement = conn.prepareStatement("insert into table1(column1,column2) values(?,?)");//使用占位符来先占个位置
statement.setInt(1,101);//占位符顺序从1开始,根据数据库中字段相应的类型存入数据
statement.setString(2, "XXX");//也可以使用setObject
statement.executeUpdate();//每执行一个sql语句就需要执行该方法

查询表中数据
Jdbc程序中的ResultSet用于代表Sql语句的执行结果。
Resultset封装执行结果时,采用的类似于表格的方式,ResultSet对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next()方法,可以使游标指向具体的数据行,然后调用方法获取该行的数据。

//编写查询sql语句
PreparedStatement statement = conn.prepareStatement("select * from table1");
ResultSet resultSet = statement.executeQuery();//将执行结果给ResultSet
while (resultSet.next()) {//循环判断表中是否还有数据
    int id = resultSet.getInt(1);//通过列的索引查询
    String name = resultSet.getString("column2");//通过列名查询
}

编程要求
在右侧编辑器补充代码,向上一章节中已创建好的数据库mysql_db中的表student中插入数据,并将插入的数据进行输出:
| id | name | sex | age |
| :————: | :————: | :————: |
| 1 | 张三 | 男 | 19 |
| 2 | 李四 | 女 | 18 |
| 3 | 王五 | 男 | 20 |
提示:已为你封装好student类,可在右侧文件夹中查看,此类可直接使用。
测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
1 张三 男 19
2 李四 女 18
3 王五 男 20
开始你的任务吧,祝你成功!
参考代码:

package jdbc;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class jdbcInsert {
    public static void insert(){
		/**********   Begin  **********/
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver" );

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
		/**********   End   **********/
		Connection conn = null;
		PreparedStatement statement = null;
		/**********   Begin  **********/
        //连接并插入数据
		try{
		conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql_db","root","123123");
        PreparedStatement s = conn.prepareStatement("insert into student values(?,?,?,?)");
        s.setInt(1,1);s.setString(2,"张三");s.setString(3,"男");s.setInt(4,19);
        s.executeUpdate();
        s.setInt(1,2);s.setString(2,"李四");s.setString(3,"女");s.setInt(4,18);
        s.executeUpdate();
        s.setInt(1,3);s.setString(2,"王五");s.setString(3,"男");s.setInt(4,20);
        s.executeUpdate();
        s=conn.prepareStatement("select * from student");
        ResultSet r = s.executeQuery();
        while(r.next()){
            System.out.println(r.getString(1)+" "+r.getString(2)+" "+r.getString(3)+" "+r.getString(4));
        }
		} catch (SQLException e) {
            e.printStackTrace();
        }
		/**********   End   **********/
		finally {
            try {
                if (statement != null)
                    statement.close();
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

第3关:JDBC事务
任务描述
本关任务:按照具体要求编写程序。
相关知识
为了完成本关任务,你需要掌握:1. 什么是事务;2. 事务的基本要素;3.如何开启事务;4.事务的提交和回滚。
事务
假设场景,我们有一个人员管理系统,你要删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就可以构成一个事务!
事务能够控制何时更改提交并应用于数据库。 它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败。
事务的基本要素(ACID)
原子性(Atomicity):一组事务,要么成功;要么撤回;
一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到;
隔离性(Isolation):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度;
持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
开启事务
开启事物需要启用手动事务支持,而不是使用JDBC驱动程序默认使用的自动提交模式,可调用Connection对象的setAutoCommit()方法。 如果将布尔的false传递给setAutoCommit(),则关闭自动提交,也就相当于开启了事物。 也可以传递一个布尔值true来重新打开它。
Connection conn = DriverManager.getConnection (url,“root”,“123123” );
conn.setAutoCommit(false);//关闭自动提交开启事务
提交和回滚
在mysql数据库中,默认为将每一句sql都自动提交,当我们将它设置为手动事务支持(也就是已经手动开启事务)时,我们就可以在需要提交的时候进行手动提交:
conn.commit();//提交事务
当有多条sql语句一次提交时,我们需要考虑到其中sql是否合法,若其中某一条不合法,其他的sql是否仍需更改等一系列问题;确保事务的基本要素,我们需要手动调用事务回滚来控制sql的执行:

try{
    Connection conn = DriverManager.getConnection (url,"root","123123" );
    conn.setAutoCommit(false);//开启事务
    PreparedStatement ps = conn.prepareStatement("insert into table1(column1,column2) values(1,'xx1')");
    ps.executeUpdate();
    ps = conn.prepareStatement("insert in table1(column1,column2) values(1,'xx1')");
    ps.executeUpdate();
    conn.commit();//提交事务
} catch (SQLException e) {
    try {
        conn.rollback();//回滚事务  回滚到你开始事务之前
    } catch (SQLException e1) {
        e1.printStackT\frace();
    }
}

上述代码执行完毕后,数据库中并不会有数据更新。由于第二条insert语句语法错误,所以事务回滚,之前的insert也会失效。通常事务回滚都会放在catch中来捕获。
开启事务后,一定要跟上 commit 或 rollback,及时释放可能锁住的数据。
不用rollback()表面和用了rollback()效果一样,但是不用rollback()可能导致被锁住的数据不能及时的释放(需要等事物超时释放),会影响下一次的事物操作。
编程要求
根据提示,在右侧编辑器补充代码,编写一条新增SQL语句和任意一条错误的SQL语句,提交事务;要求第一条新增语句在数据库中被修改,其后错误SQL语句不执行。
新增插入语句具体要求如下:
在mysql_db数据库student表中新增一条id为4,name为赵六,sex为女,age为21的数据。
提示:每一条SQL语句之后都可提交事务。
测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
1 张三 男 19
2 李四 女 18
3 王五 男 20
4 赵六 女 21
开始你的任务吧,祝你成功!
参考代码:

package jdbc;
import java.sql.*;
public class jdbcTransaction {
public static void transaction(){
    try {
        Class.forName("com.mysql.jdbc.Driver" );
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    Connection conn = null;
    PreparedStatement ps = null;
    /**********  Begin   **********/
    //连接数据库并开启事务
    String url = "jdbc:mysql://localhost:3306/mysql_db";
    try {
        conn = DriverManager.getConnection (url,"root","123123" );
        conn.setAutoCommit(false);//关闭自动提交开启事务
        ps = conn.prepareStatement("insert into student(id,name,sex,age) values(4,'赵六','女',21)");
        ps.executeUpdate();
        conn.commit();//提交事务
        ps = conn.prepareStatement("insert in student(id,name,sex,age) values(5,'钱七','男',18)");
        ps.executeUpdate();
        conn.commit();//提交事务
    } catch (SQLException e) {
        try {
            //事务回滚
            conn.rollback();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
    /**********  End   **********/
    finally {
        try {
            if(ps!=null)
                ps.close();
            if (conn != null)
                conn.close();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
}
}
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JDBCJava Database Connectivity的缩写,是Java语言中用于连接和操作数据库的接口。它提供了一组标准的API,可以用来访问各种不同类型的关系型数据库,如Oracle、MySQL、SQL Server等。JDBC驱动程序是一个Java类库,可以将JDBC API映射到特定数据库的接口上。通过使用JDBC,可以在Java程序中执行SQL语句,并对数据库进行增删改查等操作。 ### 回答2: JDBCJava Database Connectivity(Java数据库连接)的缩写,是Java语言中用于与数据库进行连接和操作的API(应用程序接口)。它可以让开发者使用Java语言轻松地访问各种不同类型的数据库。 JDBC高级特性包括以下几个方面: 1. 连接池:JDBC连接池是一种管理数据库连接的机制。它可以在应用程序启动时创建一定数量的数据库连接,并在需要时将这些连接分配给应用程序使用。通过使用连接池,可以减少每次请求时创建和关闭数据库连接的开销,提高应用程序的性能。 2. 事务管理:JDBC提供了事务管理的功能,可以对多个数据库操作进行批量提交或回滚。通过使用事务,可以确保多个操作的一致性和完整性,同时避免因意外错误导致数据丢失或不一致的问题。 3. 批量更新:JDBC提供了批量更新的功能,可以将多个数据操作一次性提交到数据库,从而减少与数据库的交互次数,提高性能。批量更新适用于需要同时操作多个数据记录的场景,比如大量数据的插入、更新或删除。 4. 元数据查询:JDBC可以通过元数据查询数据库的结构和属性信息,包括表、列、索引等的定义和属性。开发者可以使用元数据查询来动态获取数据库的结构,从而实现一些灵活的操作和功能,例如自动生成代码或报表等。 5. 执行计划:执行计划是指数据库在执行SQL语句时所采取的具体执行策略。JDBC可以获取和分析执行计划信息,帮助开发者优化SQL语句的性能。通过查看执行计划,开发者可以了解数据库在执行SQL语句时所使用的索引、排序、连接等操作,从而针对性地进行性能优化。 总结来说,JDBC高级特性包括连接池、事务管理、批量更新、元数据查询和执行计划等。通过使用这些特性,开发者可以更加灵活和高效地与数据库进行交互,实现更复杂的数据操作和业务需求。 ### 回答3: Java高级特性中的一个重要组成部分是JDBCJava Database Connectivity),它为Java应用程序提供了与数据库之间连接的能力。 JDBC允许开发人员使用标准的SQL语句来查询和操作各种类型的数据库,无论是关系型数据库如MySQL、Oracle还是非关系型数据库如MongoDB。JDBC通过数据库驱动程序(Driver)来实现与数据库的通信,每种数据库都需要特定的驱动程序。 使用JDBC的第一步是加载数据库驱动程序。开发人员需要使用"Class.forName()"方法来加载驱动程序的类。一旦驱动程序加载成功,开发人员可以使用"DriverManager.getConnection()"方法来创建与数据库的连接。 在成功连接数据库之后,开发人员可以使用Java的数据库API(Application Programming Interface)来执行SQL语句、事务管理和获取查询结果等。JDBC提供了一组接口和类来实现这些功能,例如"Statement"、"PreparedStatement"和"ResultSet"等。 JDBC还支持元数据(MetaData),可以通过元数据获取关于数据库的信息,如表结构、列名和数据类型等。元数据使得开发人员可以动态地获取和处理数据库的信息,从而实现更高级的功能。 除了基本的SQL操作JDBC还支持批量处理、存储过程和批量更新等高级特性。批量处理可以提高性能,减少与数据库的通信次数;存储过程可以在数据库端执行一系列操作,减少与客户端的通信;批量更新可以一次性更新多个记录,提高效率。 总之,JDBCJava高级特性中与数据库交互的重要组成部分,通过它可以实现Java应用程序与各种类型的数据库的连接和操作JDBC提供了丰富的API和功能,方便开发人员进行数据库操作,并支持高级特性如元数据、批量处理和存储过程等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值