JDBC基础原理
一、DCL(了解)
-- 1. 创建用户
CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'zhangsan';
-- 2. 用户授权
GRANT ALL ON heima62.* TO 'zhangsan'@'%';
-- 3. 查看权限
SHOW GRANTS FOR 'zhangsan'@'%';
-- 4. 取消授权
REVOKE INSERT,UPDATE,DELETE ON heima62.* FROM 'zhangsan'@'%';
-- 5. 删除用户
DROP USER 'zhangsan'@'%';
-- 6. 修改用户密码的操作
SET PASSWORD FOR 'zhangsan'@'%' = PASSWORD('1234');
-- 7. 修改root自己的密码
SET PASSWORD = PASSWORD ('root');
二、JDBC
1. JDBC简介
JDBC:Sun公司提供的一套操作数据库规范(接口),由一堆接口和工具类组成的,实现了Java程序对不同数据库的统一操作。
驱动:由数据库厂商提供的、JDBC规范的实现类,所打包成的jar包。每种数据库都有自己的驱动包,我们要操作数据库,就必须引入驱动包
MySql的驱动包:
mysql-connector-java-5.1.37-bin.jar
2. ==JDBC快速入门==
//1. 注册驱动
//2. 获取连接
//3. 创建SQL执行平台
//4. 执行SQL语句
//5. 处理结果
//6. 释放资源
涉及的API简介
JDBC所有的接口、工具类都在:
java.sql.*
java.sql.DriverManager
:JDBC的一个工具类,驱动管理java.sql.Driver
:JDBC规范的数据库驱动类的接口java.sql.Connection
:JDBC规范的连接对象接口java.sql.Statement
:JDBC规范的SQL执行平台对象接口java.sql.ResultSet
:JDBC规范的查询结果集对象接口
注意:
在JDBC操作过程中,忽略驱动包里提供的实现类
3. JDBC的API详解
3.1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 不推荐
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
有问题:注册了2次
有硬编码问题
3.2 获取连接
Connection connection = DriverManager.getConnection("url","username","password");
参数说明:
url:数据库连接地址。写法示例:
jdbc:mysql://localhost:3306/heima62
。规范:协议名:固定值jdbc
子协议:通常是数据库类型,MySql的是mysql
具体地址:MySql的写法是:
//ip:port/database
。如果连接本机、默认端口的MySql,可以简写成:///database
username:数据库登录名
password:数据库密码
3.3 SQL执行平台,执行SQL语句
//获取SQL执行平台
Statement statement = connection.createStatement();
//使用SQL执行平台,执行SQL语句
//执行DQL:statement.executeQuery(sql),得到ResultSet对象
ResultSet resultSet = statement.executeQuery("select * from emp");
//执行DML:statement.executeUpdate(sql),得到int表示影响的行数
int count = statement.executeUpdate("delete from account where name = 'jack'");
//执行其它任意SQL:statement.execute(sql),得到boolean结果,表示 是否执行了查询/是否有ResultSet
boolean isQuery = statement.execute("select * from account");
3.4 结果集ResultSet的处理
ResultSet:是查询的结果集对象,自带一个行指针,默认指向第一行之前。必须要向下移动一次之后,才可以获取数据
向下移动行指针:
resultSet.next()
。返回值:true:向下移动成功,表示下一行存在
false:向下移动失败,表示下一行不存在
获取行指针所在行的某一列:
resultSet.getXXX("列名称")
:XXX是列的类型resultSet.getXXX(列序号)
:XXX是列的类型,序号从1开始
//5.处理结果
while (resultSet.next()) {
//int id = resultSet.getInt("id");
//int id = resultSet.getInt(1);
String id = resultSet.getString("id");
String ename = resultSet.getString("ename");
//int ename = resultSet.getInt("ename");
Date joindate = resultSet.getDate("joindate");
System.out.println("id:" + id + ", 姓名:" + ename + ", 入职时间:" + joindate);
}
3.5 释放资源
//6.释放资源: 顺序是resultSet->Statement->Connection
resultSet.close();
statement.close();
connection.close();
4. JDBC工具类的封装
5. ==JDBC的事务管理==
5.1 管理的步骤
开启事务:
connection.setAutoCommit(false)
提交事务:
connection.commit()
回滚事务:
connection.rollback()
try{
//1.注册驱动
//2.获取连接
//=====开启事务=====
//3.创建SQL执行平台
//4.执行SQL语句
//5.处理结果
//=====关闭事务:提交事务=====
}catch (Exception e){
//=====关闭事务:回滚事务=====
}finally{
//6.释放资源
}
5.2 事务管理的示例
需求:用户在控制台输入转账人、收款人、转账金额。我们完成转账操作,如果出现异常,要回滚事务
实现:
public class DemoTransactionManager {
public static void main(String[] args) throws SQLException {
//获取用户输入的信息:转账人、收款人、转账金额
Scanner scanner = new Scanner(System.in);
System.out.println("请输入转账人:");
String out = scanner.nextLine();
System.out.println("请输入收款人:");
String in = scanner.nextLine();
System.out.println("请输入转账金额:");
String money = scanner.nextLine();
transfer(out, in, money);
}
/**
* 银行转账的方法。带事务管理
* @param out 转账人
* @param in 收款人
* @param money 转账金额
*/
private static void transfer(String out, String in, String money) throws SQLException {
Connection connection = null;
Statement statement = null;
try {
//1.注册驱动获取连接
connection = JdbcUtils.getConnection();
//====开启事务=====
connection.setAutoCommit(false);
//2.创建SQL执行平台
statement = connection.createStatement();
//3.执行SQL语句
//3.1 转账人扣钱
String outSql = "UPDATE account SET balance = balance - "+money+" WHERE NAME = '"+out+"'";
int outCount = statement.executeUpdate(outSql);
System.out.println("转账人扣钱操作,影响行数:" + outCount);
//扣钱之后,出现异常
//int i = 1/0;
//3.2 收款人加钱
String inSql = "UPDATE account SET balance = balance + "+money+" WHERE NAME = '"+in+"'";
int inCount = statement.executeUpdate(inSql);
System.out.println("收款人加钱操作,影响行数:" + inCount);
//4.处理结果
System.out.println("转账成功");
//====关闭事务:提交事务===
connection.commit();
System.out.println("事务提交");
} catch (Exception e) {
//====关闭事务:回滚事务===
System.out.println("事务回滚");
connection.rollback();
e.printStackTrace();
} finally {
//5.释放资源
statement.close();
connection.close();
}
}
}
JDBC的快速入门步骤:导入jar包之后,代码有6步
注册驱动
获取连接
创建SQL执行平台
执行SQL语句
处理结果
释放资源
Statement执行SQL的几种方法:
//执行DQL
ResultSet resultSet = statement.executeQuery(sql);
//执行DML,返回值int,表示影响行数
int count = statement.executeUpdate(sql);
//执行其它SQL,返回boolean,表示是否执行了查询/是否有结果集产生
boolean isQuery = statement.execute(sql);处理结果集ResultSet的方法:
while(resultSet.next()){//一定要先next一次,才可以获取数据
XXX value = resultSet.getXXX(int 列序号);//列序号从1开始
XXX value = resultSet.getXXX(String 列名称);
}JDBC的事务管理
相关的方法:都是Connection对象的方法
开启事务:
setAutoCommit(false)
提交事务:
commit()
回滚事务:
rollback()
事务管理的步骤
try{
//获取连接
//==开启事务:获取连接之后,执行SQL之前开启即可
//创建SQL执行平台
//执行SQL语句
//处理结果
//==关闭事务:提交事务,在关闭连接之前提交事务即可
}catch(Exception e){
//==关闭事务:回滚事务
}finally{
//释放资源
}
JDBC基础原理的更多相关文章
- Unit01: JDBC原理 、 JDBC基础编程
Unit01: JDBC原理 . JDBC基础编程 这个文件里面有两块内容: 1.用比较麻烦的方式连接数据库,test1(),test4() 2.创建DBTool,测试DBTool连接数据库 ,tes ...
- jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用
一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数 ...
- JDBC基础教程
本文实例讲述了JDBC基础知识与技巧.分享给大家供大家参考.具体分析如下: 1.什么是JDBC? 通俗来讲JDBC技术就是通过java程序来发送SQL语句到数据库,数据库收到SQL语句后执行,把结果返 ...
- JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务
JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...
- I2C 基础原理详解
今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...
- jdbc基础 (四) 批处理
批处理,就是字面上的意思,一次性处理一批sql语句. 直接看例子吧: package com.cream.ice.jdbc; import java.sql.Connection; import ja ...
- jdbc基础 (三) 大文本、二进制数据处理
LOB (Large Objects) 分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...
- jdbc基础 (二) 通过properties配置文件连接数据库
csdn博文地址:jdbc基础 (二) 通过properties配置文件连接数据库 上一篇描述了对mysql数据库的简单操作,下面来看一下开发中应该如何灵活应用. 因为jdbc对数据库的驱动加载.连接 ...
- C#基础原理拾遗——引用类型的值传递和引用传递
C#基础原理拾遗——引用类型的值传递和引用传递 以前写博客不深动,只搭个架子,像做笔记,没有自己的思考,也没什么人来看.这个毛病得改,就从这一篇开始… 最近准备面试,深感基础之重要,奈何我不是计算机科 ...
随机推荐
- PAT 甲级 1007. Maximum Subsequence Sum (25) 【最大子串和】
题目链接 https://www.patest.cn/contests/pat-a-practise/1007 思路 最大子列和 就是 一直往后加 如果 sum < 0 就重置为 0 然后每次 ...
- (C)结构数组
结构数组 对于大小相同但是类型不同的数组,定义结构体数组对其很有帮组.例如: char *keyword[NKEYS]; int keycount[NKEYS]; 这两个数组大小相同,因此 可以用另一 ...
- Java截取最后一个 _ 后面的所有字符
String file = http://localhost:8888/upload/20190310/115111_58_592_HDFS读取文件的流程.png //截取文件名 String ori ...
- Hadoop- Wordcount程序原理及代码实现
如果对Hadoop- MapReduce分布式计算框架原理还不熟悉的可以先了解一下它,因为本文的wordcount程序实现就是MapReduce分而治之最经典的一个范例. 单词计数(wordcount ...
- Jmeter-聚合报告
线程组右键--添加--监听器--聚合报告 Aggreagete Report:jmeter最常用的一个Listener,“聚合报告”. Label:每个jmeter的element(例如HTTP Re ...
- L88
Where You Vote May Affect How You Vote On election day, where do you vote? If it's in a church, you ...
- 集训Day13
我这个肥宅一点都不快乐嘤嘤嘤 bzoj3456 求n个点的无向简单连通图的个数 我们可以用容斥推出递推式 首先我们令为 于是有 这样就是可以用CDQ分治解决的一类递推式了 不是那么明显的变形一下得到 ...
- 每天一个linux命令(1):man命令
版权声明 更新:2017-04-19博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下命令man. 2 ...
- mongodb入门-关系型RDMS数据库对比及适用场景
引言 最近工作接触到了mongodb数据库,记录下个人对其的理解和使用情况.虽然mongodb 出来的时间已经不短,但是相对mysql mssql oracle 这样传统的关系型数据库来说还是比较年轻 ...
- JVM内存溢出环境备份方法
线上Tomcat服务内存溢出,且不容易重现,又没配置JMX监控端口,如何在不重启Tomcat的情况下备份堆dump和线程dump,进而分析原因? 因为Tomcat以服务模式运行,直接用JVisualV ...