什么是 JDBC ?
JDBC
概念:Java DataBase Connectivity,Java数据库连接,也就是用Java语言操作数据库。
JDBC本质:是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。
点击这里下载驱动 jar 包,提取码:r60s
复制 jar 包,可以在你的工程文件新建一个名为 libs 的包,将文件粘贴进去,右键,找到 Add as Library ,如下图:
如何实现?
步骤:
- 导入驱动 jar 包
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接收返回结果
- 处理结果
- 释放资源
代码实现:
public class JDBCDemo01 {public static void main(String[] args) throws Exception {// 1.导入驱动jar包// 2.注册驱动Class.forName("com.mysql.jdbc.Driver");// 3.获取数据库连接对象// localhost:3306 本机端口号为3306的程序,默认为此,可以省略// companydb 数据库名Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/companydb", "root", "1234");// 4.定义sql语句String sql = "update food set foodKind = 'miantiao' where foodId = 1";// 5.获取执行sql的对象,StatementStatement stmt = conn.createStatement();// 6.执行sql,返回值count是影响的行数。int count = stmt.executeUpdate(sql);// 7.处理结果System.out.println(count);// 8.释放资源conn.close();stmt.close();}
注意:这里导入的驱动 jar 包要和安装的 MySQL 的版本一致,否则会报错。
快斗安装的 MySQL 是8 . 多版本的,刚开始导入了5 . 多版本的驱动 jar 包,后来发现需要版本一致,就把驱动 jar 包换成了8 . 多的,但是还是报错,经过一番折腾,发现代码也是需要改的。在这里把能正常运行的代码贴上:
// 2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/companydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8", "root", "1234");
认识这些对象:
- DriverManager:驱动管理对象
功能:
- 注册驱动:告诉程序应该使用哪一个数据库驱动 jar
static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager。- 获取数据库连接
static Connection getConnection(String url, String user, String passward)
参数:
url:指定连接的路径。语法:jdbc:mysql://ip地址(域名):端口号/数据库名。如果连接的是本机MySQL服务器,并且MySQL服务默认端口是3306,则url可以简写为jdbc:mysql:///数据库名。
user:用户名
password:密码
- Connection:数据库连接对象
功能:
- 获取执行sql的对象
Statement createStatement()
PreparedStatement preparedStatement(String sql)- 管理事务
- Statement:执行sql的对象
功能:执行sql
- boolean execute(String sql):可以执行任意的sql
- int executeUpdate(String sql):执行DML(insert,update,delete) 语句、DDL(create,alter,drop)语句。返回值:影响的行数,可以通过这个影响的行数判断DML语句执行是否成功,返回值大于0代表成功,反之,则失败。
- ResultSet executeQuery(String sql):执行DQL(select)语句。
- ResultSet:结果集对象,封装查询结果
- next():游标向下移动一行
- getXxx():获取数据。Xxx 代表数据类型,如:getInt(),getString()
参数:int:代表列的编号,从1开始
String:代表列名称
JDBC练习
- insert
public class JDBCDemo2 {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try {// 1 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2 定义sql语句String sql = "insert into food values(4,'mantou','2')";// 3 获取Connection对象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/companydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8", "root", "root");// 4 获取Statement对象stmt = conn.createStatement();// 5 执行sql语句int count = stmt.executeUpdate(sql);// 6 处理结果System.out.println(count);if (count > 0) {System.out.println("操作成功!");} else {System.out.println("操作失败!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 7 释放资源// 对于stmt,如果获取connection对象那一行出错了,就不会执行到stmt,就是赋值时候的null,会空指针异常,所以if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
- update
// 只用将上面添加数据的sql语句改成更新的sql语句即可。
// 2 定义sql语句
String sql = "update food set foodPrice = 3 where foodId = 3";
- DDL之delete
public class JDBCDemo4 {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try {// 1 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2 定义sql语句String sql = "delete from food where foodId = 4";// 3 获取Connection对象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/companydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8", "root", "root");// 4 获取statement对象stmt = conn.createStatement();// 5 执行sql语句int count = stmt.executeUpdate(sql);// 6 处理结果System.out.println(count);if (count > 0) {System.out.println("操作成功!");} else {System.out.println("操作失败!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 7 释放资源if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
- DDL之create 创建一张表
// 只用将上面delete的sql语句改成create的语句即可
// 2 定义sql语句String sql = "create table student (id int ,name varchar (20))";
使用 ResultSet 获取 select 到的结果集
public class JDBCDemo7 {public static void main(String[] args) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 1 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2 定义sql语句String sql = "select * from food";// 3 connection对象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/companydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8", "root", "root");// 4 statement对象stmt = conn.createStatement();// 5 执行sql语句rs = stmt.executeQuery(sql);// 5.1 让游标下移while (rs.next()) {// 循环判断光标是否在表最后一行的末尾,如果不是进入循环,取值;否则结束// 获取数据// 5.2 获取数据int id = rs.getInt(1);String kind = rs.getString(2);int price = rs.getInt("foodPrice");System.out.println(id + "---" + kind + "---" + price);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
JDBC工具类
由于每次都要注册驱动,建立连接,释放资源等等,我们可以写一个工具类,以简化代码。对于每次建立连接时都要传入的参数 url,username,password,我们应该使用配置文件的方式,即将这些参数放入另外的一个文件中,在 src 包下新建 jdbc.properties 文件。如果想让改变连接,只用改变配置文件即可,无需改变代码。
public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;// 文件的读取,只需要读取一次就可以拿到这些值,使用静态代码块static {try {// 创建Properties集合类Properties prop = new Properties();// 动态获取src下的文件路径ClassLoader classLoader = JDBCUtils.class.getClassLoader();URL res = classLoader.getResource("jdbc");String path = res.getPath();System.out.println(path);// 加载文件prop.load(new FileReader(path));// 获取属性url = prop.getProperty("url");user = prop.getProperty("user");password = prop.getProperty("password");driver = prop.getProperty("driver");// 注册驱动Class.forName(driver);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}// 注册驱动// 建立连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);}// 方法重载public static void close(Statement stmt, Connection conn) {if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(ResultSet rs, Statement stmt, Connection conn) {if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}
}
那么我们写好这个工具类之后,再进行之前的update等操作就会很简单了:
public class JDBCDemo11 {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try {conn = JDBCUtils.getConnection();String sql = "update `account` set money = 10 where id = 1";stmt = conn.createStatement();int count = stmt.executeUpdate(sql);System.out.println(count);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(stmt, conn);}}
}
JDBC控制事务
事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
操作:
- 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务。在执行 sql 之前开启事务
- 提交事务:commit()。当所有 sql 都执行完提交事务。
- 回滚事务:rollback()。在 catch() 回滚事务。
代码实现:
public class JDBCDemo10 {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt1 = null;PreparedStatement pstmt2 = null;try {// 获取连接conn = JDBCUtils.getConnection();// 开启事务conn.setAutoCommit(false);// 定义sqlString sql1 = "update account set money = money - ? where id = ?";String sql2 = "update account set money = money + ? where id = ?";// 获取执行sql对象pstmt1 = conn.prepareStatement(sql1);pstmt2 = conn.prepareStatement(sql2);// 给?赋值pstmt1.setInt(1, 500);pstmt1.setInt(2, 1);pstmt2.setInt(1 ,500);pstmt2.setInt(2 ,2);// 更新数据pstmt1.executeUpdate();// 手动制造一个异常int i = 3 / 0;pstmt2.executeUpdate();// 以上代码执行都没有问题,提交事务conn.commit();} catch (Exception e) {// 不管在上面出现什么异常,都会到catch里面去// 所以在这里回滚事务try {if (conn != null) {conn.rollback();}} catch (SQLException ex) {ex.printStackTrace();}e.printStackTrace();} finally {JDBCUtils.close(pstmt1, conn);JDBCUtils.close(pstmt2, null);}}
}
我是快斗,请多多指教!
什么是 JDBC ?相关推荐
- weblogic项目java.sql.SQLException: ORA-01861: 文字与格式字符串不匹配 at oracle.jdbc.....错误解决
原因:数据源配置时间格式问题 解决方案: 1.进入weblogic控制台 2.左侧菜单栏选择Service- JDBC- Data Source 3.选择你的数据源,然后进入Configuration ...
- JDBC与数据库连接工具对比分析
JDBC 使用步骤: 注册数据库驱动 通过DriverManager获取数据库连接 通过Connection对象获取Statement对象 使用Statement执行SQL语句 操作ResultSet ...
- JDBC简单操作步骤总结
JDBC 操作步骤 1:加载数据库驱动 2:建立与数据库之间的连接 3:发送SQL语句 4:获取查询结果 5:使用完之后,应进行断开连接,减少服务器负担. frist 提前下载相关jar包,添加相应依 ...
- SpringBoot整合JDBC、整合Druid数据源详解教程
目录 一.整合JDBC 1. 环境准备 1. 创建数据库 2. 创建SpringBoot项目 3. IDEA连接数据库 2. 编写数据库配置信息 3. 编写测试类测试 4. CRUD操作数据库 1. ...
- 2021年大数据Flink(十四):流批一体API Connectors JDBC
目录 Connectors JDBC 代码演示 Connectors JDBC Apache Flink 1.12 Documentation: JDBC Connector 代码演示 package ...
- JDBC学习DayTwo
一.利用反射及JDBC元数据编写通用的查询方法 1.ResultSetMetaData 定义:描述ResultSet的元数据对象,即从中可以获取到结果集中有多少列.列名是什么. 获取 ResultSe ...
- springboot-6-整合jdbc
如果有整合jpa了, 那么在dao中直接, 不需要引入依赖 @Resource private JdbcTempalte jdbcTempalte; 如果没有的话, 就先在pom.xml中加入依赖 & ...
- JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...
- mysql和windows连接不上_问题-jdbc连接不上mysql,windows下开启两个mysql服务
1.问题: 前两天安装了个php 环境- wamp,由于我自己电脑上本身带有 mysql的数据库,在安装完后,没有注意到,mysql已经指向了 刚安装好的wamp里的mysql .导致 之前的 mys ...
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
最新文章
- 力扣(LeetCode)刷题,简单题(第8期)
- haproxy配置文件
- 一文读懂大数据平台——写给大数据开发初学者的话!
- android手势滑动——左右滑动效果实现
- DCMTK:生成内置的数据字典
- 使用PowerShell配置Microsoft Teams
- 浅谈AsyncLocal,我们应该知道的那些事儿
- uoj#38. 【清华集训2014】奇数国(线段树+数论)
- Windows平台自动登录telnet批处理文件
- oracle deul,C#引用传递
- PyTorch学习—8.模型创建步骤与nn.Module属性
- 如何阅读科研文献-------------一点思考与总结
- 杰里之echo 衰减系数调节【篇】
- 用excel绘制统计图表(清风建模学习笔记)
- oracle12c关闭cdb,oracle12c CDB与PDB 启动与关闭操作
- 2010 年全国大学生数学建模竞赛甘肃赛区 获奖情况
- 用css3 3d效果做一个立体盒子
- 程序员的工资高,到底程序员的工资有多高?那些你不了解的程序员
- 什么是大数据系统存储及管理?
- 单位1-Mbps、Kbps、bps、kb、mb及其换算和区别
热门文章