【笔记】——MySQL数据库
安装数据库
安装SQLyog
操作数据库
MySQL数据管理
DQL数据查询(最重点)
MySQL 函数
事务
索引
权限管理和备份
规范数据库设计
JDBC
安装数据库
哎~ 我的安装可谓是一波三折,顺便把我的安装时遇到的问题跟大家分享一下吧。
跟着我这篇文章一步步安装的话,需要从来没安装过数据库,
或者要把之前安装的数据库没删干净的都要删干净哦~ 具体怎么删干净就百度啦~
1.下载MySQL
这个我跟着狂神一块下的,他推荐下压缩包,这样的话会好一点。
如果是安装包安装的话步骤过于繁琐,而且还会在注册表留下东西,
到时候卸载可能删不干净,可能还会导致新安装的数据库出现问题。
压缩包安装的话就是一整个文件夹全部删掉就好了。
-
5.7版本,稳定版
下载地址:https://dev.mysql.com/downloads/mysql/5.7.html
-
8.0版本,最新版
下载地址:https://dev.mysql.com/downloads/mysql/8.0.html
2.安装
除了C盘,其他空余空间多的盘建个新文件夹,取名自己看得懂知道是数据库就行,建议用英文。下载好的压缩包剪切到刚才的文件夹里,在当前文件夹下解压缩。(下面是我的安装路径当作例子)
3.配置路径
把解压缩后的文件夹打开,进入到bin目录下,复制一下当前的文件路径。
(你自己电脑上的路径按照你自己的来)
然后桌面上>此电脑(右键)>属性>左侧高级系统设置>环境变量>系统变量里找到Path>编辑>新建,然后把刚复制的路径粘贴进去就行了。
4.配置文件
在你的解压缩之后的文件夹里创建一个 my.ini 配置文件。配置如下:
(因为压缩包安装的数据库里没有这个文件,需要自己手动添加一下)
注意:skip-grant-tables(在登陆时可以跳过密码) 这句话在这里先不要注释掉,把前面的 # 删掉先。图片里面有个 data文件夹是接下来会自动生成的,不用自己新建。
- basedir :这里是你自己当前的文件路径,可以跟我这个对照一下。
- datadir :这里是上面那个路径后面再加个\data,目的是把初始的数据库数据放在这里。
文件配置完保存。
5.操作命令台
-
以管理员身份运行 命令台
-
进入到你数据库的bin目录下
-
安装 mysqld -install
我已经安装过了,所以显示已安装。
而出现 Service successfully installed 说明服务已安装成功。
-
初始化数据库
mysqld --initialize-insecure --user=mysql
-
登录数据库
先启动MySQL服务net start mysql
登录MySQLmysql -u root -p
输入完登录指令之后,密码直接不填回车(这里可以不填是因为前面配置my.ini文件里面的跳过密码) -
更新自己的密码
下面括号里的密码你可以设置成自己记得住的,也不一定要123456。注意: 两个版本的更新密码语句是不一样的!
具体为什么会有区分,自己感兴趣的可以去百度查查。
-
5.7版本
update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost';
-
8.0版本
ALTER user 'root'@'localhost' IDENTIFIED BY '123456';
-
刷新权限
flush privileges;
-
退出数据库 exit
-
关闭MySQL服务 net stop mysql
-
将my.ini文件中 的 skip-grant-tables 删除或者#注释掉保存。
-
再启动MySQL服务 net start mysql
-
登录>输入密码(输入的密码不会显示,自己输的时候多注意) 基本上就成功安装了!
安装SQLyog(可视化数据库工具)
这个网上都有,自己找个免费的用一下。
操作数据库
- 操作数据库
- 操作数据库中的表
- 操作数据库中的数据
注:mysq 关键字不区分大小写
操作数据库(了解)
[ ] ->选填,- -是数据库中的注释
-
创建数据库
CREATE DATABASE [IF NOT EXISTS] school;
-
删除数据库
DROP DATABASE [IF EXIST] school;
-
使用数据库
如果你的表名或字段名是一个特殊字符,在操作的时候要加上` `,在tab键上面。 USE `school`;
-
查看数据库
SHOW DATABASES;--查看所有数据库
学习思路:
- 对照SQLyog可视化历史记录查看sql
- 固定的语法或关键字必须要强行记住!
数据库中的数据类型
数值
- tinyint 非常小的数据 1字节
- smallint 较小的数据 2字节
- mediumint 中等大小 3字节
- int 标准的整数 4字节 (常用)
- bigint 较大的数据 8字节
- float 单精度浮点数 4字节
- double 双精度浮点数 8字节(精度问题 )
- decimal 字符串浮点数(一般用于金融计算)
字符串
- char 字符串固定大小 0~255
- varchar 可变字符串 0~65535 (常用)
- tinytext 微型文本 2^8 -1 (写一篇博客差不多)
- text 文本串 2^16 -1 (保存大文本)
时间和日期
- date (YYYY-MM-DD,日期格式)
- time (HH : mm : ss, 时间格式)
- datetime (YYYY-MM-DD HH : mm : ss 最常用的时间格式)
- timestamp (时间戳)
- year 年份
NULL
- 没有值,未知值
- 注意:不要和NULL做运算,结果为NULL
数据库的字段属性 (重点)
Unsigned
- 无符号的整数
- 该数不能声明为负数
zerofill
- 零填充
- 不足位数,用零填充
自增
- 自动在上一条记录上+1(默认)
- 通常来设计唯一的主键,比如 index,必须是整数类型
- 可以在SQLyog里表的高级中自定义设计主键自增的起始值和步长
非空
- not null:如果不赋值则报错!
- null :不填写值则为null!
默认
- 设置默认值
- 如果不指定值,则按照默认值来填写
拓展一下
我现在也不懂这些玩意 0.0,慢慢学吧~
创建数据库表
自己动手跟着敲一敲。
截图自:狂神说Java
-
格式:
-
常用命令:
截图自:狂神说Java
数据库表的类型
类型
- INNODB (当前默认使用的)
- MYISAM (早些年使用的)
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据锁 | 表锁 | 行锁 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间 | 较小 | 较大 |
常规使用操作:
- MYISAM:节省空间,速度较快
- INNODB:安全性高,事务的处理,多表多用户操作
在计算机上存储的位置
截图自:狂神说Java
设置数据库表的字符集编码
截图自:狂神说Java
**注:**不建议在ini文件中添加,如果别人用了你的文件,在其他地方不支持就会出现问题,所以还是建议每个表里都设置一遍。
修改删除表
修改
-- 修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
-- 增加新字段
--ALTER TABLE 表名 ADD 字段名 属性
ALTER TABLE student ADD classmate VARCHAR(11)
--修改表的字段(重命名/修改属性)
--ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE student MODIFY classmate INT(10) --修改属性
--ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[]
ALTER TABLE student CHANGE classmate class VARCHAR(11) --字段重命名、修改属性
--删除表的字段
--ALTER TABLE 表名 DROP 字段名
ALTER TABLE student DROP class
删除
--删除表(如果存在再删除)
DROP TABLE IF EXISTS student
所有的创建和删除操作尽量加上判断,以免报错
注意点:
- 字段名,表名尽量都用 `` (tab键上面那个字符) 引起来
- 注释 单行: – 多行: /**/
- sql关键字大小写不敏感,建议使用小写
- 所有符号全部用英文输入
MySQL数据管理
外键 (了解)
方式一:
截图来自:狂神说Java
例: 用student表里的gradeid 与 grade表里的gradeid,在创建表的时候添加约束(麻烦,比较复杂)
grade表的创建
student表的创建及添加外键
注: 删除有外键的表的时候,要先删除从表(引用的那个表),再删除主表(要删除的表)
方式二:
DML语言(全部记住)
数据库管理语言
数据库意义: 数据存储,数据管理
- insert
- update
- delete
insert
语法:
--插入单个列的单个值
INSERT INTO 表名(`字段名1`) VALUES ('值1')
--插入多个列的单个值
INSERT INTO 表名(`字段名1`,`字段名2`,`字段名3`,...) VALUES ('值1','值2','值3',...)
--插入多个列的多个值
INSERT INTO 表名(`字段名1`,`字段名2`,`字段名3`,...) VALUES ('值1','值2','值3',...),('值1','值2','值3',...)
实例:
注意事项:
- 所有的符号都需要用英文的,多个字段或值之间需要用逗号隔开
- 字段可以省略,但是后面的值必须要全部写完整,写一条完整的记录
- 同时插入多条数据,只需在VALUES后面加上逗号,VALUES(),()
update
语法:
--更新一条数据的一个字段
UPDATE `表名` SET `字段名`='新值' WHERE `条件字段`=值
--更新一条数据的多个字段
UPDATE `表名` SET `字段名1`='新值1',`字段名2`='新值2',... WHERE `条件字段`=值
--更新多条数据多个字段
UPDATE `表名` SET `字段名1`='新值1',`字段名2`='新值2',... WHERE `条件字段`=值 AND `条件`,或者可以使用下面的操作符
条件:where子句的运算符 (部分)
操作符 | 含义 |
---|---|
= | 等于 |
<>或 != | 不等于 |
<、> | 小于/大于 |
<=、>= | 小于等于/大于等于 |
BETWEEN … AND … | 在某个范围内(闭区间) |
AND | 与/&& |
OR | 或 |
NOT | !/非 |
注意点:
- 字段名尽量都带上``
- 条件不写,会修改所有的要修改的字段值
- 要修改的值,可以是具体的值,也可以是变量
delete & truncate
-
delete
语法:DELETE FROME `表名` WHERE 条件
--删除整张表的数据
DELETE FROM `student`
--删除指定记录
DELETE FROM `student` WHERE id=1
-
truncate
语法:TRUNCATE TABLE `表名`
--删除整张表的数据
TRUNCATE TABLE `student`
DELETE & TRUNCATE 异同
- 相同:都能删除数据,都不删除表结构
- 不同点:
- TRUNCATE 自增列的计数器会清零
- TRUNCATE 不会影响事务
拓展了解: DELETE 删除的问题,重启数据库之后
- InnoDB:自增列会从1开始(存在内存中,断电即失)
- MyISAM: 继续从上一个自增量开始(存在文件中,不会丢失)
DQL数据查询(最重点)
(Date Query Language) 数据查询语言
单表查询指定字段
查询指定字段
--查询指定表中的所有字段
SELECT * FROM `表名`
--查询指定表中的指定字段
SELECT `字段名1`,`字段名2`,... FROM `表名`
--查询完之后的结果表不用字段名做列名,可以另起一个别名
SELECT `字段名1` AS 别名1,`字段名2` AS 别名2 FROM `表名` AS 别名
--给表起别名是因为后面会用到很多张表,起个别名会方便很多
--将字符串和查询的内容拼接在一块儿 函数: CONCAT
SELECT CONCAT('要拼接的字符串',`字段名`) AS 别名 FROM 表名
截图自:狂神说Java
去重 distinct
--在查询语句 SELECT 后面加上 DISTINCT
SELECT DISTINCT `字段名` FROM 表名
数据库的列 (表达式)
截图自:狂神说Java
这些表达式堆积起来↓
查询语句的完整形式:(顺序不能乱)
Select [select选项] 字段列表[字段别名]
from 数据源
[where 字句]
[group by子句 ]
[having 子句]
[order by 子句]
[limit 子句]
where 子句
逻辑运算符
前面有写过:点我去看看
模糊查询:比较运算符
截图自:狂神说Java
-
Like
-
In
-
NULL & NOT NULL
联表查询
Join
最核心的三种联表查询:
操作 | 含义 |
---|---|
Left Join(左连接) | 返回左表(table1)中的所有记录,即使右表(table2)中没有匹配的记录也是如此。当右表中没有匹配的记录时,LEFT JOIN 仍然返回一行,只是该行的左表字段有值,而右表字段以 NULL 填充 |
Inner Join(内连接) | 当连接的两个或者多个表中都存在满足条件的记录时,才返回行 |
Right Join(右连接) | 右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行 |
狂神的小例子 两表查询:
因为联表查询需要两个表至少有一个相关联的字段,这样的话查询的时候如果要查这个相同的字段难免会产生歧义,所以这里给表名取了新的别名。
下面的是👇上面查询语句的实现,结果咱就不放了嗷,表格数据太多了我就用视频里的了。
-
Inner Join
-
Right Join
要查询的是参加考试的同学,而只有考试了的学生有成绩,所以就右查询 result 成绩表,满足有成绩的学生才能被查出来。
-
Left Join
用Left Join也可以查询出结果,但是如果有同学没有参加考试也能被查出来(只不过没有成绩,成绩为NULL),因为左查询查的是左表 student ,只要是满足studentNO的学生信息都会被查出来。
-
WHERE 和 ON
- JOIN ON (连接查询) 这两个是一块用的,使用的时候尽量用这个
- WHERE (等值查询 )
下面这个是狂神
总结的表格👇
狂神的小例子 三表查询:
这里查询的思路是:先前两个表进行联表查询,得出来的结果表数据再和第三张表进行联表查询。
自连接(了解)
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
分页和排序
order by
- 升序: ASC
- 降序 :DESC
语法:
ORDER BY 字段名 升/降序
limit
语法:
LIMIT 值1,值2
LIMIT 0,5 --从第一个数据开始,一页显示五个数据
- 值1 -->要显示的数据下标
- 值2–>一页显示几个数据
拓展:
我觉得前期按照sql语句的完整格式来照着写还是说不容易出错的,慢慢练
子查询
查阅自:https://www.w3cschool.cn/sql/zjdc1oz3.html
子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。
子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。
子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。
使用子查询必须遵循以下几个规则:
-
子查询必须括在圆括号中。
-
子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与 子查询选中的列相比较。
-
子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。
-
返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。
-
SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
-
子查询不能直接用在聚合函数中。
-
BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。
截图自:狂神说Java
- 第一个写法比较基础,简单的两表查询
- 第二个写法用了子查询
- 第三个写法在第二个的基础上再精简了一下
- 查询的顺序是由里到外
分组和过滤
- GROUP BY
- HAVING
SELECT 小结
截图自:狂神说Java
MySQL 函数
MySQL官方函数与操作符文档:
https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html
常用函数
截图自:狂神说Java
聚合函数(常用)
截图自:狂神说Java
其他的函数再官方文档里都有,要用的时候可以自己去查一下
数据库级别的 MD5 加密(拓展)
截图自:狂神说Java
事务
事务原则 ACID原则
关于事务原则的解读,可以去看看别人写的博客来理解一下
我找的一个还不错分享一下:
https://cloud.tencent.com/developer/article/1594690
-
原子性
两个事务执行后,要么都成功,要么都失败。(不可分割) -
一致性
-
隔离性
-
持久性
隔离导致的一些问题
- 脏读
- 不可重复读
- 幻读
转账的小例子
这套流程走下来再Java里是个函数👇
- 关闭自动提交:SET autocommit = 0
- 开启事务 START TRANSACTION
- 事务…
- 手动提交事务:COMMIT
- 回滚:ROLLBACK ,若提交事务失败,则可以回滚到提交前的状态,若提交事务成功,则无法回滚(持久性)。
- 恢复自动提交:SET autocommit = 1
索引
作用:加快检索表中数据
索引的分类
截图自:狂神说Java
基础语法:
创建索引:
1. 建表的时候创建
2. ALTER 添加,上面图片中有语法
3. CREATE INDEX 索引名 ON 表名(字段名)
索引原则
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
阅读
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
用户管理
yog可视化操作
sql命令操作
用户表:mysql.user
本质:对这张表增删改查
MySQL备份
截图自:狂神说Java
规范数据库设计
为什么要设计
截图自:狂神说Java
三大范式
为什么需要数据规范化?
- 信息重复
- 更新异常
- 插入异常
- 无法正常显示信息
- 删除异常
- 丢失有效信息
三大范式
-
第一范式(1NF)
(要求数据库表的每一列都是不可再分的原子数据项 (原子性) ) -
第二范式(2NF)
前提:满足第一范式
(每张表的列都要和主键相关)
**自我理解:**淘宝买东西,你下了个订单,有个订单号,你这一个订单号里可能会包含一个或者多个商品,而每个商品都有不同的属性,所以下单时间也一样的。你也可能是一个或多个商品分开买的,有多个订单号,不同时间购买的。所以你想要找到你买的商品必须要把订单号和商品属性都绑在一块,放在同一张表里,他们是有关联的。而购买时间可能是一样的,所以可以放在另外一张表里,用订单号去匹配下单时间。可以参照下面的图看看👇
截图自网络侵删
-
第三范式(3NF)
前提:满足第一和第二范式
(确保数据表中的每一列数据都和主键直接相关,而不能间接相关,用来消除传递函数依赖,形成表的强连接性)
JDBC(重点)
数据库驱动和JDBC
安装数据库驱动:
我的是5.7版本的MySQL,我装了相应版本的驱动,官方链接里面可以选版本,按自己的数据库版本来好了。
MySQL官网数据库驱动下载:https://downloads.mysql.com/archives/c-j/
第一个JDBC程序
-
创建一个Java项目
-
再项目文件夹下创建一个lib文件夹,把下载的驱动里的
mysql-connector-java-5.1.47.jar 这个包复制到lib文件夹里。
然后倒数第四个点一下👇 ,添加到目录
-
创建一个类(用于连接数据库)
-
写程序
package jdbcDemo1;
import java.sql.*;
public class JdbcTest {
public static void main(String arg[]) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动
//2.用户信息和url
// useUnicode=true 支持中文字符集
// characterEncoding=utf8 字符编码为utf8
// useSSL=true 安全检测,这里可能会报错,如果报错了改一下为false试试
// localhost:3306/school 服务器名:端口号/数据库名
String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true";
String name = "root";
String password = "123456";
//3.连接成功,数据库对象 connection 代表数据库
Connection connection = DriverManager.getConnection(url, name, password);
//4.执行sql的对象 Statement 不安全
Statement statement = connection.createStatement();
//5.用对象 statement 去执行sql语句
String sql = "SELECT * FROM user";
ResultSet resultSet = statement.executeQuery(sql);//执行并返回结果集,是个链表
while(resultSet.next()) {
System.out.println("id=" + resultSet.getObject("id"));
System.out.println("name=" + resultSet.getObject("name"));
System.out.println("age=" + resultSet.getObject("age"));
System.out.println("======================================");
}
//释放连接
resultSet.close();
statement.close();
connection.close();
}
}
DriverManager
数据库对象 connection 也可以来执行事务的一些操作
- onnection.setAutoCommit();
- connection.commit();
- connection.rollback();
Statement 对象
- statement.executeQuery(sql语句); 执行查询语句
- statement.execute(); 所有的sql语句都能执行,有判断,效率稍低
- statement.executeUpdate(sql语句); 执行更新、插入、删除语句,返回一个受影响的行
- statement.executeBatch(); 可以执行一组语句
ResultSet 查询的结果集
获取指定的数据类型:
遍历,指针:
释放资源
Statement 对象详解 及JDBC程序修改
代码修改
- 提取工具类
package jdbcDemo2.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String userName = null;
private static String password = null;
static {
try {
//加载properties文件
InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
//加载 properties 文件流
Properties properties = new Properties();
properties.load(resourceAsStream);
//获取 properties 值
driver = properties.getProperty("driver");
url = properties.getProperty("url");
userName = properties.getProperty("userName");
password = properties.getProperty("password");
//加载驱动,只用加载一次
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,userName,password);
}
//释放资源
public static void release(Connection connection,Statement statement, ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
properties 文件👇
- 测试 sql语句
package jdbcDemo1;
import jdbcDemo2.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestInsert {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//连接数据库
connection = JdbcUtils.getConnection();
//获取数据库对象
statement = connection.createStatement();
//执行sql插入语句
String sql = "INSERT INTO user(id,name,age) VALUES(5,'Lucas',40)";
int i = statement.executeUpdate(sql);
if (i > 0) {
System.out.println("操作成功!");
}
/*
* 执行sql查询语句
* String sql1 = "SELECT * FROM user";
resultSet = statement.executeQuery(sql1);
if (resultSet.next()){
resultSet.getInt("id");
resultSet.getString("name");
}
*/
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
JdbcUtils.release(connection,statement,resultSet);
}
}
}
PreparedStatement 对象
截图自:百度百科
SQL注入问题:
PreparedStatement 可以防止SQL注入,效率更高!
语法结构:
//sql 语句先用?当作占位符先写上去,参数后面手动赋值
Connection connection = null;
PreparedStatement statement = null;
String sql = "insert into user(id,name,age) values(?,?,?)";
statement = connection.PreparedStatement(sql);//预编译一下
//(参数1:代表问号的下标,从一开始。参数2:问号的值)
statement.setInt(1,6);//传递参数
statement.executeUpdate();//执行
IDEA 连接数据库
-
打开IDEA
-
创建一个Java项目
-
在IDEA页面右侧边栏有个database,点击展开,点击+号新建 Data source 选择 MySQL。
进来就是这个界面,跟SQLyog差不多 -
根据图示,输入账号密码就可以登录到你自己创的本地数据库了。我的数据库是5.7版本,所以我的驱动是5.1,如果是8以上的就安装相应的驱动。安装好后测试一下连接没问题就 apply 连接。
驱动可以在👇下面的图里所示的地方下,也可以在官网下,我上面有写
点我去看看 -
连接成功后选择自己想要的数据库,点击加号旁边那个进去选好后apply
-
在右边打开自己的数据库,点击想要的表就可以了
-
这里是写sql的控制台,和切换表的地方
JDBC操作事务
package jdbcDemo1;
import jdbcDemo2.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcAffair {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try{
//连接数据库
connection = JdbcUtils.getConnection();
//关闭数据库自动提交,自动开启事务
connection.setAutoCommit(false);//开启事务
String sql1="更新语句";
statement = connection.prepareStatement(sql1);
statement.executeUpdate();
String sql2="更新语句";
statement = connection.prepareStatement(sql2);
statement.executeUpdate();
//业务完成,提交事务
connection.commit();
}catch(Exception e) {
//提交失败,回滚至执行前
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}finally {
JdbcUtils.release(connection,statement,resultSet);
}
}
}
JDBC 连接池
- 介绍:
截图自百度百科
- 原理:
- Java开源的数据库连接池:
-
C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate 一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
-
Druid
-
Jakarta DBCP:DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池。DBCP可以直接的在应用程序中使用。
DBCP jar包下载:
http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
http://commons.apache.org/proper/commons-pool/download_pool.cgi
C3P0 jar包下载:
https://sourceforge.net/projects/c3p0/
这里C3P0 和 DBCP 都比较老了,大概知道怎么用就行了,后面我会去学Druid,所以这俩老的就不花太多时间了。
以上就是我在跟着狂神学数据库时的一些笔记、感悟和分享,若其中有错请大家多多指正,互相交流。