JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

一、Java连接数据库示例:

1、步骤:

  • 导jar包:驱动。
  • 加载驱动类:Class.forName("类名");
  • 给出url、username、password,其中url背下来。
  • 使用DriverManager类来得到Connection对象。
 1 public class Demo1 {
2 /**
3 * ClassNotFoundException:
4 * 没有导入驱动包
5 *
6 * SQLException:
7 * 检查三个参数:url、username、password是否正确
8 * 检查是否开启了mysql服务器。
9 *
10 */
11 @Test
12 public void fun1() throws ClassNotFoundException,SQLException{
13 /**
14 * jdbc四大配置参数
15 * driverClassName:com.mysql.jdbc.Driver
16 * url:jdbc:mysql://localhost:3306/数据库名
17 * username:root
18 * password:
19 */
20 Class.forName("com.mysql.jdbc.Driver");//加载驱动类(注册驱动)
21
22 //使用url、username、password,得到连接对象
23 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb_1","root","");
24 System.out.println(con);
25 }
26 }

2、基本异常

未导驱动包:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver ;

数据库不存在:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'mydb';

端口错误:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure;

密码错误:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES);

用户不存在:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES);

二、JDBC原理

Class.forName("com.mysql.jdbc.Driver");//此据等同于以下面两句,与最后一句的逻辑关系
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver;
DriverManager.registerDriver(driver);
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb_1","root","");

  所有的java.sql.Driver实现类,都提供了static块,块内的代码就是把自己注册到DriverManage中,如com.mysql.jdbc.Driver中的部分源码:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
} /**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}

  JDBC 4.0之后,每个驱动jar包中,在META-INF/services目录下提供了一个名为java.sql.Driver的文件,文件的内容就是该接口的实现类名称。连接数据库例子中,第20行“Class.forName("com.mysql.jdbc.Driver");”可省略不写。

三、使用JDBC对数据库进行简单的增删改查操作示例

  1 package demo2;
2
3 import org.junit.Test;
4 import java.sql.*;
5
6 public class Demo2 {
7 /*
8 * 对数据库进行增、删、改操作
9 * */
10 @Test
11 public void fun1() throws ClassNotFoundException,SQLException {
12 /*
13 * 一、得到Connection
14 * 1、准备四个参数
15 * 2、加载驱动类
16 * 3、得到Connection
17 * */
18
19 String driverClassName = "com.mysql.jdbc.Driver";
20 //jdbc协议的格式,jdbc:工商的名称:子协议(由工商自己来规定)
21 //对mysql而言,它的子协议结构://主机:端口号/数据库名称
22 String url = "jdbc:mysql://localhost:3306/mydb1";
23 String username = "root";
24 String password = "";
25 //加载驱动类
26 Class.forName(driverClassName);
27 //使用DriverManager,以及剩下的三个参数,得到Connection
28 Connection con = DriverManager.getConnection(url, username, password);
29 /*
30 * 二、对数据库做增删改
31 *1、通过Connection对象创建Statement
32 * Statement 语句的发送器,它的功能就是向数据库发送sql语句,
33 *2、调用它的int executeUpdate(String sql),它可以发送DML、DDL
34 * */
35 Statement stmt = con.createStatement();
36 // String sql = "INSERT INTO stu VALUES('0003','wangwu',88,'male')";
37 // String sql = "UPDATE stu SET name='zhaoliu',age=22,gender='female' WHERE " +
38 // "number='0003'";
39 String sql = "DELETE FROM stu";
40 int r = stmt.executeUpdate(sql);
41 System.out.println(r);
42 }
43 /*
44 * 执行查询操作
45 * */
46 @Test
47 public void fun2() throws ClassNotFoundException,SQLException {
48
49 /*
50 * 一、得到Connection
51 * 二、得到Statement,发送select语句
52 * 三、对查询返回的"表格"进行解析
53 * */
54 /*
55 * 一、得到连接
56 * */
57 String driverClassName = "com.mysql.jdbc.Driver";
58 String url = "jdbc:mysql://localhost:3306/mydb1";
59 String username = "root";
60 String password = "";
61
62 Class.forName(driverClassName);
63 Connection con = DriverManager.getConnection(url,username,password);
64 /*
65 * 二、得到Statement,执行select语句
66 * */
67 Statement stmt = con.createStatement();
68 /*
69 *调用Statement的ResultSet rs = executeQuery(String querySql);
70 * */
71 ResultSet rs = stmt.executeQuery("SELECT * FROM emp");
72 /*
73 * 三、解析ResultSet
74 * 1、把行光标移动到第一行,可以调用next()方法完成。
75 * */
76 while (rs.next()) { //把光标向下移动一行,并判断下一行是否存在
77 int empno = rs.getInt(1);//通过列编号来获取该列的值
78 String ename = rs.getString("ename");//通过列名称来获取该列的值
79 double sal = rs.getDouble("sal");
80
81 System.out.println(empno+","+ename+","+sal);
82 }
83 /*
84 * 四、关闭资源
85 * 倒关
86 * */
87 rs.close();
88 stmt.close();
89 con.close();//必须关,不关就死。
90 }
91 //规范化
92 @Test
93 public void fun3() throws Exception {
94 Connection con = null;//定义引用
95 Statement stmt = null;
96 ResultSet rs = null;
97 try {
98 //一、得到Connection
99 String driverClassName = "com.mysql.jdbc.Driver";
100 String url = "jdbc:mysql://localhost:3306/mydb1";
101 String username = "root";
102 String password = "";
103 Class.forName(driverClassName);
104 con = DriverManager.getConnection(url,username,password);//实例化
105 //二、创建Statement
106 stmt = con.createStatement();
107 String sql = "SELECT * FROM emp";
108 rs = stmt.executeQuery(sql);//实例化
109 //三、循环遍历rs,打印其中数据
110 //getString()和getObject()是通用的
111 int count = rs.getMetaData().getColumnCount();
112 while (rs.next()) {
113 for (int i = 1; i <= count; i++) {
114 System.out.print(rs.getString(i));
115 if (i<count) {
116 System.out.print(",");
117 }
118 }
119 System.out.println();
120 }
121
122 } catch (Exception e) {
123 throw new RuntimeException(e);
124 } finally {
125 //为了防止空指针异常发生,使用判断语句
126 if(rs != null) rs.close();
127 if(stmt != null) stmt.close();
128 if(con != null) con.close();
129 }
130 }
131 }

