JDBC的概念

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
JDBC本质上是一个接口,是一种规范.

这里我以Mysql数据库为例子:
通俗来讲就是使用Java代码来访问数据库,对表进行增删改查的操作.

入门案列HelloWorld

 1.首先准备数据库中数据
-- 创建hello表
CREATE TABLE hello(id INT,`name` VARCHAR(10)
);
-- 添加数据
INSERT INTO hello VALUES(1,'hello');
INSERT INTO hello VALUES(2,'world');

2.导入jar包
https://mvnrepository.com/ 可以在这个maven网站去下载
mysql-connector-java-5.1.37-bin.jar

3.编写java代码

//第一个jdbc程序
public class HelloWorld {public static void main(String[] args) throws ClassNotFoundException, SQLException {/*第一步:注册驱动 -- 在sql5版本后,这个步奏可以省略,因为在jar包下有个Driver配置文件,已经帮我们注册了本身没在内存里面,需要加载才能使用,什么情况触发类加载1.new2.使用静态方法3.加载子类的时候,父类也会加载*/Class.forName("com.mysql.jdbc.Driver");/*第二步:获取连接对象 -- 通过DriverManager的方法获取jdbc:mysql  是一种协议和http类似  通过这个协议,就知道是jdbc和mysql的连接192.168.93.132 是安装mysql的服务器的ip地址  3306 是对应的端口号,jdbc表示你要操作的那个库,后面的是mysql用户名密码*/Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.93.132:3306/jdbc", "root", "root");/*第三步:获取语句执行对象通过Connection对象获取语句对象作用:封装sql语句,执行sql语句1.DML:结果是影响的行数  int类型2.Dql:结果是resultSet  结果集*/Statement statement = connection.createStatement();/*第四步:获取返回的结果集执行查询语句,得到结果集对象作用:封装mysql服务器响应的数据*/ResultSet resultSet = statement.executeQuery("select * from hello");/*循环打印每个结果resultSet.next()方法是返回一个Boolean的值,如果结果集中有下一行数据,就返回true*/while (resultSet.next()) {System.out.print(resultSet.getInt("id") + " " + resultSet.getString("name") + "\n");}//第五步:释放资源statement.close();resultSet.close();connection.close();}
}

4.执行结果

总结Jdbc入门案列

由上面的代码得出jdbc的通用套路分为以下几步1.通过类加载器注册驱动-- 在sql5版本后,这个步奏可以省略,因为在jar包下有个Driver配置文件,已经帮我们注册了2.获取连接对象通过DriverManager.getConnection(参数详见代码);获取到连接对象Connection3.通过连接对象得到执行语句对象通过connection.createStatement();得到Statement执行语句对象4.通过statement对象的以下两个方法执行语句statement.executeQuery(sql语句);-->这是执行的是DQL语句,返回的是ResultSet结果集,这个结果集相当于List<Map<String,Object>>statement.executeUpdate(sql语句);-->这是执行的是DML语句,返回的是影响的行数

图示:

解决SQL注入

从上面的入门案列中我们使用的执行语句对象是statement,这个对象在执行sql语句的时候是对sql语句进行字符串拼接,所以会存在sql注入风险
PreparedStatement
它的父接口是Statement,Prepared准备好的SQL语句。MySQL中的语句也是要编译以后才执行,编译是需要消耗时间的。
比父接口更强大的地方:
1.SQL语句会预先编译,执行效率会更高。
2.解决SQL注入的问题,更安全
3.SQL语句代码的可读性更好,所有要替换的参数使用占位符,占位符是?问号

