JDBC简介

  • Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成。
  • JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
  • 使用JDBC编写的程序能够自动地将SQL语句传送给相应的数据库管理系统。
  • JDBC 是个"低级"接口,也就是说,它用于直接调用 SQL 命令。在这方面它的功能极佳,并比其它的数据库连接 API 易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的 API,这种API在幕后被转换为诸如 JDBC 这样的低级接口。
  • JDBC扩展了Java的功能,由于Java语言本身的特点,使得JDBC具有简单、健壮、安全、可移植、获取方便等优势。

JDBC中常用类和接口

接口/类 功能说明
DriverManager 数据库驱动管理类,用于加载和卸载各种驱动程序,并建立于数据库的连接
Connection 此接口用于连接数据库
Statement 此接口用于执行SQL语句并将数据检索到ResultSet中
ResultSet 结果集接口,提供检索SQL语句返回数据的各种方法
PreparedStatement 此接口用于执行预编译的SQL语句
CallableStatement 此接口用于执行SQL存储过程的语句

JDBC开发步骤

  • 注册驱动
  • 建立连接
  • 创建statement
  • 执行sql,得到ResultSet
  • 查看结果
  • 释放资源

开发第一个JDBC程序

源码

 package com.jyroy.test;

 import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import com.jyroy.util.JDBCUtil; import java.sql.Connection;
import java.sql.Driver; public class MainTest { public static void main(String[] args) {
Connection connection = null;
Statement st = null;
ResultSet rs = null; try {
//1.注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //2.建立连接
//方法一 参数一:协议+访问数据库,参数二:用户名,参数三:密码
connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password"); //方法二
// DriverManager.getConnection("jdbc:msql://localhost/student?user=root&password=password"); //3.创建statement,跟数据库打交道一定需要这个对象
st = connection.createStatement(); //4.执行查询
String sql = "select * from stu";
rs = st.executeQuery(sql); //5.遍历查询每一条记录
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age"); System.out.println("id = " + id + "; name = " + name + "; age = " + age);
}
//进行资源释放
connection.close();
st.close();
rs.close(); } catch (SQLException e) {
e.printStackTrace();
}
}
}

结果

使用工具类

  借助工具类来方便JDBC的操作

获取数据库连接

  建立数据库连接的类,里面封装好实现数据库连接的函数,方便调用实现数据库连接

  这里说两个问题:

  一:

  这里多用了一个 Class.forName("com.mysql.jdbc.Driver"); 因为

  在上面的例子中,Driver这个类里面有静态代码块(java.sql.DriverManager.registerDriver(new Driver())),我们在new的时候一开始就加载了Driver类,相当于注册了两次驱动,为了避免这个情况,使用Class.forName("com.mysql.jdbc.Driver");来进行驱动的注册。

  二:

  根据JDBC官方文档,在JDBC5之后,Class.forName(); 的注册驱动,官方已经帮我们实现了,我们不加载驱动(JDBC会自动识别使mysql还是oracl什么的,当然了,如果同时用了mysql和oracl就要写上了,这个时候就没法自动确定了),直接建立连接也是可以的,大家可以自己试一下把Class.forName();这句话注释掉,也是可以完美运行的!

 package com.jyroy.DBUtil;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public class DBUtil { private static Connection connection=null; static {
try {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库的连接
connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password"); } catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//将获得的数据库与java的链接返回(返回的类型为Connection)
public static Connection getConnection(){
return connection;
}
}

  我们在MainTest中调用

 connection = DBUtil.getConnection();

  运行之后,同样可以得到相同的查询结果

进行资源释放

  上面的资源释放,只是简单的close掉了,更好的办法释放资源还是在finally语句块中,因此重新编写代码,使用finally语句块,我这里直接写了一个工具类,让代码更清晰一点。

    finally一般拿来做一些善后清理工作,当try块里出现错误的话,会立即跳出try块,找到匹配的错误,执行catch块里的语句,此时,可能在try块里打开的文件没关闭,连接的网络没断开,对这些浪费的内存就不能及时释放回收,因此利用finally进行一些善后工作
 package com.jyroy.util;

 import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class JDBCUtil {
/*
释放资源
*/ public static void release(Connection connection, Statement st, ResultSet rs) {
closeConn(connection);
closeRs(rs);
closeSt(st);
} private static void closeRs(ResultSet rs) {
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
rs = null;
}
} private static void closeSt(Statement st) {
try {
if(st!=null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
st = null;
}
} private static void closeConn(Connection connection) {
try {
if(connection!=null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
connection = null;
}
} }

  在MainTest类中进行使用

 JDBCUtil.release(connection, st, rs);

数据库的增删查改

查询

 package com.jyroy.test;

 import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import com.jyroy.DBUtil.DBUtil;
import com.jyroy.util.JDBCUtil; import java.sql.Connection;
import java.sql.Driver; public class MainTest { public static void main(String[] args) { Connection conn = null;
Statement st = null;
ResultSet rs = null; try {
//1.获取连接对象
conn = DBUtil.getConnection(); //2.根据连接对象,得到statement
st = conn.createStatement(); //3.执行查询
String sql = "select * from stu";
rs = st.executeQuery(sql); //4.遍历输出结果
while(rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age"); System.out.println(name + " " + age);
} } catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
}

插入

 @Test
public void testInsert() {
Connection conn = null;
Statement st = null; try {
//1.获取连接对象
conn = DBUtil.getConnection(); //2.根据连接对象,得到statement
st = conn.createStatement(); //3.执行插入
String sql = "insert into stu values(null, 'xiaoming', 12)"; int result = st.executeUpdate(sql); //result表示影响的行数,大于0表示添加成功,否则失败
if(result > 0) {
System.out.println("添加成功");
}
else {
System.out.println("添加失败");
} } catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st);
}
}

删除

 @Test
public void testDelete() {
Connection conn = null;
Statement st = null; try {
//1.获取连接对象
conn = DBUtil.getConnection(); //2.根据连接对象,得到statement
st = conn.createStatement(); //3.执行删除
String sql = "delete from stu where name = 'xiaoming'"; int result = st.executeUpdate(sql); //result表示影响的行数,大于0表示添加成功,否则失败
if(result > 0) {
System.out.println("删除成功");
}
else {
System.out.println("删除失败");
} } catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st);
}
}