四、注意:数据库的列号是从1开始计算的。

JDBC入门(1)—— 入门案例的更多相关文章

  1. webpack4入门到进阶案例实战课程

    愿景:"让编程不在难学,让技术与生活更加有趣" 更多教程请访问xdclass.net 第一章 webpack4前言 第一集 webpack4入门到进阶案例实战课程介绍 简介:讲述w ...

  2. springboot + mybatisPlus 入门实例 入门demo

    springboot + mybatisPlus 入门实例 入门demo 使用mybatisPlus的优势 集成mybatisplus后,简单的CRUD就不用写了,如果没有特别的sql,就可以不用ma ...

  3. JDBC操作MySQL数据库案例

    JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  4. babel从入门到入门

    babel从入门到入门 来源 http://www.cnblogs.com/gg1234/p/7168750.html 博客讲解内容如下: 1.babel是什么 2.javascript制作规范 3. ...

  5. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  6. Android视频录制从不入门到入门系列教程(三)————视频方向

    运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子 ...

  7. springboot + kafka 入门实例 入门demo

    springboot + kafka 入门实例 入门demo 版本说明 springboot版本:2.3.3.RELEASE kakfa服务端版本:kafka_2.12-2.6.0.tgz zooke ...

  8. mybatis入门,基本案例和xml讲解

    mybatis入门 先举一个入门案例 1)创建一个mybatis-day01这么一个javaweb工程或java工程 2)导入mybatis和mysql/oracle的jar包到/WEB-INF/li ...

  9. spring入门--spring入门案例

    spring是一个框架,这个框架可以干很多很多的事情.感觉特别吊.但是,对于初学者来说,很难理解spring到底是干什么的.我刚开始的时候也不懂,后来就跟着敲,在后来虽然懂了,但是依然说不明白它到底是 ...

  10. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

随机推荐

  1. 【Qt】VS2010编译Qt5.3.2 64bit

    1. 为什么要这么做 在Windows下,Qt官网默认提供的二进制版本大多是32位,目前(2015.01.24)只对VS2013提供了64位版本,如下图所示: 为了适应我目前安装的VS2010 IDE ...

  2. 简单列举几种常用 FTP

    简单说下几种FTP FTP:文件传输协议(File Transfer Protocol,FTP) SFTP:OPENSSH 提供的隧道级文件传送(file transfer) FTPS:支持传输层安全 ...

  3. Spring注解大全,汇总版

    Spring使用的注解大全和解释 注解 解释 @Controller 组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类 ...

  4. 核心API的使用(给定一个字符串,统计每个字符出现的次数)

    /** * 给定一个字符串,统计每个字符出现的次数. 如:abdaewrwqask435a1aasd */public class ReplaceString { static int length; ...

  5. 图的最短路径---弗洛伊德(Floyd)算法浅析

    算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...

  6. OmniMarkupPreviewer 404

    Here is the answer: Sublime Text > Preferences > Package Settings > OmniMarkupPreviewer > ...

  7. 【kuangbin】计算几何部分最新模板

    二维几何部分 // `计算几何模板` ; const double inf = 1e20; const double pi = acos(-1.0); ; //`Compares a double t ...

  8. 基于wavesurfer.js的超大音频的渐进式请求实现

    最近在对超大音频的渐进式请求实现上面消耗了不少时间,主要是因为一对音频的基本原理不太理解,二刚开始的时候太依赖插件,三网上这块的资料找不到只能靠自己摸索.由于交互复杂加上坑比较多,我怕描述不清,这里主 ...

  9. 洛谷 P3757 [CQOI2017]老C的键盘

    题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...

  10. 虚拟机下设置CentOS 7使用固定IP地址

    1.设置虚拟机使用桥接网络 2.查看安装虚拟机软件的电脑IP信息 3.启动CentOS 7进行设置