1.关于mysql数据库
(1)概述
DBMS数据库管理系统,用来管理数据库,执行sql语句的东西,Mysql,oracle,sqlite这些严格来说不是数据库而是数据库管理系统,其中Mysql最常用,而且最重要的是,它免费
MYsql的下载方法自行查阅官网,建议使用msi的下载方式,zip的下载方式需要配置很多东西
另外 mysql默认占据的端口应该都是3306,这一点会在后面提到
db数据库,存储数据,一般是db文件,数据库/表/字段,大概就是这个逻辑
字段,就是column
数据,就是row
(2)可视化工具Navicat的下载
可视化工具navicat,是一种方便进行数据库操作的可视化工具,这年头谁想不开啊天天写sql。。。不过这个东西的使用方式很折磨人,这里提供两种使用方式(对应Navicat 15版本)
1.第一种,就是简单改一下注册表,原理相当于每次都重新下载,方法为:
命令窗口输入regedit,进入注册表页面
然后按照USER--->SoftWare--->PremiumSoft,这个文件夹下面就是navicat软件的注册信息,把这些删掉,就能重置日期
弊端就是,每次创建的链接都无法保存
第二种方法
诺,就长这样的一个小东西
在使用注册机的时候要注意几个问题
1.这个exe文件必须和你下载完的navicat.exe存在于同一个路径内,方便进行patch
2.在操作的时候,记得一定不要打开navicat!!!!,如果打开过了,按照上面说的方法,把注册表信息删除掉。先进入注册机页面,点击patch,获取版本以后,再进行各种操作
3.在操作过程中记得断网
(这方法还是有点问题的。。。反正我是成功了捏:D)
(3)基础指令
基础指令要记住的一个东西:(没啥办法就要记住)
DQL数据库查询语言:select
DML数据库管理语言:数据的增删改 insert delete update
DDL数据库结构语言:表结构的增删改:create drop alter
TCL数据库事物管理语言:commit rollback
DCL权限控制语言:grant授权 revoke撤销权限
基本的操作语言:(后续会补充)
1.数据库的操作
use databasename;//使用/切换到某某数据库
show xx;//展示数据库/表
exit 退出;
create xx;//创建表/数据库
2.查询语句中常用的
select * from table,从数据库中查询所有字段
select a,b form table 从数据库中查询ab两个字段
select a*10 from table 数据库中查询a字段并且将返回结果✖10
select a as unbbr from table / select a 'unbbr' from table; 从数据库里面查询a字段并且把a字段显示为unbbr
条件查询 关键字where,里面有很多逻辑符号
select * from table where id =1 从数据库中查询所有字段里面 id字段为1的数据
select * from table where id between 1 to 10 从数据库里面查询id为1到10之间的数据
select * from table where id is null/is not null 从数据库里查询id为空或者id不是空的数据
select * from table where id in (1,2,3)/ not in (1,2,3) 从数据库里查询id为1,2,3或者id不是1,2,3其中一个的数据
模糊查询 关键词like 类似正则匹配,%代表任意个字符 _代表某个字符
select * from table whiere id like '%3' 查询数据库中,id末尾数字为3的数据
查询结果排序
select * from table order by id asc,name desc;先按id升序的顺序排列,如果id相等,就按name降序排列
一般默认是按升序排列的(asc强制升序,desc强制降序)
上述的综合应用select * from human where name > 1 order by id desc;查找所有名字大于一,按id降序进行排列
2.关于JDBC
(1)概述
jdbc:java database control(java数据库控制,我记得应该是这个的缩写。。。还是connection来着?)是java的一个API库,用来完成java和数据库的对接。
注意一个问题,在使用jdbc的时候,首先要导入一个jar包,这个jar包在mysql的官网应该是可以下载到的,MySQL :: Download Connector/J
解压以后,找到文件里面的jar包即可,其他的不用管,建一个文件夹,扔到你的项目里
然后右键jar包,点击add as library,然后选择起作用的范围,即可
(2)五个主要实现功能的接口/类,以及对应的函数
//jdbcAPI主要的知识点其实就五个
//DriverManager
//Connection
//Statement
//PreparedStatement 预处理sql执行对象
//ResultSet 结果处理集
DriverManager,驱动管理类,这个东西的作用有两个,注册驱动,和创建连接对象
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//这个注册驱动已经被class类解决掉了(深入了解请看反射)
//这里只要简单声明一下就可以了
//创建链接 协议:地址:端口号:数据库名字
//下面这个也是链接你本机的Mysql的方式
String url="jdbc:mysql://127.0.0.1:3306/textsql(1)";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
connection,作用1生成执行对象,作用2控制TCL
注意一下commit的提交时间,应该是在statement执行对象执行完sql语句以后,再进行提交(这个后面学到TCL的时候再回来补充原理,现在还不太懂)
//connection对象有两个功能,一个是生成sql执行对象,另一个是负责事务管理(就是TCL语言)
//事务管理主要就是管理提交和commit和rollback,除此之外因为mysql是自动提交的
conn.setAutoCommit(false);//我们可以手动设置不自动提交,
//那么下面就要在执行完sql语句以后进行提交
conn.commit();//如果关闭了就要手动开启事务,事务提交在sql语句执行后
//如果开启了自动执行,那么就是在sql执行对象执行完sql语句后,自动把当前事务进行提交
conn.rollback();//这一步的效果就是原本改完的事件,又回滚回去了
statement对象,用来执行sql语句
//第三步sql执行对象:
Statement stat=conn.createStatement();
//sql执行对象一共有三种
//第四步准备sql语句
String sql_dql="select * form human";
String sql_DML="update human set name = 1245 where id = 1";
//第五步执行sql语句
int count=stat.executeUpdate(sql_DML);//这里显示的是处理了几条数据
//sql执行对象根据执行语言的不同,返回不一样的东西,执行DML和DDL返回的是数字,代表处理的数
//执行DQL返回的是一个resultSet对象,需要我们进一步手动处理
不过这样的话,不防止sql注入的情况,sql注入大致就是这个东西
String sql1="select * from human where id="+"userid"+" and name="+"username";
//这个sql语句想要表达的就是查询是否有id,name符合输入的userid和username的情况
//里面的逻辑控制控制为 id=userid and name=username,就能正常登入(查到数据);
//比如说我们输入的东西userid是jntm,username为ikun
//生成的sql语句就是这样的
// select * from human where id='jntm' and name = 'ikun';
//虽然这样仍然是没啥问题,但是比如说,我们要在username的位置输入一个 (' or '1'='1)
//sql语句就会变成
// select * from human where id='jntm' and name = '' or '1'='1';
//这样无论如何都能成功查询出所有数据了
//所以说为了防止这种sql攻击,我们不能把输入和原本的sql语句一起编译
//先把sql语句的框架确定下来,输入的东西统统视为字符串,就能防止注入了
为了防止sql注入,我们使用PreparedStatement对象,来替代Statement对象
//正常的statementsql提交对象应该是先完成sql拼接,然后执行,提交
//PreparedStatement应该是先临时编译一下sql语句,等待预留位置填满以后,再进行提交
//简单演示一下这玩意的用法
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/textsql(1)","root","123456");
String sql2="select * from human where id= ? and name= ?";
//防止sql注入的方法是对敏感字符进行转义处理,真正意义上变成一段字符串
PreparedStatement ps=conn.prepareStatement(sql2);//先进行预处理
ps.setInt(1,2);//第一个问号那里为 整数 2
ps.setInt(2,3);//第二个问号那里为 整数 3
ResultSet r=ps.executeQuery();//这里就不用写sql语句了,因为已经注入了
//最后记得关闭资源
最后一个,关于DQL语句的查询结果,我们一般使用ResultSet接受,这个对象接收回来以后可以理解为存了一个矩阵;
里面内置了两个方法1.next()迭代器方法 2,getXxx(字段序号)/(字段名称)
next指向行,get方法指向列,行列同时定位数据,可以这样理解
ResultSet resultSet=stat.executeQuery("select * from human");
while(resultSet.next()){
int name=resultSet.getInt(1);
int id =resultSet.getInt("id");//这个方法是重载的,可以是字段名字,也可以是字段序号
String sex=resultSet.getString(3);
int address =resultSet.getInt(4);
System.out.println(name+"-"+id+"-"+sex+"-"+address);
}
(3)具体的连接步骤
这里直接上完整的代码算了:
//第一步注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//第二步创建链接 协议:地址:端口号:数据库名字
String url="jdbc:mysql://127.0.0.1:3306/textsql(1)";
String username="root";
String password="123456";
Connection conn= DriverManager.getConnection(url,username,password);
conn.setAutoCommit(false);//我们可以手动设置不自动提交,
//那么下面就要在执行完sql语句以后进行提交(很重要)
//第三步sql执行对象:
Statement stat=conn.createStatement();
//sql执行对象一共有三种,这里用最简单的
//第四步准备sql语句
String sql_dql="select * form human";
String sql_DML="update human set name = 1245 where id = 1";
//第五步执行sql语句
int count=stat.executeUpdate(sql_DML);//这里显示的是处理了几条数据
//sql执行对象根据执行语言的不同,返回不一样的东西,执行DML和DDL返回的是数字,代表处理的数目
//执行DQL返回的是一个resultSet对象,需要我们进一步手动处理
conn.commit();//如果关闭了就要手动开启事务,事务提交在sql语句执行后
//如果开启了自动执行,那么就是在sql执行对象执行完sql语句后,自动把当前事务进行提交
conn.rollback();//这一步的效果就是原本改完的事件,又回滚回去了
//第六步返回对象
//第七步释放资源
stat.close();
conn.close();