更新

 @Test
public void testUpdate() {
Connection conn = null;
Statement st = null; try {
//1.获取连接对象
conn = DBUtil.getConnection(); //2.根据连接对象,得到statement
st = conn.createStatement(); //3.执行更新
String sql = "update stu set age = 11 where name = 'zhangsan'"; int result = st.executeUpdate(sql); //result表示影响的行数,大于0表示添加成功,否则失败
if(result > 0) {
System.out.println("更新成功");
}
else {
System.out.println("更新失败");
} } catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st);
}
}

使用JDBC连接操作数据库的更多相关文章

  1. JAVA采用JDBC连接操作数据库详解

    JDBC连接数据库概述 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供 ...

  2. JDBC连接-操作数据库

    JDBC连接数据库的操作步骤 *条件:先启动mysql,然后创建新连接.这里我用Navicat工具来操作数据库. 前面是创建数据库,以及授权的问题.然后打开eclipse 这里我整理一下 抛出的两个异 ...

  3. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  4. jdbc连接oracle数据库

    /*** 通过改变配置文件来连接不同数据库*/package com.xykj.jdbc; import static org.junit.Assert.*; import java.io.Input ...

  5. Crystal Reports 2008(水晶报表) JDBC连接mysql数据库

    在本blog中,主要介绍的是Crystal Reports 2008使用JDBC连接mysql数据库. 在连接之间,首先要确认你电脑上面都安装了mysql数据库. 其次,就是jdbc连接数据时候所使用 ...

  6. JDBC连接Oracle数据库的问题

    场景:最近做一个java web项目,使用jdbc连接Oracle数据库,遇到了两个问题. 问题1:jdbc连接不上Ubuntu Oracle服务器? 后来发现这个问题的原因是由于连接字符串写错了,修 ...

  7. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  8. JDBC连接MySQL数据库及示例

      JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一 ...

  9. JDBC 连接mysql数据库

    JDBC 连接mysql数据库jar包:mysql-connector-java-5.1.47.jar 下载:mysql-connector-java-5.1.47.jar jdbc:java dat ...

随机推荐

  1. java面向对象中四种权限(private,protected,public,友好型)详解

    转自http://blog.csdn.net/a1237871112/article/details/50926975 及http://blog.csdn.net/blackmanren/articl ...

  2. resteasy简单实例

    1.建一个maven web项目 新建一个maven项目,next,第一个框不要勾选 选择maven-archetype-webapp,建一个web项目 键入项目组织id与项目id 一般此时搭建的只是 ...

  3. Charles 连接手机抓包出现Unknown,一直无法抓包的问题解决

    mac电脑安装了charles并且确保已经安装成功,https抓包需要安装的相关的证书已经安装,并且手机浏览器中输入chls.pro/ssl已经将证书下载完成,但是手机与电脑相连通过点击手机应用还是无 ...

  4. 玩转PHP中的正则表达式

    玩转PHP中的正则表达式 检验用户输入.解析用户输入和文件内容,以及重新格式化字符串 级别: 中级 正则表达式提供了一种处理文本的强大方法.使用正则表达式,您可以对用户输入进行复杂的检验.解析用户输入 ...

  5. ABP框架展示异常信息

    接触ABP框架有一段时间了,也遇到了一些问题,看了官网文档,但是或许是看的不够细致的原因,实际开发中还是遇到了一些问题,耗费了时间去处理,回头一看,原来文档中早已提及. 开发环境:ABP+MPA模式+ ...

  6. HashMap 实现及原理

    1.为什么用HashMap? HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和 ...

  7. WAF开放规则定义权:专家策略+用户自定义策略=Web安全

    在第一期“漫说安全”栏目中,我们用四格漫画的形式介绍了基于深度学习的阿里云WAF到底智能在哪里,能帮客户解决什么问题. 在今天的这期栏目里,我们依然通过漫画这种通俗易懂的方式,与大家分享阿里云WAF的 ...

  8. Java 在PPT中绘制图形

    Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充.线条颜色.图形大小.位置等.下面将通过Java编程来演示在PPT中绘制图形的方法. 工具:Free Spi ...

  9. TCP的三次握手与四次挥手

    TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...

  10. Observer观察者模式与OCP开放-封闭原则

    目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...