【Mysql】指令(全!!!)

    科技2022-08-15  106

    目录

    1.数据库2.引擎3.数据表4.数据表字段5.运算符6.数据7.DML查询数据7.1单表查询(从指定表中查询数据)7.1.1模糊查询7.1.2比较运算符7.1.3排序7.1.4.分页(缓解数据库压力,提高客户体验)7.1.5分组 7.2聚合函数查询(根据一组数据求一个值)7.3连接查询(把不同表的记录连到一起)7.4子查询(从内到外运算符查询)7.5合并查询(并列到一起查询)7.6联表查询(join)7.7自连接(一张表拆为两张一样的表,树状图)7.8别名(定义表和字段的别名) 8.MySql函数(一些基础函数)8.1数学函数 8.1字符串函数8.3日期时间函数8.4判断条件函数8.5系统信息函数8.6加密函数8.7其他函数9.索引(查询时更快查询到需索引的文件,提高了查询效率)9.1创建索引9.1.1在建立数据表时创建索引9.1.2.在已建立数据表时创建索引 9.2索引原则9.3索引背后的数据结构(之后研究) 10.视图(虚拟表,方便操作且有安全权限)11.数据完整性约束11.1实体完整性11.2参照完整性(不推荐使用外键)11.3用户定义完整性11.4命名完整性约束11.5更新完整性约束 12. DML语言(数据库操作语言)12.1 Insert(插入语句,添加)12.2 Update(修改语句)12.3 Delete(删除)12.3.1 delete删除问题 13.事务(sql执行事件,要么都成功,要么都失败)13.1 原子性13.2 一致性13.3 隔离性13.3.1隔离性的级别: 13.4 持久性13.5 步骤13.5.1需了解: 13.6 具体步骤 14.权限管理和备份14.1用户管理14.2备份 15.规范数据库设计15.1当数据库比较复杂的时候,就需要设计15.2 三大范式(规范数据库的设计)15.2.1规范性与性能的问题 16.JDBC16.1数据库驱动16.2 IDEA连接数据库16.3 代码实现(增删改查)16.4 sql注入问题(漏洞,会被攻击导致数据泄露—SQL会被or拼接)16.5 PreparedStatement(防止SQL注入)16.6 IDEA连接数据库16.7 JDBC操作事务16.8 连接池操作(DataSource接口)

    1.数据库

    /*其他电脑连接本地数据库:需提供本地jar包和ip地址,且需要改允许外部服务器访问 use mysql; //使用数据库 select host,user from user; //查看地址和user update user set host='%' where user ='root'; //如果只能本地访问,则加这个可以外部访问 flush privileges; //刷新权限 select host,user from user; /再次查看 1.create schema XXX(新数据库); //创建数据库 2.show databases; //展示数据库 3.show databases like 'XX%'(数据库); //展示以XX开头的数据库 4.use XXX; //选择数据库 5.alter database XXX(数据库) //选择数据库名称 default character set utf8 //修改字符集为GBK(或uft8) default collate utf8_general_ci; //修改字符集的校对规则为简体中文,可写可不写 6.drop database demo; //删除数据库 create database XXX character set utf8 collate utf8_general_ci; //一次性创建

    2.引擎

    1.show engines;show engines\g //查询MySQL存储引擎(更多功能) 2.show variables like 'XX%';(数据库) //查询XX数据库默认引擎

    3.数据表

    primary key : 设置主键 auto_increment:自增,自动编号,如果要写字段,会自动生成下一个空的字段 not null: 不为空值 default:新字段默认数据初始值 unique:唯一索引 binary32):32位字符串(二进制) unsigned:自定义类型 1.use XX; create table if exists demo( //创建新表 id int auto_increment primary key comment ‘序号’, // 表示是否有自动编号 是否有 主键(一个数据表只能有一编号和一个主键) comment:备注 name varchar(30) not null, //创建数据表字段 like varchar(30) not null, time datetime); //time 时间类型 2.show columns from XX(数据表) from XX (数据库); //查看表结构 3.use XX; desc XX; //查看表结构

    4.数据表字段

    1.use XX; alter table XX (数据表)add XX (新字段)varchar(30) not null; //添加新字段 2.use XX; alter table XX(原字段) modify XX(新字段) varchar(40); //修改字段类型 3.alter table XX(数据库).XX(数据表) //修改字段名 change column XX (原字段)XX(新字段)varchar(30) null default null; 4.use XX; alter table XX(表名) drop XX(字段名); //删除字段 5.use XX; alter table XX(原表名) rename as XX(新表名); //修改表名 6.use XX ; //复制数据表 create table XX(新数据表名) like XX;(源数据表名) 7.use XX; drop table if exists XX; //删除数据表

    5.运算符

    1.select XX(字段名)+XX(字段名) from XX(数据表) //+ - * /运算符 select id+id from tables1; 2.select XX(字段名),XX(字段名),XX(字段名)=XX(值) from XX(数据表)//比较运算符(=) select id,name,id=2 from tables1; 值: 0 1 02

    6.数据

    1.insert into XX(数据表) values(‘XX’,’XX’,’XX’);(根据字段类型填数据) //插入数据 2.insert into XX(id,name) values(1,'菜七'); //插入一部分数据 3.select * from XX(数据表); se //查数据 4.insert into tables set id='4',name='刘六',slike='rap',time='2000-04-05'; //插入数据 5.update demo.tables2 set slike='足球' where id='4'; //修改数据(修改id为4的slike内容) 6.select * from demo.tables2 where id='4'; //查找某一个数据 7.delete from XX(数据表) where id='4'//删除数据 8.truncate table demo.tables2; //删除数据表所有数据

    7.DML查询数据

    7.1单表查询(从指定表中查询数据)

    1.select * from XX(数据表); //查数据表 2.select XX(字段名),XX(字段名) from XX(数据表) //查找个别数据 3.select * from XX(数据表) where XX='XX'(数据内容) //查找指定数据

    7.1.1模糊查询

    1.select * from XX(数据表) where XX(字段名) in('XX','XX')(数据内容) //用关键字in,如果查询不到的内容输出null 2.select * from XX(数据表) where id between X(1and X(3; //用关键字 between and 范围查询之内的数据 3.select * from XX(数据表) where name like '%三%' //查找有“三”这个字的数据 '三%' //查找以“三”开头的数据 '李%三' //查找以“李”开头“三”结尾的数据 4.select id,name from tables2 where name is null; //查找id和name为空值的数据

    7.1.2比较运算符

    1.select * from tables2 where id=1and name=’张三’; //关键字and多条件 查询(符合条件即可查询) 2.select * from tables2 where id=1or name=’李四’; //符合随便一个条件可查询 3.select distinct name from tables2; //除重(把相同名字除掉)

    7.1.3排序

    1.select* from tables2 order by id descasc; de:降 a:升 //对字段进行排序(升序或降) 2.select* from tables2 order by id asc limit 3; //按id升序排序,显示前3条数据(限制查询)

    7.1.4.分页(缓解数据库压力,提高客户体验)

    在显示的数据表后 写 limit 0,5; //显示1~5条数据 总页数=(数据总数/页面大小)+1

    7.1.5分组

    //SubjectNo:是编号,这两个表都有同一个编号

    7.2聚合函数查询(根据一组数据求一个值)

    1.select count(*) from tables2; //查询数据表有几条数据 2.select sum(id) from tables2; //查询id的总值 3.select avg(id) from tables2; //查询id的平均值 4.select max(id) from tables2; //查询id的最大值 5.select min(id) from tables2; //查询id的最小值

    7.3连接查询(把不同表的记录连到一起)

    1.select bname,book from tables1,tables2 where students.name=b ooks.name; 2.select bname,book,students.id from tables1,tables2 where students.name=books.name;

    //两个表存在连接有name,则把两个表的bname和book连接起来

    7.4子查询(从内到外运算符查询)

    7.5合并查询(并列到一起查询)

    7.6联表查询(join)

    7.7自连接(一张表拆为两张一样的表,树状图)

    pid=1:顶级(父类)

    7.8别名(定义表和字段的别名)

    1.select * from students t where t.name=’张三’; //把students的别名为t,查询张三 2.select name as students_name,id as students_id from students; //把字段name的别名为students_name

    8.MySql函数(一些基础函数)

    8.1数学函数

    1.select abs(5),abs(-5); //求5和 -5的绝对值

    2.select floor(1.5),floor(-2); //返回小于或等于x的最大整数(相当于c语言int 型)

    3.select round(rand()*100),rand(),floor(rand()*100); //随机数

    4.select pi(); //π函数 5.select truncate(2.1234567,3) //f返回2.1234567小数点后3位 6.select round(1.6),round(1.2),round(1.123456,3); //四舍五入 7.select sqrt(16),sqrt(25); //平方根

    8.1字符串函数

    1.select insert(‘mrkej’,3,2,’book’); //将字符串mrkej的第3位后面两位改成book

    61select upper(‘mrasd’),ucase(‘asdasd’) ; //小写变大写 62.select left(‘asdasd’,2); //返回前两个字符 63.select concat('+',rtrim(' asd '),'+'); //去掉asd后面空格

    64.select field(as,’asd’,’asdf’,as); //返回第一个与as相同字符的字符位置

    65.select locate(‘me’,’I love you,you love me.); //查找me的位置 select position(‘me’in’I love you,you love me.); select instr(’I love you,you love me., ‘me’);

    8.3日期时间函数

    1.select curdate(),current_date(); //获取当前日期 2.select curtime(),current_time(); //获取当前时间 3.select now(),current_timestamp(),localtime(),sysdate(); //获取当前时间日期 4.select datediff(‘2019-09-05’,’2011-07-01’); //获取时间间隔天数 5.select adddate(‘2020-09-05’,3); //返回+3天的日期 6.select adddate(‘2017-11-30 23:59:59’,interual ‘1:2’ year_month);//返回+1年2个月的日期

    7.select adddate(‘2017-11-30 23:59:59’,interual ‘1’ year); //返回+1年的日期 8.select subdate(‘2017-07-09’,6); //返回-6天的日期

    8.4判断条件函数

    1. select id,slike, case when id>3 then 'Very Good' when id<3 and id>1 then 'perfect' else 'not good' end llll from tables2; //判断id如果大于3,则Very Good;id小于3大于1,则perfect,否则notgood

    8.5系统信息函数

    1.select version(),connection_id(); //查询版本号和连接数;

    2.select database(),schema(); //查询当前使用的数据库 3.select user(),system_user(),session_user();

    4.select charset(‘aa’),collation(‘aa’); //获取字符串的字符集

    8.6加密函数

    1.select password(‘absc’)//对absc进行加密(用于用户密码) 2.select md5(‘absc’); //对absc进行加密(用于普通数据)

    8.7其他函数

    1.select format(235.3456,3); //保留小数点后3位(四舍五入) 2(77).select charset(‘abc’),charset(convert(‘abc’ using gbk)); 3.select time,cast(time as date),convert(time(数据表里面的),time) from tables2; //改变字段数据类型,time改成date

    9.索引(查询时更快查询到需索引的文件,提高了查询效率)

    没加索引前,是遍历。加了索引后是定位

    9.1创建索引

    9.1.1在建立数据表时创建索引

    create table tables3( id int(11) auto_increment primary key not null; name varchar(50) not null; math int(5) not null; index(id)); //普通索引:无限制条件的索引,根据该索引查询即可 //unique index address(id asc)); //唯一索引:索引的值必须唯一,主键是一个特殊唯一索引 //fulltext key tables3_name(name))engine=myisam;//全文索引:只能用在字符型的字段上,查询较大字符串类型的字段 //index math_num(math(20))); //单列索引:只对应一个字段的索引 //index info(name,id)); //多列索引:对多个字段的索引 //spatlal index zijian(good))engine=myisam; //空间索引:只建立在空间数据类型上 good geometry(空间数据类型) not null show create table score; //查看表结构

    9.1.2.在已建立数据表时创建索引

    use demo create index t_info on tables2(id); //普通索引 create unique index t_info on tables2(id); //唯一索引 create fulltext index t_info on tables2(id); //全文索引 create index t_info on tables2(name(4)); //单列索引 create index t_info on tables2(name,id); //多列索引 create spatial index t_info on tables2(good); //空间索引 drop index id ont_info; //删除索引

    9.2索引原则

    不是索引越多越好不要对进程变动数据加索引小数据量的表不需要加索引索引一般加在常用来查询的的字段上

    9.3索引背后的数据结构(之后研究)

    索引(Index)是帮助MySQL高效获取数据的数据结构,本质:索引是数据结构不用索引为遍历,时间复杂度为O(n)(在大数据会很慢)

    10.视图(虚拟表,方便操作且有安全权限)

    1.select select_priv,create_view_priv from mysql.user where user=’root’;//查询是否有创建视图的权限 2.ues demo //在tables1表中创建视图view1 create view //如果有出错,就把没权限建的字段给删掉,看错误代码 View1(v_id,v_name,v_like) As select id,name,like From tables1; 3.describe view1; //查看视图 4.show table status like ‘view1’ //查看视图信息 5.show create view view1; //查看视图详细定义 Select * from view1; //查看视图数据 6.create or replace //修改视图字段 view view1(v_id,v_name) as select id,name from tables2; 7.alter view view1(v_name) //删除视图字段 As select name From tables1 With check option; 8.update view1 set v_name=’张张三’where id=1; //修改字符数据(数据表也会发生变化) //有些数据类型不能修改 9.drop view if exists view1; //删除视图

    11.数据完整性约束

    11.1实体完整性

    1.id int auto_increment, //自增 2.primary key (id,classid); //主键由表中某一列构成,可以设置两个主键(但是id还是唯一主键,如96一样,classid还是正常打) 3.user vachar(4) not null unique; //如果user不会重复,则可以成为候选主键

    11.2参照完整性(不推荐使用外键)

    1.两个表: 学生(学号,姓名,性别,生日,班级编号) //下划线为主键,班级编号为外键,正在创建的表 班级(班级编号,班级名称) //已经形成的表,且设置外键拒绝删除或更新

    create table student( id int auto_increment, name varchar(40) not null, sex varchar(2), classid int not null. Birthday date, Primary key(id))engine=innodb default charse=utf8 Alter table student add constraint fk_classid foreign key(classid) references class(classid); //添加外键

    11.3用户定义完整性

    1.not null //建表定义非空约束 2.age int check(age>6 and age<18) //定义限制条件约束 3.check(classid in(select id from class)); //对表实施check约束,限制class表中classid字段的值只能是class表中id字段的某一个id值

    11.4命名完整性约束

    对完整性约束进行添加修改删除等操作,需要添加constraint语句

    11.5更新完整性约束

    1.alter table tables1 drop foreign key classid; //删除外键约束 primary key id; //删除主键约束 index name //删除候选键约束 2.alter table student drop foreign key classid; //修改完整性约束 先删除(联级删除) alter table student add constraint classid foreign key (classid) //再修改(联级修改) aeferences class(id) on delete cascade on update cascade;

    12. DML语言(数据库操作语言)

    12.1 Insert(插入语句,添加)

    1.Insert into `demo` values(1,’张三’,’跳舞’,2000-2-5)

    12.2 Update(修改语句)

    1.Update `tables1` set ‘name=上山’where id=1; 2.Update `tables1` set ‘name=上山’; //如果不指定主键,将会改变所有表name值

    12.3 Delete(删除)

    1.delete from `tables1` where id=1; 2.truncate `tables1`; //清空表,重新设置自增列(如果用delete删除表,则会有空白列),不会影响事务,比delete叼

    12.3.1 delete删除问题

    InnoDB引擎:自增列会从1开始(存在内存当中,断电即失) MyISAM引擎:继续从上一个自增量开始(自增列还在)(存文件中,不会丢失)

    13.事务(sql执行事件,要么都成功,要么都失败)

    将一组SQL放在批次中去执行 ACID原则:是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).

    13.1 原子性

    原子性意味着数据库中的事务执行是作为原子(针对一个事务)。即不可再分,整个语句要么执行,要么不执行。

    13.2 一致性

    即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,针对一个事务操作前与操作后的状态一致

    13.3 隔离性

    事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。针对多个用户同时操作,主要是排除其他事务对本次事务的影响。

    13.3.1隔离性的级别:

    13.4 持久性

    意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。表示事务结束后的数据不随着外界原因导致数据丢失。

    13.5 步骤

    set autocommit=0//关闭 /*默认开启事务自动提交 set autocommit=1//开启 */

    手动处理事务: set autocommit=0 //关闭自动提交 事务开启: start transaction insert XX 提交:一旦提交持久化(成功) commit 回滚:回到原来的样子(失败) rollback 事务结束: Set autocommit=1 //开始自动提交

    13.5.1需了解:

    savepoint 保存点名 //设置一个事务的保存点 rollback to savepoint 保存点名 //回滚到保存点 release savepoint 保存点名 //撤销指定的保存点

    13.6 具体步骤

    create database shop character set utf8 collate utf8_general_ci; use shop; create table `account`( `id` int(3) not null auto_increment, `name` varchar(30) not null, `money` decimal(9,2) not null, //decimal 代表一个九位数,其中小数位是两位 Primary key (`id`)engine=innodb default charset=utf8; //INNODB引擎 能支持事务 Insert into account(`name`,`money`) values (‘A’,2000.00),(‘B’,10000.00); 模拟转账:事务 Set autocommit = 0; start transaction update acount set money=money-500 where `name`=’A’; //A减500 update acount set money=money+500 where `name=’B’; //在使用mysql执行update的时候,如果不是用主键当where语句,会报错误,使用主键用于where语句中正常,则需执行命令SET SQL_SAFE_UPDATES = 0;修改下数据库模式。 如果想要提高数据库安全等级,可以在恢复回原有的设置,执行命令:SET SQL_SAFE_UPDATES = 1; commit; rollback; set autocommit=1;

    14.权限管理和备份

    14.1用户管理

    1.Create user zhangyijian(用户名) identified by123456’(密码); //创建用户 2.Set password=password(123456); //修改当前用户新密码 3.Set password for root =password(123456); //修改指定用户密码 4.Rename user zhangyijian(原名) to root1(新名); //重命名 5.Grant all privileges *.*(数据库.表) to zhangyijian(用户); //给指定用户的所有库和表受全部权限 6.Show grants for root@localhost(root需要加@localhost,其他用户不需要); //查看指定用户的权限 7.Revoke all privileges on *.* from zhangyijian(用户); //撤销用户的权限 8.Drop user zhangyijian; //删除用户

    14.2备份

    1.直接拷贝物理文件 2.Mysql workbench可视化工具导出 3.使用命令行导出mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 >物理磁盘位置

    15.规范数据库设计

    15.1当数据库比较复杂的时候,就需要设计

    糟糕的数据库设计:

    数据冗余,浪费时间数据库插入和删除都会出现麻烦和异常(屏蔽使用物理外键)程序的性能差 良好的数据库设计:节省内存空间保证数据库的完整性方便开发系统

    设计: 分析需求:分析业务和需要处理的数据库的需求 概要设计:设计关系图E-R图(流程图) 个人博客:

    收集信息,分析需求 用户表:(用户登陆注销,个人信息。写博客,创建分类)user 分类表:(文章分类)category 文章表:(文章信息)blog 评论表:(评论信息)comment 友链表:(友链信息)links 关注表:(关注人数,粉丝人数)follow 自定义表:(系统信息,某个关键的字)标识实体(把需求落地到每个字段,真正设计表) 标识实体之间的关系 写博客(需要的表):user->blog 创建分类:user->categoy 评论:user->blog->comment 友链:links 关注:user->follow

    15.2 三大范式(规范数据库的设计)

    如果没有规范,则可能出现:信息重复,更新异常,插入异常,删除异常

    15.2.1规范性与性能的问题

    关联查询的表不得超过3张表:大表分小表,每个表都关联,范式越高,性能越渣

    考虑商业化的需求和目标(成本、用户体验)数据库的性能更重要在规范性能的问题的时候,需要适当的考虑一下规范问题故意给某些表增加一些冗余的字段。(从多表查询变为单标查询)->提高用户体验故意增加有些计算列(从大数据量降低为小数据量的查询:索引)->提高用户体验

    第一范式(1NF) 原子性:列不能够再分成其他几列; //上表不满足 //上表满足

    第二范式(2NF) 前提:满足第一范式 每张表只描述一件事情 //上表不满足产品与订单号有关,与订单金额和时间无关,需拆两张表 //上表满足

    第三范式(3NF) 前提:满足第二范式 数据需要和主键直接相关,不能间接相关(消除传递依赖) //上表不满足,所有属性都依赖于学号,满足第二范式,但是‘班主任性别’和‘班主任年龄’直接依赖的是‘班主任姓名’ //上表满足

    16.JDBC

    16.1数据库驱动

    JDBC(java database connect)

    SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个java操作数据库的规范(JDBC)。 对于开发人员,掌握JDBC接口的操作即可

    16.2 IDEA连接数据库

    1.创建普通项目 2.导入数据库驱动(在directory创建lib文件,把jar包粘贴进去,再lib包右键add as library) 3.加载驱动(DriverManager)

    Class.forName("com.mysql.cj.jdbc.Driver");

    4.连接数据库

    Connection con= DriverManager.getConnection("jdbc:mysql://172.29.40.73:3306/demo?serverTimezone=UTC","root","123456");

    5.执行sql对象(查询)

    Statement statement=con.createStatement(); //执行sql的对象statement String sql="SELECT * FROM tables1";

    Statement:代表数据库。用于向数据库发送SQL语句,相当于数据库命令行(增删改查等等)

    //statement.executeQuery(); //查询操作,返回结果集,封装了所有的查询结果 //statement.execute(); //执行任何sql //statement.executeUpdate(); //更新、插入、删除。都是用这个。返回一个受影响的行数 Statement statement=con.createStatement(); String sql=”insert into tables1 values(1,’张三’,‘跳舞’,‘2000-2-5); Int num= statement.executeUpdate(sql); If(num>0){ sout(“插入成功!”)} Statement statement=con.createStatement(); String sql=”delete from tables1 where id=1; Int num= statement.executeUpdate(sql); If(num>0){ sout(“删除成功!”)} Statement statement=con.createStatement(); String sql=”update tables1 set name=’张张’ where name=’张三’”; Int num= statement.executeUpdate(sql); If(num>0){ sout(“修改成功!”)}

    6.返回结果集

    ResultSet resultSet=statement.executeQuery(sql); //返回结果集 while (resultSet.next()){ System.out.println("id="+resultSet.getObject("id")); System.out.println("id="+resultSet.getObject("name")); System.out.println("id="+resultSet.getObject("like")); System.out.println("id="+resultSet.getObject("time")); } //resultSet.getObject();//在不知道列的数据类型用这个 //resultSet.getInt(); //resultSet.next(); //移动到下一行 //resultSet.absolute(row);//移动到指定行

    7.关闭(最后用的先关闭)

    resultSet.close(); statement.close(); con.close();

    16.3 代码实现(增删改查)

    1.创建一个配置文件,放到src里面;

    2.创建一个类(JdbcUtils),实现调用配置文件(properties) (1)

    statictry{ //实现代码 }

    (2)用输入流(读文件)读取配置文件:

    InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties配置");

    (3)创建properties类

    Properties properties=new Properties();

    (4)把输入流in(配置文件)传入到properties类中

    properties.load(in);

    (5)定义配置文件里面的内容

    private static String driver=null; private static String url=null; private static String username=null; private static String passwowrd=null;

    (6)在try catch语句中给配置文件赋值

    driver=properties.getProperty("driver"); url=properties.getProperty("url"); username=properties.getProperty("username"); passwowrd=properties.getProperty("passwowrd");

    (7)加载驱动

    Class.forName(driver);

    (8)连接数据库

    public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,passwowrd); }

    (9)释放连接

    public static void release(Connection connection, Statement statement, ResultSet resultSet){ if(resultSet!=null){ try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }

    3.创建testInset类(main函数,添加) (1)赋空值

    Connection connection=null; Statement statement=null; ResultSet resultSet=null;

    (2)连接并使用sql语句(自动生成try catch)

    connection=JdbcUtils.getConnection(); statement=connection.createStatement(); String sql="INSERT INTO tables1 VALUES(10,'涨涨','跳跳','2000-05-05')"; int i=statement.executeUpdate(sql); if(i>0){ System.out.println("插入成功"); }

    (3)添加finally,关闭链接(因为暂时没用到resultset(集合),所以为null)

    finally { JdbcUtils.release(connection,statement,null); }

    4 .创建testdelete类(main函数,删除) 与testinsert基本一样,改变sql语句即可

    5 . 创建testupdate类(main函数,修改) 与testinsert基本一样,改变sql语句即可 6 . 创建testselect类(main函数,查询) 需要resultset

    16.4 sql注入问题(漏洞,会被攻击导致数据泄露—SQL会被or拼接)

    通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

    username,like 判断 等于空或等于1=1(真) 则输出

    正常是只输出张三和篮球 这却全部输出

    由于Statement不安全,则由PreparedStatment对象,可以防止SQL注入,效率也更高(防止注入sql的本质,把传递进来的参数当成字符,假设其中存在转义字符,就直接忽略,“ ’” 会被直接转义)

    16.5 PreparedStatement(防止SQL注入)

    Mbatis涉及

    16.6 IDEA连接数据库

    16.7 JDBC操作事务

    16.8 连接池操作(DataSource接口)

    数据库连接 — 执行功能 —释放 每次都连接到释放 十分浪费系统资源 池化技术:装备一些预先的资源,过来就连接预先准备好的。 例子:一个人管理银行: 开门----接待—关门 耗时耗神 连接池:有接待员: 开门----接待员:等待—关门 常用连接数(接待员)10个,则最小连接数为10个 可设置最大连接数 100个 等待超时:100ms,自动断

    开源数据源实现: DBCP,C3P0,Druid(阿里巴巴) 使用了这些数据库连接池后,我们在项目开发中就不需要编写连接数据库的代码 DBCP

    下载两个jar包:pool,dbcp http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi http://commons.apache.org/proper/commons-pool/download_pool.cgi导入到IDEA项目中配置文件
    Processed: 0.023, SQL: 9