【Java学习笔记】——MySQL数据库

【笔记】——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.操作命令台

  1. 以管理员身份运行 命令台

  2. 进入到你数据库的bin目录下
    在这里插入图片描述

  3. 安装 mysqld -install
    我已经安装过了,所以显示已安装。
    而出现 Service successfully installed 说明服务已安装成功。
    在这里插入图片描述

  4. 初始化数据库

     mysqld --initialize-insecure --user=mysql
    
  5. 登录数据库
    先启动MySQL服务

     	 net start mysql
    

    在这里插入图片描述
    登录MySQL

      mysql -u root -p
    

    在这里插入图片描述
    输入完登录指令之后,密码直接不填回车(这里可以不填是因为前面配置my.ini文件里面的跳过密码)

  6. 更新自己的密码
    下面括号里的密码你可以设置成自己记得住的,也不一定要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';
    
  1. 刷新权限

     flush privileges;		
    

    在这里插入图片描述

  2. 退出数据库 exit

  3. 关闭MySQL服务 net stop mysql

  4. my.ini文件中 的 skip-grant-tables 删除或者#注释掉保存。

  5. 再启动MySQL服务 net start mysql

  6. 登录>输入密码(输入的密码不会显示,自己输的时候多注意) 基本上就成功安装了!
    在这里插入图片描述


安装SQLyog(可视化数据库工具)

这个网上都有,自己找个免费的用一下。
在这里插入图片描述


操作数据库

  1. 操作数据库
  2. 操作数据库中的表
  3. 操作数据库中的数据
    注:mysq 关键字不区分大小写

操作数据库(了解)

[ ] ->选填,- -是数据库中的注释

  1. 创建数据库

     CREATE DATABASE [IF NOT EXISTS] school;
    
  2. 删除数据库

     DROP DATABASE [IF EXIST] school;
    
  3. 使用数据库

     如果你的表名或字段名是一个特殊字符,在操作的时候要加上` `,在tab键上面。
     USE `school`;
    
  4. 查看数据库

     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 (早些年使用的)
MYISAMINNODB
事务支持不支持支持
数据锁表锁行锁
外键约束不支持支持
全文索引支持不支持
表空间较小较大

常规使用操作:

  • 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 

所有的创建和删除操作尽量加上判断,以免报错

注意点:

  1. 字段名,表名尽量都用 `` (tab键上面那个字符) 引起来
  2. 注释 单行: – 多行: /**/
  3. sql关键字大小写不敏感,建议使用小写
  4. 所有符号全部用英文输入

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',...)

实例:
在这里插入图片描述
注意事项:

  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!/非

注意点:

  1. 字段名尽量都带上``
  2. 条件不写,会修改所有的要修改的字段值
  3. 要修改的值,可以是具体的值,也可以是变量

delete & truncate

  • delete

      语法:DELETE FROME `表名` WHERE 条件
    
--删除整张表的数据
DELETE FROM `student`

--删除指定记录
DELETE FROM `student` WHERE id=1
  • truncate

      语法:TRUNCATE TABLE `表名`
    
--删除整张表的数据
TRUNCATE TABLE `student`

DELETE & TRUNCATE 异同

  • 相同:都能删除数据,都不删除表结构
  • 不同点:
    1. TRUNCATE 自增列的计数器会清零
    2. 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

语法:

LIMIT1,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
    
  1. 第一个写法比较基础,简单的两表查询
  2. 第二个写法用了子查询
  3. 第三个写法在第二个的基础上再精简了一下
  4. 查询的顺序是由里到外
    在这里插入图片描述

分组和过滤

  • 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
  • 原子性
    两个事务执行后,要么都成功,要么都失败。(不可分割)

  • 一致性

  • 隔离性

  • 持久性

隔离导致的一些问题

  1. 脏读
  2. 不可重复读
  3. 幻读

转账的小例子

在这里插入图片描述
这套流程走下来再Java里是个函数👇
在这里插入图片描述

  1. 关闭自动提交:SET autocommit = 0
  2. 开启事务 START TRANSACTION
  3. 事务…
  4. 手动提交事务:COMMIT
  5. 回滚:ROLLBACK ,若提交事务失败,则可以回滚到提交前的状态,若提交事务成功,则无法回滚(持久性)。
  6. 恢复自动提交: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程序

  1. 创建一个Java项目

  2. 再项目文件夹下创建一个lib文件夹,把下载的驱动里的
    mysql-connector-java-5.1.47.jar 这个包复制到lib文件夹里。
    在这里插入图片描述
    然后倒数第四个点一下👇 ,添加到目录

  3. 创建一个类(用于连接数据库)

  4. 写程序

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 查询的结果集

获取指定的数据类型:
狂神说Java
遍历,指针:在这里插入图片描述

释放资源

在这里插入图片描述

Statement 对象详解 及JDBC程序修改

在这里插入图片描述

代码修改

  1. 提取工具类
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 文件👇
在这里插入图片描述

  1. 测试 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 连接数据库

  1. 打开IDEA

  2. 创建一个Java项目

  3. 在IDEA页面右侧边栏有个database,点击展开,点击+号新建 Data source 选择 MySQL。
    在这里插入图片描述
    进来就是这个界面,跟SQLyog差不多在这里插入图片描述

  4. 根据图示,输入账号密码就可以登录到你自己创的本地数据库了。我的数据库是5.7版本,所以我的驱动是5.1,如果是8以上的就安装相应的驱动。安装好后测试一下连接没问题就 apply 连接。
    在这里插入图片描述
    驱动可以在👇下面的图里所示的地方下,也可以在官网下,我上面有写
    点我去看看

    在这里插入图片描述

  5. 连接成功后选择自己想要的数据库,点击加号旁边那个进去选好后apply
    在这里插入图片描述

  6. 在右边打开自己的数据库,点击想要的表就可以了
    在这里插入图片描述

  7. 这里是写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开源的数据库连接池
  1. C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate 一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。

  2. Druid
    在这里插入图片描述

  3. 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,所以这俩老的就不花太多时间了。


以上就是我在跟着狂神学数据库时的一些笔记、感悟和分享,若其中有错请大家多多指正,互相交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值