一、实验名称
(1)了解JDBC工作的基本原理
(2)掌握JDBC编程的基本步骤
(3)熟悉SQL的DML部分命令:select,update,insert,delete
二、实验内容
(1)设置ODBC数据源。
(2)按要求编写一个Java Application程序,并编译、运行这个程序。
三、实验目的
参照如下所示的SQL命令,在Microsoft Access数据库中创建用户信息表“userinfo”,并输入如表1所示的数据。
create table userinfo( code varchar(4) not null, / * 用户代码 * / name varchar(10), / * 用户姓名 * / password varchar(6), / * 用户密码 * / email varchar(40), / * 用户电子邮件地址 * / primary key(code));
表1:用户信息表中的数据
代码 | 姓名 | 密码 | 电子邮件地址 |
7101 | 宋晓梅 | 123456 | xiaomei@yahoo.com.cn |
7102 | 关松杰 | 654321 | songjie@263.net |
7103 | 李晓梅 | 123654 | xiaomei@yahoo.com.cn |
7104 | 张松岩 | 456123 | songyan@yahoo.com.cn |
7105 | 王亚杰 | 321456 | yajie@hotmail.com |
7106 | 曲小声 | 654321 | xiaosheng@263.net |
编写JDBC应用程序,首先将用户信息表中的数据在屏幕上显示出来,然后插入一个记录,最后将更新以后数据表中的数据在屏幕上显示出来。
四、类图/类关系图/交互图等
设计思路:
Pool类时一个简单的数据库连接池,封装了获取连接和放回连接的方法,提升使用性能。
Display类为展示查询结果的类,其中有静态方法display。
Main为测试类,测试题目要求的操作。
五、程序
Pool类:
其原理就是内部维护了一个Map映射集合,如果connection空闲,值为1;若不空闲则为0。通过getConnection()方法来选择取出空闲的连接或者重新创建连接返回,layConnection就是标记Map中相应的value为1来表示该连接已空闲。
package com.dreamchaser.jdbc; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; /** * 一个简单的数据库连接池 */ public class Pool { private static Driver driver; static { try { driver = new com.mysql.cj.jdbc.Driver(); DriverManager.registerDriver(driver); } catch (SQLException throwables) { throwables.printStackTrace(); } } private static Map<Connection,Integer> pool=new HashMap<>(); private static String url="jdbc:mysql://localhost:3306/example?serverTimezone=Asia/Shanghai"; private static String user="root"; private static String password="jinhaolin"; /** * 从连接池中获取一个空闲连接,如果没有则创建一个新的连接返回 * @return */ public static Connection getConnection(){ for (Map.Entry entry:pool.entrySet()){ if (entry.getValue().equals(1)) { entry.setValue(0); return (Connection) entry.getKey(); } } Connection connection=null; try { connection=DriverManager.getConnection(url,user,password); pool.put(connection,0); } catch (SQLException throwables) { throwables.printStackTrace(); } return connection; } /** * 放回connection连接对象 * @param connection */ public static void layConnection(Connection connection){ pool.put(connection,1); } public static String getUrl() { return url; } public static void setUrl(String url) { Pool.url = url; } public static String getUser() { return user; } public static void setUser(String user) { Pool.user = user; } public static String getPassword() { return password; } public static void setPassword(String password) { Pool.password = password; } }
Display展示工具类:
内置display(ResultSet rs)方法用来展示查询出来的数据
package com.dreamchaser.jdbc; import java.sql.ResultSet; import java.sql.SQLException; public class Display { public static void display(ResultSet resultSet) { System.out.println("-------------------------------------------------"); System.out.println("|\t代码\t\t姓名\t\t密码\t\t电子邮件地址\t"); try { while (resultSet.next()){ System.out.println("|\t"+resultSet.getString(1)+"\t"+resultSet.getString(2) +"\t"+resultSet.getString(3)+"\t"+resultSet.getString(4)+""); } } catch (SQLException throwables) { throwables.printStackTrace(); } System.out.println("-------------------------------------------------"); } }
Main类:
进行jdbc操作,在最后按先进后出的原则释放相应资源。
package com.dreamchaser.jdbc; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Main { public static void main(String[] args) { Connection connection=Pool.getConnection(); ResultSet resultSet=null; Statement statement=null; try { statement = connection.createStatement(); String sql="select * from userinfo"; resultSet=statement.executeQuery(sql); //展示打印查询结果 Display.display(resultSet); String sql1="insert into userinfo values(7017,'金昊霖',123456,'767564319@qq.com')"; statement.execute(sql1); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { try { resultSet.close(); statement.close(); //将连接放回连接池 Pool.layConnection(connection); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
六、测试
七、实验心得
jdbc(java database connection)就是java数据库链接的api,是java标准类库的扩展,用它可以应用sql访问数据库,完成对数据库的查找,更新。
与其它数据库编程环境相比,jdbc有java语言的特性,使用jdbc开发的程序可以跨平台运行,而且不受数据库供应商的限制。
为什么不受数据库供应商的限制呢?
就在于jdbc的设计。
sun公司为sql访问数据库提供一套“纯”java api;
同时提供一个驱动管理器,以允许第三方驱动程序可以链接到特定的数据库,这样数据库供应商就可以提供自己的驱动程序,并插入到驱动管理器中,关键是所有的驱动程序都必须满足驱动管理器api提出的要求。
需要一套简单的机制,以使得第三方驱动程序可以想驱动管理器注册。
现在通常使用的数据库操作框架mybatis也是基于jdbc进行开发的,所以学好jdbc也是挺重要的,它是连接Java和数据库的桥梁。