   /*** 模拟登录解决sql注入的问题,对入门案列的改造*/
public class LoginUser {public static void main(String[] args) throws ClassNotFoundException, SQLException {/*第一步:注册驱动 -- 在sql5版本后,这个步奏可以省略,因为在jar包下有个Driver配置文件,已经帮我们注册了*/Class.forName("com.mysql.jdbc.Driver");/*第二步:获取连接对象 -- 通过DriverManager的方法获取*/Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.93.132:3306/jdbc", "root", "root");/*第三步:获取预编译语句执行对象通过Connection对象获取预编译语句对象*///定义两个字符串来模拟用户传递的用户名密码,String username = "user";String password = "mima";//通过连接对象获取预编译语句对象PreparedStatement pst = connection.prepareStatement("select * from user where username=? and password=?");//传递参数:参数1表示语句中的第一个问号,2就是第二个问号pst.setString(1,username);pst.setString(2,password);//执行查询方法,返回结果集ResultSet resultSet = pst.executeQuery();/*第四步:获取返回的结果集执行查询语句,得到结果集对象作用:封装mysql服务器响应的数据*/while (resultSet.next()) {//如果查询出有结果集,表示有这个用户,就打印登录成功System.out.println("登录成功");}//第五步:释放资源pst.close();resultSet.close();connection.close();}
}

JDBC对事务的管理

通过连接对象中的方法来实现事务管理:注意事务管理的连接对象要是同一个

Connection接口中与事务有关的方法:

void setAutoCommit(boolean autoCommit) 设置事务的提交方式true 表示自动提交false 表示手动提交如果要开启事务,设置为false
void commit() 提交事务
void rollback() 回滚事务

目标
使用JDBC来处理事务:实现银行转账的操作

1.数据准备

-- 准备数据,创建账户表
CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`money` DOUBLE DEFAULT NULL,
PRIMARY KEY (`id`)
);-- 添加数据
INSERT INTO account VALUES(NULL,'小付',1000),(NULL,'小花',1000);

表中的数据:

JDBC控制事务模拟转账代码:

public class ZhuanZhang {public static void main(String[] args) throws Exception {//调用转账方法,让A给B转100元钱zhuanQian("小付","小花",900D,1100D);}/***假设2个人都是1000 元* @param nameA 转钱的用户* @param nameB 收钱的用户* @param moneyA 模拟转多少钱后更新表中的钱* @param moneyB 模拟收多少钱后更新表中的钱*/public static void zhuanQian(String nameA,String nameB,Double moneyA,Double moneyB){Connection connection = null;//获取连接对象try {connection = DriverManager.getConnection("jdbc:mysql://192.168.93.132:3306/jdbc", "root", "root");} catch (SQLException throwables) {throwables.printStackTrace();}try {//开启事务  false表示关闭自动提交事务connection.setAutoCommit(false);//得到预编译语句对象,先执行减钱的一方PreparedStatement pstA = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstA.setDouble(1,moneyA);pstA.setString(2,nameA);pstA.executeUpdate();//得到预编译对象,执行加钱的一方PreparedStatement pstB = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstB.setDouble(1,moneyB);pstB.setString(2,nameB);pstB.executeUpdate();//执行到这里说明都没有问题就提交事务connection.commit();} catch (SQLException throwables) {//说明sql语句出现异常,就回滚事务,让数据回到最初的时候try {connection.rollback();} catch (SQLException e) {e.printStackTrace();}throwables.printStackTrace();} finally {//释放资源try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}
}

执行代码后数据库信息:

我们先还原数据库的数据,都为1000元:
然后在代码中制造一个异常:

            //得到预编译语句对象,先执行减钱的一方PreparedStatement pstA = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstA.setDouble(1,moneyA);pstA.setString(2,nameA);pstA.executeUpdate();//制造异常 制造一个通用异常int a = 1/0;//得到预编译对象,执行加钱的一方PreparedStatement pstB = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstB.setDouble(1,moneyB);pstB.setString(2,nameB);pstB.executeUpdate();

执行发现数据库中的数据没有任何变化,控制台爆出异常

然后查询数据库发现数据并没有发生改变

所以我们发现当代码执行中出现异常,进行了事务回滚.

JDBC的入门案列以及JDBC的对事务的管理相关推荐

