数据库叫database ,简称DB,是长期存放在计算机内,有组织、可共享的大量数据的集合;数据库就是存放数据的仓库,专业的数据库系统具有较小的数据冗余度,较高的数据安全性,易扩展性。
数据库设计原则:
mysql主要优势:一个应用对应一个数据库
关系型数据库(保证数据的一致性,能建立关系) | 非关系型数据库(放在不同的服务器上) |
---|---|
MySQL(中小型企业免费) | MongoDB(文档存储) |
Oracle(大型电商网站) | Redis(键值存储) |
SQL Server(政府网站,大学教育) | Memcached(键值存储) |
maradb(mysql开源版本的一个分支) | Hbase(列存储) |
db2(银行系统) | Neo4J(图形) |
sybase(被淘汰) |
实体用 | 属性 | 关系 |
---|---|---|
方框 | 椭圆 | 菱形 |
服务器是一台电脑,这台电脑安装了服务器软件,这些软件会监听不同的端口号,根据用户访问的端口号提供不同的服务
是现行的开源、免费的关系型数据库
DDL | DML | DQL | DCL |
---|---|---|---|
数据定义语言 | 数据操纵语言 | 数据查询语言 | :数据控制语言,定义访问权限、取消访问权限,安全设置 |
create、drop、alter | ,insert、update、delete | select | grant |
mysql5.5安装教程
运行安装程序、在启动配置教程以前,一路下一步直到finish
第一次finish之后启动服务配置教程
第一个induce mysql bin dinctory to windows path
第二个端口号不要去修改,字符集要选择utf-8,默认端口号:3306
cmd——以管理员身份运行
启动mysql数据库服务:net start mysql
登录mysql:mysql -uroot -paaaaa123(或者:mysql -hlocalhost -uroot -paaaaa123)注意-p以后不能有空格
exit退出mysql
show databases;(显示数据库,一定要加分号)
use mysql
show tables(显示数据库中的表)
sql语句select * from user\G;显示user用户列表
修改user用户密码:update user set password=password’(1234’ ) where user=‘root’;,flush privileges;刷新下
?寻求帮助
查看mysql所支持的引擎类型、表类型:SHOW ENGINES;
查看默认引擎:SHOW VARIABLES LIKE ‘storage_engine’;
显示变量:show variables like’auto%’
创建数据库
CREATE DATABASE [IF NOT EXISTS ]数据库名;
删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
修改数据库字符集
alter database 数据库名 character set 字符集
查看数据库
选中数据库
use 数据库名
创建表
create table 表名(
列名 列的类型 列的约束,
列名 列的类型 列的约束
)【表类型】【表字符集】【表注释】
代码示例:
#创建学生表,并设置表类型、字符集
CREATE TABLE `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主键、学号',
`psd` VARCHAR(20) COLLATE utf8_estonian_ci NOT NULL DEFAULT '123456' COMMENT '密码',
`name` VARCHAR(30) COLLATE utf8_estonian_ci NOT NULL DEFAULT '匿名' COMMENT '学生姓名',
`sex` VARCHAR(2) COLLATE utf8_estonian_ci NOT NULL DEFAULT '男' COMMENT '性别',
`birsday` DATETIME DEFAULT NULL,
`email` VARCHAR(20) COLLATE utf8_estonian_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci
注释
字段注释: comment'注释的内容'
表注释:comment='注释的内容'
列的约束
primary key 主键约束
unique : 唯一约束
not null 非空约束
注意事项
除了最后一个列不用逗号隔开,每一列都要逗号隔开
表名如果变蓝了表明和数据库有冲突,这时候要加上反引号·
字符串类型的要用单引号引起来
有多个属性的时候用空格隔开就好
commend后面加单引号注释内容
#代表整个注释
设置严格检查模式
SET sql_mode='strict_trane_tables';
列类型
表的类型
常见的MyISAM,InnoDB
名称 | MyISAM | InnoDB |
---|---|---|
事务处理 | no | yes |
外键约束 | no | yes |
数据行锁定 | no | yes |
全文索引 | yes | no |
表空间大小 | 较小 | 较大 |
数据表的存储位置
都位于C:\ProgramData\MySQL目录下
MyISAM | InnoDB |
---|---|
只有一个frm文件 | frm、wyd、myi三个文件 |
数据字段属性
删除表
drop table 表名
修改表
#修改表名
ALTER TABLE 表名 RENAME AS test1;
#修改表的字符集
alter table 表名 character set 字符集
#添加列
ALTER TABLE 表名 ADD 列名 列类型 属性 ;
#修改列
alter table 表名 modify 列名 列类型 属性 ;
#修改列名
alter table 表名 change 旧列名 新列名 列类型 属性 ;
#删除列
alter table 表名 dop 列名
查看表
查看当前数据库所有的表名
show tables
查看表的定义结构/创建语句
show create table 表名
查看表的结构
desc 表名
保存Ctrl+s
新建查询编辑器——在同一标签中打开文件(在不同标签中打开)
对于图像声音视频用text、blob存储数据
一般没有必要直接存储图像,而存储的是路径用字符串
主键咋一个表里面可有也可以没有,
一个表里面的外键既可以有一个也可以有多个,
建立主外键关系的有主键的表为主表,有外键的表成为子表或者从表
能够保证数据的完整性和 正确性
对于有主外键关系的表,数据插入操作要有一定顺序,先放主键数据,再放外键数据 ,先删除子表,再删除主表
主键和外键,列名可以不同,但是数据类型一定要相同
主键和外键建立联系第一种方法在建表的时候就联系,关键词是constraint,外键名一般以FK开头 foreign key代表外键,引用主键用关键词reference
主键&外键相关的SQL语句
创建主键&外键
1、创建此表的同时就创建外键
主键:PRIMARY KEY可写在列后面,也可以字段都写完了在最后一行写明PRIMARY KEY(字段名 )
外键:CONSTRAINT FR_gradeId FOREIGN KEY (要添加主键的字段) REFERENCES 引用表(引用表中的哪个字段)(FR_gradeId字段名)
2、创建字表完毕后,修改子表增加外键
ALTER TABLE 表名
ADD CONSTRAINT 外键名 FOREIGN KEY (要添加主键的字段) REFERENCES 引用表(引用表中的哪个字段);
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
(删除了之所以还能看到外键在表中,是因为外键会默默的创建了一个索引,要想彻底删除还要加上一句话删除索引
ALTER TABLE 表名 DROP INDEX 外键名;
删除外键要有两句话才能彻底删除)
insert into 表名(列名1,列名2) values(值1,值2)
insert into 表名 values(值1,值2)
insert into 表名(列名1,列名2) values(值1,值2),(值1,值2)
批量插入数据
注意点:
AS可省略
select distinct 字段名 from 表名
select [distinct] [*] [列名1,列名2] from 表名 where 条件
group by...
having
order by
#查询数据用DQL语句
#1、核心查询(*代表查询所有列,效率比较低)
SELECT * FROM student;
#2、查询指定列,查询student的学号和姓名,在mysql中列名不区分大小写
SELECT studentno,studentname FROM student;
#3、被查出的列取别名(给列取别名as可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;
SELECT studentno 学号,studentname 姓名 FROM student;
#6、给表取取别名(给表取别名as可以省略),别名不会该表原表的列名,只是为了看的
SELECT studentno 学号,studentname 姓名 FROM student AS 学生表;
SELECT studentno 学号,studentname 姓名 FROM student 学生表;
#7、as为查询结构(如函数)取一个新的名字
SELECT CONCAT('姓名:',studentName)AS 新姓名 FROM student;
#8、查看那些同学参加了考试(学号),去除重复项,用关键字distinct,默认为all代表查询所有行
SELECT DISTINCT studentno FROM result;
注意:distinct一定写前面
SELECT DISTINCT NAME NAME,english FROM exam;
#9、select中可以出现表达式
SELECT @@auto_increment_increment;
SELECT VERSION();
SELECT 100*3-1 AS 计算结果
SELECT studentno,studentresult+1 AS 提分后 FROM result;
#10、满足条件的查询(where) 考试成绩95-100
SELECT studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
#13、精确查询
SELECT studentno,StudentResult
FROM result
WHERE studentno=1000;
#15、查询除了1000号这个学生,其他学生的考试成绩!=
SELECT studentno,StudentResult
FROM result
WHERE studentno !=1000;
#16、或者用not和!=一样
SELECT studentno,StudentResult
FROM result
WHERE NOT studentno =1000;
#17、模糊查询between and/ like/in/null
#查询姓李的同学的学号和姓名
#like及结合使用的通配符,%(0到任意一个字符) _(一个字符)
#查询所有姓李的同学
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '李%';
#查询姓李的,名字是三个字的
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '李__';
#查询所有带有“文字的”(不管开头和结尾)常用
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '%文%';
转义字符%——\%
_——\_
如何不想用\作为转义字符,可以自定义转义字符,使用自己定义的转衣服:escape ‘你定义的转义符’但是%和_是不可以自行设计的
#模糊查询之 in
SELECT studentName,studentNo FROM student
WHERE studentNo IN(1000,1001,1002,1003);
SELECT studentName,studentNo FROM student
WHERE Address IN('北京','南京');
#模糊查询之 null
注意:只有是显示null的才为空,对于空白什么都没有的并不是空null而是字符串为空,如:
#查询家庭住址没有写的同学
#1、错误用法
SELECT studentname FROM student
WHERE Address IS NULL;
#2、用空字符串
SELECT studentname FROM student
WHERE Address='';
#3、一般这种类型的查询用这种写法
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
#查询出生日期没有填写的同学,=null是错误的,和null比较要用iis null
SELECT studentno FROM student
WHERE BornDate IS NULL;
#对于不是空的要用is not null
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;
#不同课程的平均分、最高分、最低分
SELECT subjectname, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.subjectno
#分组后再筛选执行的sql语句筛选
SELECT subjectname, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.subjectno
HAVING 平均分>80
ORDER BY 平均分 DESC
LIMIT 0,4
内连接 | 左连接 | 右连接 | 自连接 | 等值连接 | 非等值连接 |
---|---|---|---|---|---|
nner join | left join | right join | \ | \ | \ |
查询两个表结果集中的交集 | 以左表为基准,右边表来一一匹配,匹配不上的返回左表记录,右表以null填充 | 以右表为基准,右边表来一一匹配,匹配不上的返回左表记录,左表以null填充 | 自连接的表一定要取别名(AS)子栏目父栏目问题 | 和内连一样,只是写法不同 | 区别于等值连接,不加where |
等值连接:
SELECT s.StudentNo,StudentName,subjectno,StudentResult
FROM student s,result r
WHERE s.StudentNo = r.StudentNo;
#自连接代码
CREATE TABLE IF NOT EXISTS category(
categoryId INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '当前栏目',
pId INT(10) NOT NULL COMMENT '当前栏目的父栏目',
categoryName VARCHAR(50) NOT NULL,
PRIMARY KEY (categoryId)
)
INSERT INTO category
VALUES (2,1,'美术设计'),
(3,1,'软件开发'),
(4,3,'数据库基础'),
(5,2,'ps基础'),
(7,2,'色彩搭配'),
(8,3,'PHP基础'),
(9,3,'java基础');
SELECT * FROM category;
SELECT categoryName '知足上进' FROM category;
#将各个栏目的父子栏目显示出来(父栏目名称 子栏目名称)
SELECT a.categoryName AS '主栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b;
WHERE a.categoryId=b.pId;
一定要先写连接查询再写where
多重嵌套连接:
注意:inner join ,和from以及on后面都不能用,隔开,否则会报1064错误
#参加了参加了考试的同学(学号、学生姓名、科目名、分数)
SELECT s.StudentNo,StudentName,subjectname,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` AS sub
ON r.SubjectNo=sub.SubjectNo;
group by having
#查询《数据库结构—1》的所有考试的同学(学号、学生姓名、科目名、分数)
SELECT s.StudentNo,StudentName,subjectname,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` AS sub
ON r.SubjectNo=sub.SubjectNo
WHERE SubjectName='数据库结构-1'
ORDER BY StudentResult DESC,studentno DESC #1、默认升序asc 2、desc为降序
#常见错误:ORDER BY StudentResult ,studentno DESC 这时候StudentResult升序,studentno降序,desc是就近原则
#分页查询
##查询《数据库结构—1》的所有考试的同学(学号、学生姓名、科目名、分数)
#每页显示五条数据出来
SELECT s.StudentNo,StudentName,subjectname,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` AS sub
ON r.SubjectNo=sub.SubjectNo
WHERE SubjectName='数据库结构-1'
ORDER BY StudentResult DESC,studentno DESC
#limit 0,5 #从哪条记录开始起始行0,要显示几行
LIMIT 5,5 #第二页
LIMIT 10,5 #第三页 (等于linit 5 offset 0)
#子查询
#分部写简单sql语句,然后去嵌套
SELECT studentno ,studentname FROM student WHERE studentno IN()
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=()#1\2\3\4
SELECT subjectno FROM `subject` WHERE SubjectName='高等数学-2' #2
SELECT studentno, studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE SubjectName='高等数学-2' ))
ABS() | CEILING() | FLOOR() | RAND() | RAND() |
---|---|---|---|---|
绝对值 | 大于等于我的最小的整数 | 小于等于我的最大的整数 | 返回0-1之间的随机数 | 每次生成固定的0-1之间的随机数(以某个数作为种子) |
SELECT ABS(-8) ‘-8的绝对值’ | SELECT CEILING(9.8)=10 | SELECT FLOOR(9.8)=9 | \ | \ |
#返回字符串中包含的字符数
SELECT CHAR_LENGTH ( '好好学习数据库')
#合并字符串
SELECT CONCAT('我','爱')
#替换字符串,从某个位置开始,替换某个长度,替换的内容
SELECT INSERT('我爱你婺源',1,3,'很爱')
SELECT INSERT('我爱你婺源',1,3,'很爱') #如果起始位置超过字符串长度,则返回原长度
#变小写
SELECT LOWER('I LOVE YOU')
#变大写
SELECT UPPER('i love you')
#从左边截取指定长度的字符串
SELECT LEFT('我爱你中国',3)
##从右边截取指定长度的字符串
SELECT RIGHT('我爱你中国',3)
#替换字符串(要替换的字符串,要替换的文字,替换的内容)
SELECT REPLACE('中国欢迎你,你好','你','你们')
#截取(从哪个位置开始截取,截取多长)
SELECT SUBSTRING('中国欢迎你,你好',1,2)
#反转
SELECT REVERSE('中国欢迎你')
#获得当前日期
SELECT CURRENT_DATE()
SELECT CURDATE()
#获得当前日期和时间
SELECT NOW()
SELECT LOCALTIME()
SELECT SYSDATE()
#分别获取日期中的某个部分
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
SELECT VERSION()
SELECT USER()
#聚合函数:返回的是一个值,不要出现多个值
#count(字段名) 是非空值的计数
count(*)返回所有列的统计
SELECT COUNT(StudentName) FROM student
SELECT COUNT(1) FROM student
#sum()求总和
SELECT SUM(StudentResult) AS 总分 FROM result
SELECT AVG(StudentResult) AS 平均分 FROM result
SELECT MAX(StudentResult) AS 最高分 FROM【】 result
SELECT MIN(StudentResult) AS 最低分 FROM result
count(*)尽量少用
事务就是将一组sql语句放在同一批次内去执行,如果一个sql语句错误,则该批次的所有sql语句都将取消执行,最能理解的就是银行转账
注意: mysql事务只支出innoDB和BDB数据表类型
原子性(A)
组sql语句是当做一个整体执行的,不能单独执行其中的某一条,要么全部成功,要么全部失败
一致性(C)
要么都是事务提交前的状态,要么都是事务提交以后的状态,不可能存在事务在中间的什么状态
隔离性(I)
每一个事务处理之间互不影响,彼此独立和透明,事务间不能交叉
持久性(D)
事务一旦提交成功,对事务的影响是永久 的
set autocomment=0关闭mysql的自动提交
start transaction
开启一个事务
执行的sql语句
commit/rollback
提交或者回滚
set autocomment=1
还原mysql默认的自动提交
代码示例:
#使用事务模拟实现转账
CREATE TABLE IF NOT EXISTS account(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
cash DECIMAL(9,2) NOT NULL
);
INSERT INTO account (`name`,cash)
VALUES ('A',2000),('B',10000);
SELECT * FROM account;
DELETE FROM account;
#没有异常情况时候的事务
SET autocommit=0;
START TRANSACTION;
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
COMMIT;
SET autocommit=1;
#有问题时候的事务用rollback撤销,回到事务开始最初的状态
SET autocommit=0;
START TRANSACTION;
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
ROLLBACK;
SET autocommit=1;
主键索引 | 唯一索引 | 常规索引 | 全文索引 |
---|---|---|---|
primary key | unique | index | fulltext |
避免同一个表中某数据列的值重复 | 不宜添加过多常规索引 | 只能英语myisam,并且只能是vachar、char、test类型 |
唯一索引和主键索引区别:
#添加索引
#方式一:在创建表申明列的时候添加上
CREATE TABLE text1(
id INT(3) PRIMARY KEY,
testno VARCHAR(10) UNIQUE,
c VARCHAR(50),
d VARCHAR(20),
e TEXT,
INDEX `index_c`(c,d),
FULLTEXT(e)
)ENGINE MYISAM
***添加常规索引的时候,可以添加多个列为常规索引,写在前面的列有优先权,索引名字用``隔开,而不是逗号。
#方式二,将所有列都申明完毕后再添加索引,统一添加索引
CREATE TABLE text2(
id INT(3) ,
testno VARCHAR(10) ,
c VARCHAR(50),
d VARCHAR(20),
e TEXT,
PRIMARY KEY(id),
UNIQUE KEY(testno),
INDEX `index_c`(c,d),
FULLTEXT(e)
)ENGINE MYISAM
#方式三:创建表完毕后修改表的时候去添加索引
CREATE TABLE text3(
id INT(3) ,
testno VARCHAR(10) ,
c VARCHAR(50),
d VARCHAR(20),
e TEXT
)ENGINE MYISAM
ALTER TABLE text3 ADD PRIMARY KEY(id);
ALTER TABLE text3 ADD UNIQUE KEY(testno);
ALTER TABLE text3 ADD INDEX(c,d);
ALTER TABLE text3 ADD FULLTEXT(e);
注意:EXPLAIN SELECT * FROM student WHERE studentno=‘1000’,explain代表的是查询查询的具体明细,包括如下信息:
全文索引,你要设置全文索引的列,查询的条件不能超过全文数据的50%,否则全文索引就没用了(只能用在字符串类型varchar和text上,只能用于MYISAM)
设置全文索引
ALTER TABLE student ENGINE=MYISAM;
EXPLAIN SELECT * FROM student WHERE MATCH(StudentName) AGAINST('李%');
1、DROP INDEX 索引名 ON 表名;
DROP INDEX testno ON text3;
2、ALTER TABLE 表名 DROP INDEX e索引名
ALTER TABLE text3 DROP INDEX e;
3、#删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY;
ALTER TABLE text3 DROP PRIMARY KEY;
A-B-C先把A用到
视图是保存在数据库中的select查询,是一种虚拟表,使用视图原因,一个是出于安全考虑,用户不必看到整个数据库的结构,另一个是复合用户日常业务逻辑
创建视图
create view 视图名
AS 查询语句
删除视图
drop view 视图名
查看视图
select 字段1,字段2 from 视图名
注意事项
mysqldump是和mysql同级的一个命令!
备份整个数据库
mysqldump -uroot -p school>E:/java/beifen/school.sql
执行备份:
*密码可以先不P输出,最后以密码文的形式
*>千万别丢了,如果丢了,会报mysqldump couldnot find。。。。
备份特定的表
mysqldump -uroot -p school grade student >E:/java/beifen/school1.sql
mysqldump设置之指定哪些语句不显示
mysqldump -uroot -p --skip-add-drop-table school grade student >E:/java/beifen/school2.sql
mysqldump设置之显示insert into加上列名
加上一个-c即可
mysqldump -uroot -p --skip-add-drop-table -c school grade student >E:/java/beifen/school2.sql
备份文件解析:
1、/*和*/包裹的数据代表是可以被mysql执行的注释,但是不能被其他数据库执行
2、--包围的是注释
3、 !40101是版本号
**mysql --help|more会以一屏显示,一行一行的看
1、进入mysql
mysql -urrot -p
2、选择要备份到哪里
use test
3、选择要备份的数据库
source E:/java/beifen/school.sql
注意点:1、打勾的时候一定要注意,不要勾选use database和carat database
#将school库中的student表中的学号和姓名这两列备份出去
USE school;
#注意:备份出去的文件不可以提前存在
SELECT studentno,StudentName INTO OUTFILE 'E:/java/beifen/student.sql' FROM student;
#将备份出去的数据导入到test库中的stable表里来
USE test;
CREATE TABLE stable(
id INT(4),
sname VARCHAR(20)
)
LOAD DATA INFILE 'E:/java/beifen/student.sql' INTO TABLE stable(id,sname);
SELECT * FROM stable;
矩形表示实体、椭圆表示属性、菱形表示关系
用Visio2007版本及以下版本绘制更好
第一范式(1NF)
目标是确保每列 原子性,如果每列或者每个属性值都是不可再分的最小数据单元,则满足第一范式
第二范式(2NF)
第三范式(3NF)
目标是确保每列值都和主键直接相关,而不是间接相关,如果一个关系满足第二范式,并且除了主键以外的其他列都只能依赖于主键,列于列之间不存在相互依赖关系
JDBC是实现java程序对各种数据库的访问,是一组类和接口,位于java.sql与javax.sql包
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、建立连接
String url="jdbc:mysql://localhost:3306/myschool";
String user ="root" ;
String password = "aaaaa123";
con= DriverManager.getConnection(url, user, password);
//创建sql语句
String sql ="SELECT studentno,studentName FROM student";
//创建对象
pstm =con.prepareStatement(sql);
//执行sql语句
rs=pstm.executeQuery();
//处理结果
System.out.println("编号:\t姓名:");
while(rs.next()) {
System.out.println(rs.getInt("studentno")+"\t"+rs.getString("studentName"));
}
//关闭资源
rs.close();
pstm.close();
con.close();
Class.forName() 后加载 反射,事先不知道加载哪个类,运行时进行加载(桥接) 而Student stu =new Student() 先加载类
//增加数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
public class Test3 {
public static void main(String[] args) {
ResultSet rs =null;
PreparedStatement pstm=null;
Connection con =null;
//1、加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//2、建立连接
String url="jdbc:mysql://localhost:3306/kgcnews";
String user ="root" ;
String password = "aaaaa123";
con= DriverManager.getConnection(url, user, password);
//创建sql语句
String sql ="INSERT INTO news_category (NAME,createDate) VALUES (?,?)";
//创建对象
pstm =con.prepareStatement(sql);
//给占位符赋值
pstm.setString(1, "哈哈");
pstm.setTimestamp(2, new Timestamp(10));
//执行sql语句
int i=pstm.executeUpdate();
//处理结果
if(i>=1) {
System.out.println("增加成功");
}else {
System.out.println("未增加");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(null !=pstm) {
try {
pstm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null !=con) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
增删改操作类似,只是替换sql语句即可