MySQL入门教程 1、初识MySQL
去年刚开始学java的时候,看的狂神老师的视频,现在整合一下之前做的笔记,发布出来供大家参考
javaEE:企业级java开发 Web
前端(页面:展示,数据)
后台(连接点:连接数据库JDBC,连接前端(控制试图跳转,和给前端传递数据)
数据库(存数据,Txt,Excel,word)
只会敲代码,学好数据库,基本混饭吃
操作系统,数据结构 算法,一个不错的程序员
离散 数学,数字电路,体系结构,编译原理+实战经验
1.1、为什么要学数据库 1.岗位需求
2.现在是大数据时代~,得数据中获得天下
3.被迫需求:存数据
4.数据库是所有软件体系最核心的存在 DBA
1.2、什么是数据库 数据库(DB , DataBase)
概念:数据仓库,软件,安装在操作系统(window,linux,mac)之上,可以存大量的数据
1.3、数据库分类 关系型数据库:SQL
MySql ,Qracle,Sqlrver, DB2, SQLlite
通过表和表之间,行和列之间的关系
非关系型数据库 NOSQL Not Only
Redis,MongDB
非关系型数据库,对象存储,通过对象自身的属性来决定
DBMS(数据库管理系统)
数据库的管理软件,科学有效的管理数据,维护和获取数据
MySQL,数据库管理系统
1.4、MySQL介绍
关系型数据库管理系统
开源的数据库软件
体积小,速度快,成本低,招人成本低
1.4、连接数据库 MySQL服务的启动和停止
第一种方式,右键计算机->管理->服务和应用程序->服务->找到MySQL
第二种方式,cmd打开命令行窗口 启动:net start mysql
停止:net stop mysql
MySQL的登录/退出
方式一:通过MySQL自带客户端 只限于root用户 (现在系统变量Path配置MySQL)
方式二:命令行窗口登陆 :mysql [-h localhost] [-P 3306] -u root -p([...]代表可选,连接本机可省略)
退出 :exit
命令连接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 mysql - uroot - p密码 updete mysql.user set authentication_string= password('密码' )where user = 'root' and Host= 'localost' ; flush privileges 所有语句";"结尾 show databases user 数据库名字 show tables describe 表名字 create database 数据库名字 exit # 12345678910111213141516171819
DDL 数据库定义语言
DML 数据库操作语言
DQL 数据库查询语言
DCL 数据库控制语言
2、操作数据库 2.1、操作数据库 1、创建数据库
1 2 CREATE DATABASE [IF NOT EXISTS ] znb;1
2、删除数据库
1 2 DROP DATABASE [IF EXISTS ] znb;1
3.使用数据库
4.查看数据库
1 2 SHOW DATABASES ;查看所有的数据库1
2.2、数据库的列类型
数值
tinyint 十分小的数据 一个字节
smallint 较小的数据 , 两个字节
mediumint 中等大小的数据 三个字节
int 标准的整数 四个字节
big 较大的数据 八个字节
float 浮点数 四个字节
double 浮点数 八个字节(精度问题)
decimal 字符串形式的浮点数 金融计算的时候,一般用decimal
字符串
char 字符串固定大小 0~255
varchar 可变字符串 0~65535 常用的String
tinytext 微形文本 2^8-1
text 文本穿 2^16-1
时间日期
java,util.Date
date yyyy-mm-dd,日期
time hh:mm:ss 时间格式
datetime yyyy-mm-dd hh:mm:ss 最常用的时间格式
timestamp 时间戳 1970.1.1到现在的毫秒数 较为常用
year 年份表示
null
没有数值,未知
不要用null运算,结果为null
2.3、数据库的字段属性(重点) unsign
zerofill
0填充
不足的尾数用0来填充 int(3),5.········005
自增
在上一条的基础上加一
通常设置唯一的主键盘,必须是整数
可以自己设定数字
非空 NULL not null
默认
设置默认值
sex 默认值为男,如果不指定该列的数值,都为默认
拓展
2.4、创建数据库表(重点) 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE IF NOT EXISTS `student`( `id`INT (4 ) NOT NULL AUTO_INCREMENT COMMENT '学号' , `pwd` VARCHAR (30 ) NOT NULL DEFAULT '***' COMMENT'密码' , `name` VARCHAR (30 ) NOT NULL DEFAULT '张三' COMMENT '姓名' , `sex` VARCHAR (50 ) NOT NULL DEFAULT '男' COMMENT '性别' , `birthday` VARCHAR (20 ) NOT NULL COMMENT '生日' , `address` VARCHAR (30 ) NOT NULL COMMENT'住址' , `emill` VARCHAR (30 ) NOT NULL COMMENT'邮箱' , PRIMARY KEY(`id`))ENGINE= INNODB DEFAULT CHARSET= utf8 1234567891011
格式
1 2 3 4 5 6 7 8 9 CREATE TABLE [IF NOT EXISTS ]`表名`( `字段名` 类型 [属性] [索引] [注释], `字段名` 类型 [属性] [索引] [注释], `字段名` 类型 [属性] [索引] [注释], ) 123456 `字段名` 类型 [属性] [索引] [注释] 1
)[表类型][字符集设置][注释]
1 2 3 4 5 6 7 8 9 常用命令 ```sql SHOW CREATE TABLE studentSHOW CREATE DATABASE schoolDESC student12345678
2.5、数据表的类型
INNODB
MYISAM
事务支持
支持
不支持
数据行锁定
支持
不支持
外键约束
支持
不支持
全文索引
不支持
支持
表空间的大小
较大,为myisam的两倍
较小
常规使用操作
MYISAM 节约空间,速度较快
INNODB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置
所有的数据库文件都在data目录下
本质还是文件的存储!
Mysql引擎在物理引擎文件上面的区别
innoDB 在数据库表中只有一个*fm文件
2.6、修改和删除
修改
1 2 3 4 5 6 7 8 9 10 ALTER TABLE student RENAME AS student1ALTER TABLE student MODIFY age1 FLOAT (10 )ALTER TABLE student CHANGE age1 age INT (10 )ALTER TABLE student DROP age123456789
删除
1 2 DROP TABLE [IF EXISTS ] teacher 1
所有的创建删除最好加上判断,避免出错
3、MySQL数据管理 3.1、外键
方法一:在创建表的时候增加约束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE IF NOT EXISTS `student`( `id`INT (4 ) NOT NULL AUTO_INCREMENT COMMENT '学号' , `pwd` VARCHAR (30 ) NOT NULL DEFAULT '***' COMMENT'密码' , `name` VARCHAR (30 ) NOT NULL DEFAULT '张三' COMMENT '姓名' , `sex` VARCHAR (50 ) NOT NULL DEFAULT '男' COMMENT '性别' , `birthday` VARCHAR (20 ) NOT NULL COMMENT '生日' , `address` VARCHAR (30 ) NOT NULL COMMENT'住址' , `emill` VARCHAR (30 ) NOT NULL COMMENT'邮箱' , `gradeid` INT (4 ) NOT NULL COMMENT '学生的年级' , PRIMARY KEY(`id`),KEY `FK_gradeid`(`gradeid`) , CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`))ENGINE= INNODB DEFAULT CHARSET= utf8 1234567891011121314
方式二:创建表成功后再去添加
1 2 3 4 ALTER TABLE studentADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);123
3.2、DML语言
3.3添加
insert
1 2 3 4 5 6 7 8 9 INSERT INTO `student` (`name`) VALUES ('刘水龙' )INSERT INTO `student` (`name`,`sex`,`pwd`) VALUES ('李四' ,'女' ,'123154' ) ,('王五' ,'女' ,'1232154' ) , ('刘三' ,'女' ,'123154' ) ,('赵四' ,'女' ,'12355154' ) 12345678
注意事项:
1.字段可以省略,但是后面的数值要一一对应
2.可以同时插入多个护具,VALUES后面的数值需要使用隔开即可
3.4修改
update 修改谁(条件) set 原来的数值=新数值
1 2 3 4 5 6 7 8 9 10 UPDATE `student` SET `name`= '傻逼' WHERE id= 3 ;UPDATE `student` SET `name`= '傻逼' ;UPDATE `student` SET `name`= '傻逼' ,`pwd`= '5201314' WHERE id= 3 ;123456789
操作符
含义
范围
结果
=
等于
1=2
false
<>或!=
不等于
5<>6
true
>
>=
<
<=
BETWEEN …and…
闭合区间
AND
我和你
OR
我或你
3.5、删除
delete
delete from 表名 where 条件
1 2 DELETE FROM `student` WHERE id= '4' 1
TRUNCATE命令
删除一个数据库表,表的结构和索引不变
delete 和 truncate的区别
相同:都可删数据库,不会删除表结构
不同:
truncate 重新设置自增列,计数器归零
truncate不会影事务
delete 问题,重启数据库现象
innoDB 自增列会重开始(存在内存当中的,断电即失)
MySAM 继续从上一个自增量开始(存在文件中的不会丢失)
4、DQL查询数据(重点) 4.1 DQL (Data Query LANGUAGE :数据查询语言)
select语法
4.2指定查询字段 1 2 3 4 5 6 7 8 SELECT `id` AS '学号' ,`name` AS '姓名' ,`9 `AS '第九周' ,`10 `AS '第十周' ,`11 `AS '第十一周' ,`12 `AS '第十二周' ,`13 `AS '第十三周' , `14 `AS '第十四周' ,`15 `AS '第十五周' ,`16 `AS '第十六周' FROM `tykdk` SELECT * FROM tykdk1234567
去重 distinct
作用:去除select结果重复的数据
1 2 select distinct `id` from student1
数据库的列(表达式)
1 2 3 4 5 6 7 SELECT VERSION()SELECT 100 * 3 -1 AS 计算结果 SELECT `studentno+ 1 `AS 加分后 FROM student123456
4.3、where条件语句
逻辑运算符号
运算符
语法
描述
and &&
a and b a&&b
or ||
a or b a||b
Not !
not a !a
模糊查询
运算符
语法
描述
IS NULL
a is null
IS NOT NULL
a is not null
BETWEEN
a between b and c
like
a like b
in
a in (a1,a2…)
1 2 3 4 5 6 7 SELECT * FROM tykdk WHERE daka BETWEEN 0 AND 1 SELECT * FROM tykdk WHERE `name` LIKE ('%龙' )SELECT * FROM tykdk WHERE `id`IN ('2018220111' ,'2018220132' )123456
4.4、联表查询
自连接
自己的表和自己的表连接,核心:拆成两个一模一样的表
父类
categoryid
categoryname
2
信息技术
3
软件开发
5
美术设计
子类
pid
categoryid
categoryname
3
4
数据库
2
8
办公信息
3
6
web开发
5
7
美术设计
查询父类对应的子类
父类
子类
信息技术
办公信息
软件开发
数据库
软件开发
web开发
美术设计
ps技术
1 2 3 4 SELECT a.`categoryname` AS 'father' ,b.`categoryname`AS 'son' FROM `test1`AS a,`test1`AS b WHERE a.`categoryid`= b.`pid` 123
4.5、分页和排序
排序:
1 2 3 4 SELECT * FROM `student`ORDER BY id DESC 123
分页
1 2 3 4 SELECT * FROM `tykdk` ORDER BY `id` DESC LIMIT 0 ,10 123
4.6、子查询 where(这个值是计算出来的)
本质:在where语句嵌套一个查询语句)
1 2 3 4 5 6 7 SELECT `id`,`name`,`pwd`FROM `student`WHERE id= (SELECT `id` FROM `grade`WHERE `pwd`= '***' ) 123456
4.7、分组和过滤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jMiW02m4-1621309051592)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20200429180334341.png)]
4.8、select小节 5、MySQL函数 5.1、常用函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 SELECT ABS (-55 )SELECT CEILING (22.995 )SELECT FLOOR (9.8 )SELECT RAND ()SELECT SIGN(99 )SELECT CHAR_LENGTH ('沃日你麻痹' )SELECT CONCAT('c' ,'n' ,'m' )SELECT INSERT ('我是你爸爸' ,1 ,2 ,'操你妈的逼' )SELECT LOWER ('DSDDSADASF' )SELECT UPPER ('sadasdasd' )SELECT INSTR ('zengnanbin' ,'n' )SELECT REPLACE('你是一个大傻逼' ,'傻逼' ,'杂种' )SELECT REPLACE(`name`,'刘' ,'牛' ) FROM `student`WHERE `name` LIKE ('刘%' )SELECT CURDATE()SELECT NOW()SELECT LOCALTIME ()SELECT SYSDATE()SELECT YEAR (NOW())SELECT USER ()SELECT VERSION()12345678910111213141516171819202122232425262728293031323334
5.2、聚合函数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QRShGLiE-1621309051595)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20200429174708478.png)]
1 2 3 4 5 6 7 8 9 10 11 SELECT COUNT (`name`)FROM `tykdk`SELECT SUM (`9 `)AS '总和' FROM `tykdk`SELECT AVG (`9 `)AS '平均分' FROM `tykdk`SELECT MAX (`9 `)AS '最高分' FROM `tykdk`SELECT MIN (`9 `) AS '最低分' FROM `tykdk`12345678910
5.3、数据库级别的MD5加密 MD5不可逆,具体的MD5密码值是一样的
MD5破解网站的原理,背后有一个字典
1 2 3 4 5 6 7 8 UPDATE `testmd5` SET `pwd`= '123456' ,`name`= '张三' WHERE id= 1 INSERT INTO `testmd5` (`pwd`,`name`) VALUES ('123457' ,'李四' ),('1234557' ,'王五' )UPDATE `testmd5` SET `pwd`= MD5(pwd) WHERE id= 1 INSERT INTO `testmd5` VALUES ('4' ,MD5('123456' ),'xm' )1234567
6、事 务 要么都成功,要么都失败
事务原则:ACID原则 原子性,一致性,隔离性,持久性(脏读,欢幻)
参考博客:https://blog.csdn.net/dengjili/article/details/82468576
原子性(Atomicity)
要么都成功,要么都失败
一致性(Consistency)
事务前后数据要保持一致
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
事务一旦提交就不可逆,被持久化到数据库中
隔离性问题:
执行事务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 SET autocmmit= 0 SET autocommit= 1 SET autocommit = 0 START TRANSACTION INSERT XXcommit ROLLBACK SET autocommit= 1 SAVEPOINT 保存点名ROLLBACK TO SAVEPOINT 保存点名RELEASE SAVEPOINT 保存点名1234567891011121314151617181920 SET autocommit = 0 ;START TRANSACTION UPDATE account1 SET money= money-2000 WHERE `id` = 1 UPDATE account1 SET money= money+ 2000 WHERE `id` = 2 COMMIT ;ROLLBACK ;SET autocommit= 1 ;1234567
7、索引 7.1、索引的分类
在一个表中主键索引只可以有一个,唯一索引可以有多个
7.2、测试索引 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 DELIMITER $$ CREATE FUNCTION mock_data000()RETURNS INT BEGIN DECLARE num INT DEFAULT 10000000 ; DECLARE i INT DEFAULT 0 ; WHILE i< num DO INSERT INTO `app_user` (`name`,`phone`,`pwd`,`age`) VALUES (CONCAT('用户' ,i),FLOOR (CONCAT('18' ,RAND()* (999999999 -100000000 )+ 100000000 )),UUID(),FLOOR (RAND()* 100 )); SET i= i+ 1 ; END WHILE; RETURN i; END ;EXPLAIN SELECT * FROM `app_user` WHERE `name`= '用户854569' CREATE INDEX id_app_user_name ON `app_user`(`name`)123456789101112131415161718192021
加入索引前
加入索引后
7.3、索引原则
索引不是越多越好
不要对经常变的数据加索引
小数据的表不要加
一般加在常用在查询的字段上面
索引的数据结构
Hash 类型的索引
Btree:InnoDB 的默认数据结构
参考资料:https://blog.csdn.net/zq602316498/article/details/39323803
8、数据库的备份与权限 8.1、用户管理
SQLyog可视化管理
用户表:mysql.user
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE USER kuangshen IDENTIFIED BY '123456' SET PASSWORD = PASSWORD('123456' )SET PASSWORD FOR kuangsheng = PASSWORD('123456' )GRANT ALL PRIVLEGES PN* .* TO kuangshenSHOW GRANTS FOE kuangshenREOMVE ALL PRIVILEGES OM* .* FROM kuangshen 123456789101112131415
8.2、数据库备份 为什么要备份
MySQL数据库备份的方式
直接拷贝物理文件
sqlyog可视化工具
命令行导出 mysqldump 命令行使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 mysqldump - hlocalhost - uroot - pehero000921 daka tykdk > D:a.sql source D:/ 文件.sql mysql - u用户 - p密码 数据库名字< 备份文件 12345678910111213
备份数据库防止数据丢失
把数据库给朋友,sql文件给比人即可!
9、规范数据库设计 9.1、为什么要设计 当数据库比较复杂的时候就要设计
糟糕的数据库设计:
数据冗长,浪费空间
数据库插入和删除都会麻烦,异常
程序性能差
良好的数据库设计
软件开发中,关于数据库的设计
设计数据库的步骤
9.2、规范数据库设计 为什么要有范式
信息重复
更新异常
插入异常
无法正常显示信息
删除异常
丢失有效的信息
三大范式
第一范式
原子性:保证每一列不可再分
第二范范式
前提:满足第一范式的前提下,每张表只表示一个信息
第三范式
前提:满足第一第二范式
确保数据表的每一列数据都和主键直接相关,而不能见解相关
10、JDBC 10.1、数据库驱动 驱动:声卡,显卡,数据库
10.2、JDBC
10.3、第一个JDBC程序
创建测试数据库
1、创建一个普通项目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE DATABASE `jdbcstudy`CREATE TABLE users( `id` INT (4 ) PRIMARY KEY, `name` VARCHAR (40 ), `password` VARCHAR (40 ), `birthday` DATE ); INSERT INTO `users` (`id`,`name`,`password`,`birthday`) VALUES ('1' ,'张三' ,'123456' ,'1999-02-02' ),('2' ,'李四' ,'1234556' ,'1999-08-02' ),('3' ,'王五' ,'1288556' ,'1998-02-15' ),('4' ,'赵六' ,'752156' ,'1999-12-12' ) 1234567891011121314
2.导入数据库驱动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package JDBC01;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class test01 { public static void main (String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver" ); String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true" ; String username = "root" ; String password="ehero000921" ; Connection connection=DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); String sql="select * from users" ; ResultSet rs=statement.executeQuery(sql); while (rs.next()) { System.out.print("id=" +rs.getObject("id" )+" " ); System.out.print("name=" +rs.getObject("name" )+" " ); System.out.print("password=" +rs.getObject("password" )+" " ); System.out.println("birthday=" +rs.getObject("birthday" )); } rs.close(); statement.close(); connection.close(); } } 1234567891011121314151617181920212223242526272829303132333435
步骤总结:
1.加载驱动
2.连接数据库DriverManager
3.获取执行sql的对象Statement
4.获的返回的结果集
5.释放连接
DriverManager
1 2 3 Class.forName("com.mysql.jdbc.Driver" ); 12
URL
1 2 3 4 5 6 String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true" 12345
Statement 执行SQL的对象 PrepareStatement 执行的SQL的对象
1 2 3 4 5 String sql="sekect * from users" ; statement.executeQuery(); statement.execute(); statement.executeUpdate(); 1234
ResultSet 查询的结果集:封装了所有的查询结果
获取定的数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 resultset.getint(); resultset.getobject(); resultset.getDate(); ... resultset.beforFirst(); resultset.afterLast(); resultset.absolute(row) 123456789101112
10.4、statement对象
配置类
1 2 3 4 5 6 driver =com.mysql.jdbc.Driver url =jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true username =root password =ehero000921 12345
工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 package JDBC01;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;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 { InputStream in=jdbcutils.class.getClassLoader().getResourceAsStream("JDBC01/db.properties" ); Properties properties=new Properties (); properties.load(in); driver =properties.getProperty("driver" ); url =properties.getProperty("url" ); username =properties.getProperty("username" ); password =properties.getProperty("password" ); Class.forName(driver); }catch (IOException e){ e.printStackTrace(); }catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection () throws SQLException { return DriverManager.getConnection(url,username,password); } public static void release (Connection conn,Statement st, ResultSet rs) throws SQLException { if (rs!=null ) { rs.close(); } if (st!=null ) { st.close(); } if (conn!=null ) { conn.close(); } } } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package JDBC01;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) throws Exception { Connection conn = null ; Statement st=null ; ResultSet rs=null ; try { conn= jdbcutils.getConnection(); st=conn.createStatement(); String sql="INSERT INTO `users` (`id`,`name`,`password`,`birthday`)" + " VALUES ('9','大傻逼2','55201314','2000-12-11') " ; int i=st.executeUpdate(sql); if (i>0 ) { System.out.println("插入成功!" ); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcutils.release(conn, st, rs); } } } 123456789101112131415161718192021222324252627282930313233
sql注入问题
sql存在漏洞,会导致被拼接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package JDBC01;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class sql { public static void main (String[] args) { sql.login(" 'or '1=1" , "'or '1=1" ); } public static void login (String username,String password) { Connection conn=null ; Statement sta=null ; ResultSet re=null ; try { conn= jdbcutils.getConnection(); sta=conn.createStatement(); String sql="SELECT * FROM `users` WHERE `name`='" +username+"' AND `password`='" +password+"'" ; re=sta.executeQuery(sql); while (re.next()) { System.out.print(re.getString("name" )+" " ); System.out.println(re.getString("password" )); } } catch (SQLException e) { e.printStackTrace(); } } } 123456789101112131415161718192021222324252627282930313233343536373839
10.5、PreparedStatement
增加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 package JDBC01;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.Date;import com.mysql.fabric.xmlrpc.base.Data;public class test02 { public static void main (String[] args) { Connection con=null ; PreparedStatement pst=null ; try { con=jdbcutils.getConnection(); String sql = "insert into users(id,name,password,birthday) values(?,?,?,?)" ; pst=con.prepareStatement(sql); pst.setInt(1 , 7 ); pst.setString(2 , "蠢货" ); pst.setString(3 , "5201314888" ); pst.setDate(4 , new java .sql.Date(new Date ().getTime()) ); int i=pst.executeUpdate(); if (i==1 ) System.out.println("插进去了" ); } catch (SQLException e) { e.printStackTrace(); }finally { if (pst!=null ) try { pst.close(); } catch (SQLException e) { e.printStackTrace(); } if (con!=null ) try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package JDBC01;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;public class test03 { public static void main (String[] args) { Connection con=null ; PreparedStatement pst=null ; try { con=jdbcutils.getConnection(); String sql="delete from users where id=? " ; pst=con.prepareStatement(sql); pst.setInt(1 , 7 ); int i=pst.executeUpdate(); if (i==1 ) System.out.println("删了" ); } catch (SQLException e) { e.printStackTrace(); } } } 123456789101112131415161718192021222324252627
改变
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package JDBC01;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;public class test04 { public static void main (String[] args) { Connection con=null ; PreparedStatement pst=null ; try { con=jdbcutils.getConnection(); String sql="update users set `name`='杂种' where `id`=?" ; pst=con.prepareStatement(sql); pst.setInt(1 , 5 ); int i=pst.executeUpdate(); if (i==1 ) System.out.println("成功" ); } catch (SQLException e) { e.printStackTrace(); } } } 12345678910111213141516171819202122232425262728
删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 package JDBC01;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Date;import com.mysql.fabric.xmlrpc.base.Data;public class test05 { public static void main (String[] args) { Connection con=null ; PreparedStatement pst=null ; ResultSet rs=null ; try { con=jdbcutils.getConnection(); String sql="select * from `users` where id=?" ; pst=con.prepareStatement(sql); pst.setInt(1 , 2 ); rs=pst.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("id" )); System.out.println(rs.getString("name" )); System.out.println(rs.getString("password" )); System.out.println(rs.getString("birthday" )); } } catch (SQLException e) { e.printStackTrace(); } } } 1234567891011121314151617181920212223242526272829303132333435363738
10.6、使用IDEA连接数据库 10.7、数据库连接池 数据库连接—-执行完毕—释放
连接十分浪费资源
池化技术:准备一些预先的资源,过来就是连接准备好的
—-开门—-业务员:等待–服务—
常用连接数:10
最小连接数:10
最小连接数:100 业务最高承载上限
等待超时:100ms
编写连接池,实现一个接口 DateSource
开源数据源实现
DBCP
C3P0
Druid:阿里巴巴
使用这些数据库连接池后在项目就不需要写项目连接池了
DBCP