  1. Spark系列四:Spark的经典入门案列之ip地址归属地查询

    目录 概述 代码实现 单级模式 分布式模式 方案一: 方案二: 工具类 提示:所有需要的文件我全部放在资源里面了,可以自行下载 概述 需求:根据访问日志的ip地址计算出访问者的归属地,并且按照省份,计 ...

  2. spring简单入门,入门案列的执行流程,图例

    1.入门案例的执行流程 1.1:  当启动了tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatchServlet对象,就会加载springmvc.xml配置 ...

  3. Go入门案列1:实现一个家庭收支记账系统

    项目来源: b站尚硅谷go教学 使用 通过Create方法来创建myFamilyAccount变量(创建时设置的name和pwd相当于默认密码) ,再直接调用该变量的 MainMeau方法即可,可参照 ...

  4. RabbitMq入门案列

    一.流程 1.建立连接工厂ConnectionFactory 2.通过连接工厂ConnectionFactory建立连接Connection,相当于建立TCP连接 3.连接成功后建立信道Channel ...

  5. 【JDBC】JDBC快速入门

    [JDBC]JDBC快速入门 1.概述 2.JDBC快速入门 3.获取数据库连接的5种方式 4.ResultSet的基本使用 1.概述 JDBC是Java DataBase Connectivity的 ...

  6. JDBC+MySQL入门增删改查案例

    目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...

  7. JDBC 快速入门JDBC 抽取JDBC工具类:JDBCUtils

    文章目录 JDBC 快速入门JDBC 抽取JDBC工具类:JDBCUtils JDBC 概念:java database Connectivity java 数据库连接,java语言操作数据库 JDB ...

  8. JDBC学习总结 -- JDBC 快速入门 教程

    先感谢前人的劳动成果, 本教程中含有多处指路,请注意筛选. 详细请阅读官方文档:https://docs.oracle.com/javase/tutorial/jdbc/basics/index.ht ...

  9. JDBC从入门到熟练使用——功能类详解、增删改查(CRUD)、sql注入、事务、连接池

    一.JDBC入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问 ...

最新文章

  1. 使用eclipse创建Struts2项目
  2. 英特尔加注RISC-V:砸10亿投资,还加入其国际基金会
  3. 进程线程004 Windows线程切换的三种方式
  4. 【译】gRPC vs HTTP APIs
  5. linux打开服务iis,如何在Linux中引导时列出启动服务?
  6. EF6源码学习-准备篇
  7. 第二章 认识计算机硬件
  8. [转载]与索引相关的概念---聚簇因子
  9. Chrome浏览器 开发者工具中的 Performance
  10. 使用electron-builder对Electron项目进行打包
  11. jdk8官网下载地址
  12. 几种开放源码的TCPIP协议栈
  13. Mac之系统中各个文件夹详细介绍
  14. 机械臂求运动学逆解的Pieper准则
  15. 幼儿体能五项技能测试软件,幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类]
  16. MySQL枚举类型的“八宗罪”
  17. 静态链表、循环链表、双向链表
  18. 对学计算机学生礼仪,做一名内外兼修的优秀大学生——记计算机科学学院大学生形象包装与职场礼仪讲座...
  19. 计算机英语forward,英语每日一句:Forward an email
  20. 爆肝一个月,从博物馆到自然景区,整合了100个值得逛的3D游园景点,让你足不出户玩转中秋!

热门文章

  1. php正则 与 js正则
  2. 课程设计个人报告——基于ARM实验箱的捕鱼游戏的设计与实现
  3. mysql 使用正则表达式查询
  4. 找出1-100中缺失的两个数
  5. C# does not contain a constructor that takes no parameter
  6. 【Xamarin 挖墙脚系列:Xamarin SDK开源了................】
  7. MC34063组成DC-DC电路
  8. python下RSA加密解密以及跨平台问题
  9. [洛谷P1822]魔法指纹
  10. java.lang.IncompatibleClassChangeError: Expected static method