- 数据库
- 1.mysql安装
- 2.数据库命令
- 3.操作数据库
- 3.1、操作数据库(了解)
- 3.2、数据库的列类型
- 3.3、数据库的字段属性(重点)
- 3.4、创建数据库表(重点)
- 3.5、数据库引擎
- 3.6、修改删除表
- 4.mysql数据管理(重点)
- 4.1、外键
- 4.2、DML语言(重点)
- 4.3、添加
- 4.4、修改
- 4.5、删除
- 5.查询数据(最为重要)
- 4.1、指定查询字段(简单查询)
- 4.2、where条件子句
- 4.3、联表查询(重难点)
- 4.4、分页和排序
- **4.5、子查询**
- 4.6、分组和过滤
- 6.MySQL函数
- 6.1、常用函数
- 6.2、聚合函数(常用函数)
- 6.事务(重点)
- 6.1、什么是事务
- 7.索引
- 7.1、索引的分类
- 7.2、测试索引
- 7.3、索引原则
- 8.权限管理和备份
- 8.1、用户管理
- 8.2、MySQL备份
- 9.规范数据库设计
- 9.1、三大范式
- 10.JDBC(重点)
- 10.1、数据库驱动
- 10.2、第一个JDBC程序
- 10.3、使用idea内部连接数据库
这里看狂神数据库视频加公众号
2.数据库命令初步,后面会接触更多
mysql -uroot -p123456 --连接数据库 show databases; --查看所有的数据库 mysql> use school -- 切换数据库 use后加 数据库名 database change --出现的提示 show tables; --查看数据库中的所有的表 describe student; --这里student是你创建的表 create datebase westos; -- 创建一个数据库 exit; --退出连接 --为注释3.操作数据库
操作数据库>操作数据库中的表>操作数据库表中的数据
3.1、操作数据库(了解)1.创建数据库
中括号代表可选可不选
CREATE DATAbase [IF NOT EXISTS] westos
2.删除数据库
DROp DATAbase [IF EXISTS] westos
3.使用数据库
这里如果你的表名或者字段名是一个特殊字符,就需要带``(在ta键上面)
USE `school`
4.查看数据库
SHOW DATAbaseS3.2、数据库的列类型
数值(一般用int)
- tinyint 十分小的数据 1个字节
- smallint 较小的数据 2个字节
- int 标准数据 4个字节
- big 较大的数据 8个字节
- float 单精度浮点数 4个字节
- double 双精度浮点数 8个字节
- decimal 字符串形式的浮点数 (因为精度问题及金融上一般使用)
字符串(一般用varchar,text)
- char 字符串固定大小 0-255
- varchar 可变的字符串 0-65535
- tinytext 微型文本 2^8-1
- text 文本串 2^16-1
时间日期
- data YYYY-MM-DD,日期
- time HH:mm:ss, 时间
- datatime YYYY-MM-DD HH:mm:ss 最常用的时间格式
- timestamp 时间戳 1970.1.1到现在的毫秒数,较为常用
- year 年份表示
null
- 没有值,未知
- 不要用null计算
Unsigned:
- 无符号的整数
- 声明了该列不能为负数
zerofill:
- 0填充
- 不足的位数,使用0来填充
自增:
- 通常理解为自增,自动在上一条记录的基础上+1(默认)
- 通常用来设置唯一主键,index,必须是整数类型
- 可以自定义设置主键自增的起始值和步长
非空:
- 设置后就是在空内必须给他赋值,如果不赋值默认为""表面上看为空
默认:
- 设置默认的值
- 如果不设置默认则默认为(null)
注意点:
- 使用英文括号,表的名称和字段尽量使用``括起来
- auto_increment 自增
- 字符串使用单引号括起来’’
- 所有语句后面加, 最后一个不用加
- primary key 主键,一般写到结尾,且只有一个
CREATE TABLE IF NOT EXISTS `student`( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号', `name` VARCHAR(10) NOT NULL DEFAULT '匿名' COMMENT '名字', `psw` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码', `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别', `birthday` DATETIME DEFAULT NULL COMMENT '生日', `address` VARCHAR(20) DEFAULT NULL COMMENT '地址', `email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8`student`
格式:
CREATE TABLE [IF NOT EXISTS] `表名`(
`字段名` 列类型 [属性][索引][注释],
`字段名` 列类型 [属性][索引][注释],
`字段名` 列类型 [属性][索引][注释],
.......
`字段名` 列类型 [属性][索引][注释]
) [表类型][表字符集设置][注释]
常用命令:
SHOW CREATE DATAbase school -- 查看创建数据库的语句 SHOW CREATE TABLE student -- 查看数据表的定义语句 DESC student -- 显示表的结构3.5、数据库引擎
INNODB:默认使用
MYISAM:早些年曾使用
| MYISAM | INNODB | |
|---|---|---|
| 事务支持 | 不支持 | 支持 |
| 数据行锁定 | 不支持 | 支持 |
| 外键约束 | 不支持 | 支持 |
| 全文索引 | 支持 | 不支持 |
| 表空间大小 | 较小 | 较大,约为myisam2倍 |
常规使用操作:
- myisam 节约空间,速度较快
- innodb 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置
所有数据库文件都存在data文件下,一个文件夹就对应一个数据
本质还是文件的存储
mysql引擎在物理文件下的区别
- innoDB在数据库表中只有一个*.frm,以及上级文件下的ibdata1文件
- MYISAM对应文件
- *.frm 表结构定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
修改
-- 修改表名:ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
-- 增加表的字段:ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(11)
-- 修改表字段:ALTER TABLE 表名 MODIFY 字段名 新的列属性
ALTER TABLE teacher1 MODIFY age VARCHAR(11)-- 修改约束
-- 重命名
ALTER TABLE teacher1 CHANGE age age1 INT(2)-- 重命名
-- 删除表字段
ALTER TABLE teacher1 DROP age1
删除
-- 删除表 DROP TABLE IF EXISTS teacher1
所有创建和删除操作尽量加上判断,以免报错
4.mysql数据管理(重点) 4.1、外键这里提前创建了两个表,一个名为student,一个名为grade,两个表中均有gradeid。
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`); -- ALTER TABLE 表 ADD ConSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 引用的表(引用的字段)
以上操作为物理外键,数据库级别的的外键,不建议使用
4.2、DML语言(重点)DML语言:数据操作语言
- insert
- update
- delete
insert
insert into 表名([字段1],[字段2],[字段3]) values ('值1','值1','值1'),('值2','值2','值2')
注意:
- 字段和字段之间使用 英文逗号 隔开
- 字段是可以省略的,但是后面的值必须要一一对应,也就是字段对应的值都要写。
- 可以同时插入多条数据,values后面的值,需要使用逗号隔开即可
update
update 表名 set 列名[用逗号隔开可以设置多个属性]=value where 条件
条件为自己设置值
特殊条件:
BETWEEN…AND…在什么到什么范围
可以设置为多个条件,用and或or连接
4.5、删除delete
DELETE FROM 表名 WHERe 条件
TRUNCATE 删库跑路
完全清空一个数据库表,表的结构和索引不会变
TRUNCATE 表名
delete 和 TRUNCATE区别
- TRUNCATE 重新设置自增列 计数器会归零
- TRUNCATE 不会影响事务
SELECT [ALL | DISTINCT]
{* |table.*|[table.field1[as alias1][table.field2[as.alias2]][...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] --联合查询
[WHERe ...] ---指定结果满足的条件
[GROUP BY...] ---指定结果按照那几个分段来分组
[HAVINg] ---过滤分组的记录必须满足的次要条件
[ORDER BY ...] ---指定查询记录按一个或多个条件排序
[LIMIT {[offect,]row_count | row_countOFFSET offset}];
---指定查询的记录是从哪条至那条
顺序按照严格语法要求
SELECt 字段 FROM `表`
例:
SELECt `studentId` AS `学号`,`studentName` AS `姓名` FROM `student` AS `学生`
可以给字段和表起别名,格式 :旧名字 as 新名字
函数:concat(a,b),拼接,将自己加的和字段名加起来。
SELECt CONCAT('姓名: ',studentName) AS `新名字` FROM `student`
去重 distinct,去除重复字段
SELECt DISTINCT `字段名 FROM `表名`4.2、where条件子句
作用:检索数据中符合条件的值
搜索条件有一个或多个表达式组成!返回一个布尔值
逻辑运算符
| 运算符 | 语法 | 描述 |
|---|---|---|
| and | a and b | 逻辑与,两个都为真,为真 |
| or | a or b | 逻辑或,其中一个为真,结果为真 |
| not | not a | 逻辑非,真为假假为真 |
SELECt `字段名` FROM `表名` WHERe 字段名 范围
模糊查询:比较运算符
| 运算符 | 语法 | 描述 |
|---|---|---|
| IS NULL | a is null | 如果操作符结果为null,结果为真 |
| IS NOT NULL | a is not null | 如果操作符不为null,结果为真 |
| BETWEEN | a between b and c | 若a在b和c之间,则结果为真 |
| Like | a like b | sql匹配,如果a匹配b,则结果为真 |
| in | a in(a1,a2,a3…) | 假设a在a1或者a2…其中的某一个值中,结果为真 |
like:
SELECt `字段名`,`字段名` FROM `表名` WHERe `字段名` LIKE '张%'
查询字段名形如张xx(张后面可以有任意个字符),%代表0-任意个字符,_代表一个字符
in:
SELECt `字段名`,`字段名` FROM `表名` WHERe `字段名` IN (条件,条件)
查询字段符合条件的,in中加条件。(注意条件必须为具体的值)
4.3、联表查询(重难点)JOIN 对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBwKYY1G-1641207355122)(C:Users86153Desktop图片七种join理论.png)]
INNER JOIN:
对于两个表中共有的字段,只能显示共有的结果,比如:两个表中都有studentid,这个字段,这两个字段中的内容有的相同,有的不同,只显示出相同的部分。
对于两个表中不共有的字段,即一个表中有这个字段另一个没有则可将这个字段的内容全部显示出来全部显示出来。(前提是要求查询的字段)
LEFT JOIN:
对于两个表中共有的字段,显示共有部分与左表中字段独有内容
即左表中这个字段的全部内容。
其余不共有的字段与INNER JOIN 一样。
RIGHT JOIN:
类似于LEFT JOIN 但只显示右表中这个字段的全部内容
查询多个表时:
SELECt s.studentId,studentName,`subjectName`,`studentScore` FROM `student` s RIGHT JOIN `result` r ON s.studentId = r.studentId LEFT JOIN `subject` t ON t.subjectId = r.subjectId
要衔接多个表时只需在后面继续写,找相同字段。
自连接
将一张表看成两张表来比较
4.4、分页和排序排序
ORDER BY `字段` DESC(降序)[ASC(升序)]
分页
limit 起始下标,分页大小4.5、子查询
where (这个值是计算出来的)
本质:在where语句中嵌套一个子查询语句
SELECt `字段`,`字段`,`字段`FROM `表`WHERe `字段` = (SELECt `字段` FROM `另一个表`)ORDER BY 字段 DESC //递减
–这里不是太理解,选择性跳过
4.6、分组和过滤这里先看下面的聚合函数
查询不同课程的平均分,最高分,最低分,平均值大于80SELECt `subjectName`,MAX(`studentScore`),MIN(`studentScore`),AVG(`studentScore`) AS 平均分FROM `result` rINNER JOIN `subject` subON r.subjectId = sub.subjectIdGROUP BY r.`subjectId` --通过字段来分组HAVINg 平均分>80
这里group by 是将数据根据subjectId字段分组,否则上面成绩的最大平均最小都为所有成绩的只能显示一行,通过group by能让数据根据分组取值
6.MySQL函数 6.1、常用函数-- 数学运算
SELECt ABS(-8) -- 绝对值
SELECT CEILING(9.4)-- 向上取整
SELECT FLOOR(9.4)-- 想下取整
SELECT RAND() -- 返回一个0~1之间的随机数
SELECT SIGN(-850) -- 返回参数的符号
-- 字符串
SELECT CHAR_LENGTH('') -- 返回字符串长度
SELECT CONCAT('','') -- 拼接字符串
其他函数类似如此,详情请看参考手册
6.2、聚合函数(常用函数)| 函数名称 | 描述 |
|---|---|
| COUNT() | 计数 |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() | 最大值 |
| MIN() | 最小值 |
| … | … |
count:
-- 都能统计表中有多少个记录 SELECT COUNT(`字段名`) FROM `表名` -- count(字段),会忽略所有的null SELECt COUNT(*) FROM `表名` -- count(*),不会忽略null值 SELECt COUNT(1) FROM `表名` -- count(1),不会忽略null值,*和1本质都为计算行数
sum:
SELECt SUM(`字段`) AS 成绩总和 FROM `表`
avg:
SELECt AVG(`字段`) AS 成绩平均 FROM `表`
max:
SELECt MAX(`字段`) AS 最高分 FROM `表`
min:
SELECt MIN(`字段`) AS 最低分 FROM `表`6.事务(重点)
mysql默认开启事务自动提交的
SET autocommit = 0 -- 关闭自动提交SET autocommit = 1 -- 开启自动提交(默认)6.1、什么是事务
事务原则:ACID原则 原子性,一致性,隔离性,持久性 (脏读,幻读…)
参考博客链接:
https://blog.csdn.net/dengjili/article/details/82468576
原子性(Atomicity)
要么发生,要么不发生(要么都成功,要么都失败)
一致性(Consistency)
事务前后的数据完整性要保证一致,比如数据交换总共是1000,那就不会变。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability) —事务提交
事务一旦被提交则不可逆,被持久化到数据库中
执行事务(主要流程)
-- 手动开启事务 SET autocommit = 0 -- 关闭自动提交(第一步) -- 事务开启 START TRANSACTION -- 标记一个事务的开始,从这个之后的sql 都在同一个事务中 INSERT xx -- 中间要做的事情 INSERT xx -- 提交:持久化(成功) COMMIT -- 回滚:回到原来的样子(失败) ROLLBACK -- 事务结束 SET autocommit = 1 -- 开启自动提交 (最后一步)
在其中可以设置保存点来控制流程
-- 了解 SAVEPOINT 保存点名 -- 设置一个事务的保存点 ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点 RELEASE SAVEPOINT 保存点名 -- 撤销保存点
模拟场景
-- 转账例子
CREATE DATAbase shop CHARACTER SET utf8 COLLATE utf8_general_ci -- 创建数据库
USE shop
-- 创建表
CREATE TABLE `account`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 插入数据
INSERT INTO `account`(`name`,`money`)
VALUES ('A',2000.00),('B',10000.00)
-- 模拟转账:事务
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION -- 开启事务(一组事务)
UPDATe `account` SET money=money-500 WHERe id=1 -- 更新A的钱转出500
UPDATE `account` SET money=money+500 WHERe id=2 -- 更新B的钱转入500
COMMIT -- 提交事务,被持久化了
ROLLBACK -- 回滚事务
SET autocommit = 1; -- 开启自动提
7.索引
7.1、索引的分类
-
主键索引 PRIMARY KEY
- 唯一的标识,主键不可重复
-
唯一索引 UNIQUE KEY
- 避免重复的列出现,唯一索引可以有多个
-
常规索引 KEY/INDEX
- 默认的,index,key关键字来设置
-
全文索引 FullText
- 在特定的数据引擎下才有,myisam
基础语法
-- 索引的使用 -- 1.在创建表的时候给字段增加索引 -- 2.创建完毕后,增加索引 -- 显示所有的索引信息 SHOW INDEX FROM student -- 增加一个索引 ALTER TABLE `student` ADD FULLTEXT INDEX `studentname` (`studentname`); -- EXPLAIN 分析sql执行的情况 EXPLAIN SELECt * FROM `student` -- 非全文索引 EXPLAIN SELECt * FROM student WHERe MATCH(studentName) AGAINST('刘')
-- 创建表 CREATE TABLE `app_user` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) DEFAULT '' COMMENT '用户昵称', `email` VARCHAR(50) NOT NULL COMMENT '用户邮箱', `phone` VARCHAR(20) DEFAULT '' COMMENT '手机号', `gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男生;1:女生)', `password` VARCHAR(50) NOT NULL COMMENT '密码', `age` TINYINT(4) DEFAULT '0' COMMENT '年龄', `create time` DATETIME DEFAULT CURRENT_TIMESTAMP, `update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表' -- 插入100万条数据 DROP FUNCTION IF EXISTS mock_data; DELIMITER $$ -- 写函数之前必须要写 CREATE FUNCTION mock_data() RETURNS INT DETERMINISTIC BEGIN DECLARE num INT DEFAULT 1000000; DECLARE i INT DEFAULT 0; WHILE i这里先创建了一个app_user的表,之后在表中插入了100万条数据,然后通过查找来比较有无索引的速度区别。
索引在小数据量的时候用处不大,但是在大数据的时候,区别十分明显。
这里我自己对索引的理解为:索引相当于目录的作用,通过目录的查找比按照书逐页查找快的多。
7.3、索引原则
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
索引的数据结构
Hash类型的索引
Btree:innoDB的默认索引
8.权限管理和备份 8.1、用户管理sql命令
用户表:mysql/user
本质:对这张表进行改变
-- 创建用户 CREATE USER 用户名 IDENTIFIED BY '密码' CREATE USER liu IDENTIFIED BY '123456' -- 修改密码 (修改当前用户密码) SET PASSWORD = PASSWORd('新密码') SET PASSWORD = PASSWORD('111111') -- 重命名 RENAME USER 旧名字 TO 新名字 RENAME USER liu TO liuyue -- 用户授权 GRANT ALL PRIVILEGES 全部的权限 TO 名字 GRANT ALL PRIVILEGES ON *.* TO liuyue -- 查询权限 SHOW GRANTS FOR 用户 SHOW GRANTS FOR liuyue ......8.2、MySQL备份方式:
9.规范数据库设计
- 直接拷贝物理文件
- 在可视化工具中手动导出
- 使用命令行导出 mysqldump命令行使用
- 分析需求:分析业务和需要处理的数据库的需求
- 概要设计:设计关系图
步骤(例:个人博客):
9.1、三大范式
- 收集信息,分析需求
- 用户表(用户登录注销,用户的个人信息,写博客,创建分类)
- 分类表(文章分类,谁创建的)
- 文章表(文章的信息)
- 友链表(友链信息)
- 自定义表(系统信息,某个关键的字,或者一些主字段)
- 标识实体(把需求落地到每个字段)
- 标识实体之间的关系
为什么需要数据规范化?
- 信息重复
- 更新异常
- 插入异常
- 无法正常显示信息
- 删除异常
- 丢失有效信息
三大范式
第一范式:
原子性:保证每一列不可再分
第二范式:
前提:满足第一范式
每张表只描述一件事情
第三范式:
前提:满足第一范式和第二范式
确保数据表中的每一列数据都和主键直接相关,而不能间接相关
规范性 和 性能的问题
关联查询的表不得超过三张表
10.JDBC(重点) 10.1、数据库驱动
- 考虑商业化的需求和目标,(成本,用户体验!)数据库的性能更加重要
- 在规范性能的问题的时候,需要适当的考虑一下 规范性!
- 故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
驱动:声卡,显卡,数据库
java.sql
javax.sql
还需要导入一个数据库驱动包
mysql-connector-java-5.1.47
10.2、第一个JDBC程序
- 首先创建数据库
CREATE DATAbase `jdbcStudy` CHARACTER SET utf8 COLLATE utf8_general_ci; USE `jdbcStudy`; CREATE TABLE `users`( `id` INT PRIMARY KEY, `NAME` VARCHAR(40), `PASSWORD` VARCHAR(40), `email` VARCHAR(60), birthday DATE ); INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`) VALUES('1','zhangsan','123456','zs@sina.com','1980-12-04'), ('2','lisi','123456','lisi@sina.com','1981-12-04'), ('3','wangwu','123456','wangwu@sina.com','1979-12-04')
- 编写测试代码
package com.liu.lesson01; import com.mysql.jdbc.Driver; import java.sql.*; public class JDBCFirstDemon { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动 //2.连接信息 //useUnicode=true&characterEncoding=utf8&useSSL=true String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true"; String username = "root"; String password = "123456"; //3.连接成功,返回数据库对象 connect代表数据库 Connection connection = DriverManager.getConnection(url, username, password); //用信息进行连接 //4.执行sql的对象 Statement statement = connection.createStatement(); //创建 执行sql的对象 //5.执行sql的对象 去执行sql,可能存在结果,返回结果 String sql = "SELECt * FROM users"; 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("password" + resultSet.getObject("PASSWORD")); System.out.println("email" + resultSet.getObject("email")); System.out.println("birthday" + resultSet.getObject("birthday")); System.out.println("================================="); } //6.释放连接 resultSet.close(); statement.close(); connection.close(); } }步骤:
1.加载驱动
2.连接数据库 DriverManager
3.获得执行sql的对象 statement
4.获得返回的结果集
5.释放连接
statement对象用于向数据库发送sql语句,想完成对数据库的增删改查,只需要通过这个对象向数据库中发送增删改查语句即可。
- preparedstatement
可以防止注入且效率更高
Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动 //useUnicode=true&characterEncoding=utf8&useSSL=true String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true"; String username = "root"; String password = "123456"; //3.连接成功,返回数据库对象 connect代表数据库 Connection connection = DriverManager.getConnection(url, username, password); //用信息进行连接 String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?,?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql);//创建 执行sql的对象,预编译 preparedStatement.setInt(1,4); preparedStatement.setString(2,"liu"); preparedStatement.setString(3,"12344sh"); preparedStatement.setString(4,"19874"); preparedStatement.setDate(5,new java.sql.Date(new Date().getTime())); int i = preparedStatement.executeUpdate(); if(i>0){ System.out.println("插入成功"); } //6.释放连接 preparedStatement.close(); connection.close();与statement相似,不过preparedstatement是先不执行,将要更改的地方用问号替换,然后进行赋值
10.3、使用idea内部连接数据库详情看狂神视频p43



