增删改查写久了,发现写这些实在是太无聊了,应得到进步,用更高的技术突破一切。
也使得我成长了,思考怎么写出简短易懂而且高效率的代码,减少机器码,减少寻址跳转。
学习了很多语言,怎么把它们的价值体现出来,用它们来挣钱,这是个问题。
当初我看到吾爱破解,就想做一个收费的破解网站,专门卖破解资源。
看到炉石脚本,写一个游戏脚本帮别人刷游戏资源。
看到SSR,不如自己搭建一个机场挣钱。
看到手机APP,手机监控电脑,把数据实时发给电脑进行分析。
看到爬虫接单,但是又看到违法。
看到网站插件,又想写网站插件。
实际上我一个都没有做成。
计算机语言应该从实际需求出发,不然做出来的东西很快就会被淘汰。
我看到技术不断的更新,我前年才学,今年就4-5个版本了,计算机语言变得越来越抽象越简易了。
我的领悟
从改善生活的角度出发,而不是写一些骗人的东西,把简单的东西做的太过复杂。
MySQL
作为可以免费的使用的数据库,驱动好找,而且在不断更新。
现属于美国加州红木城Oracle(甲骨文)公司旗下产品,主要商业竞争对手为微软和IBM。
所以微软的VS-Code没有Java工具,得额外下一个Intellij或MyEclipse代码工具
MySQL起源于1995年瑞典乌普萨拉的一家公司名称MySQL AB,特点是代码开源。
2008年1月16日,MySQL AB宣布以约十亿美元被sun公司收购。
2009年, Oracle利用股份收购了sun(Sun Microsystems,因为1995年,它开发了java语言)公司。
因为一直是白嫖,现在才知道可以靠CRM,ERP管理系统挣钱。
MySQL被称为关系数据库管理系统
我理解的关系为数据和数据之间可以建立逻辑,就是主键和外键的逻辑。
这是没有关系数据库做不到的东西,无关系数据库强调的是快。
关系数据库强调的是数据之间的逻辑,事务,业务关系更加方便的处理业务。
MySQL5.X和MySQL8.X的区别
5.x系列有5.0-5.7,8.x系列只有8.0.x版本, 直接跳到8是因为,本来是6和7计划发布的功能,
直接集成到了8上面。
5.x我认为最主要的就是密码的加密方式,8.x移除了password函数,默认采用sha256函数加密
5.x修改root的密码
update mysql.user set authentication_string = PASSWORD('ABC1234567') where user = 'Hao'
含义
update mysql.user set authentication_string = PASSWORD('新密码') where user = '指定用户名'
8.x修改root的密码
alter user 'Hao'@'%' IDENTIFIED WITH caching_sha2_password BY 'ABC1234567'
疑惑这种新的alter的用法,还可以用于修改密码
修改 '用户'@'主机' 智能识别字段 加密方式 by (新密码)
8.x默认是caching_sha2_password,基于sha256的加密,升级了密码的保护程度
5.x默认是mysql_native_password,基于sha1的加密,sha1的加密据说可靠性不强
如果不使用flush privileges刷新权限,那么就需要重启MySQL服务端
据说比上个5.x版本快了两倍的查询速度。
MySQL指定IP进行访问
5.x新增一个用户并且授予所有权限给它
GRANT ALL PRIVILEGES ON *.* TO 'Hao'@'%' IDENTIFIED BY 'ABC123456' WITH GRANT OPTION;
含义
GRANT ALL PRIVILEGES ON (库名.表名/.代表所有) TO '新用户名'@'IP地址,不限定用%' IDENTIFIED BY '新用户的密码' WITH GRANT OPTION;
8.x因为新增系统权限不能一次性把所有权限给新用户,要分开写
CREATE USER 'Hao'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'ABC123456';
GRANT ALL PRIVILEGES ON *.* TO 'Hao'@'localhost';
含义
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'指定ip/%指不限制ip';
mysql常见操作
show plugins;//查看已安装的插件
show variables like '%basedir%';//当前软件的路径
show variables Like '%datadir%';//当前数据库的存放路径,修改my.ini再重启
Table
MySQL分为库和表。CURD指的是Creat,Update,Retrieve,Delete
意思 | 英文 | 发音 |
---|---|---|
修改 | Al-ter | [‘ɔːltə(r)] |
丢弃 | Dro-p | [drɒp] |
创造 | C-reate | [kri’eɪt] |
基础 | Pri-mary | [ˈpraɪmeri] |
增量 | In-c-re-ment | [‘ɪŋkrɪmənt] |
特殊 | U-ni-que | [juˈniːk] |
列 | Co-lu-mn | [ˈkɑːləm] |
从 | F-rom | [frəm] |
模式 | Pa-ttern | [‘pætərn] |
插入 | In-sert | [‘ɪn.sɜrt] |
外来的 | Fo-reign | [‘fɔrən] |
默认 | De-fault | [dɪ’fɔ:lt] |
存储 | S-to-rage | [‘stɔrɪdʒ] |
引擎 | En-gine | [‘endʒɪn] |
参考 | Re-fe-ren-ce | [‘ref(ə)rəns] |
级联,小瀑布 | Ca-s-cade | [kæ’skeɪd] |
优先 | P-rio-rity | [praɪ’ɒrəti] |
团体,小组 | G-rou-p | [ɡruːp] |
指挥 | Or-der | [‘ɔrdər] |
限制 | Li-mit | [‘lɪmɪt] |
内心的;内部 | In-ner | [‘ɪnə(r)] |
外在的;外部 | Ou-ter | [‘aʊtər] |
清空,截断 | Tr-un-cate | [‘trʌŋ.keɪt] |
约束 | Con-s-train-t | [kən’streɪnt] |
注释 | Com-ment | [‘kɒment] |
限制 | Re-s-tri-c-t | [rɪˈstrɪkt] |
联合 | U-ni-on | [ˈjuːniən] |
当初我学习数据库一直分不清外键,为什么要外键?是帖子对应多个用户,还是用户对于多个帖子?
可能是长期接触唯物主义,搞得我忘记了以人为本,当然人是主表,用户是主表。
什么是外键?
外键是一个约束,一个表添加约束规则后,在更新和删除时便会触发这个约束——有4个选项。
本表添加一个外键,意味至少有一个从表,本表会自动监听从表的行为。
1.CASCADE
,本表跟着指定的外键表的值更新或删除时,本表的值跟随更新和删除。
2.SET NULL
,本表跟着指定的外键表的值更新或删除时,本表的值设置为NULL
3.RESTRICT
,本表跟着指定的外键表的值更新或删除时,只有外键表的值被删除,本表值才能变。
4.NO ACTION
,本表跟着指定的外键表的值更新或删除时,只有外键表的值被删除,本表值才能变。
在Navicate里面设置为空默认为RESTRICT
。
例如:
一个有学生(身体信息),有学生档案(家庭信息),考试档案(分数信息)
分成了三个表,一个分数可以对照多个学生,一个阶级也可以对照多个学生,等等。
这时疑惑就来了,要不要搞个分数表或者阶级表。可以搞。
我要注意的是外键的作用。外键可以监听别的表发生变化,并使自身发生变化。
外键可以使表关联起来,并且可以一对多,多对多。
多表左右拼接的join
网页请求数据库,希望返回指定的数据,通常由多个表进行构成。
查询 左表.数据
右表.数据
左表
join 右表
on 条件
inner join 两个表都有数据才返回数据,只要符合条件
left join 如果左表有数据,无视右表是否含有数据,只要符合条件
right join 无视匹配条件,无视左表是否含有数据,只要符合条件
隐式转换
mysql查询会自动转换类型,字符串转成数字没加双引号,
可能msql会把数据库中的值也转成数字进行配对,转换总是耗时的。
多表上下拼接的 union
有从左往右进行拼接的join
语句,也有从上往下进行拼接的union
语句
自动统计去重复的group by
group by
列名,便会自动把列值重复的去掉
索引
像事务一样,从来没有接触过。
JAVA
JAVA语言是一门跨平台的语言,所谓的面向对象,只是编译器的限制而已。
好在使用注解去节省机械式的代码,整合了多种常用函数和结构体,
缺点是没有typedef,类型名又特别长,一堆废话。
1.配置JAVA环境变量
变量1
JAVA_HOME = JDK的的目录(C:\Program Files\Java\jdk1.8.0_181)
因为Tomcat还有其它java软件会用到这个变量,不能省略直接配置到Path里面
在CMD窗口输入set JAVA_HOME就能看到你设置的JDK的目录,set也可以用于修改目录
变量2
CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
dt.jar是运行环境类库,主要是Swing包, 用不到开发java图形可以不添加
tools.jar是编译和执行工具, 必须添加
变量3
PATH = %JAVA_HOME%\bin\
使用javac即可测试出来,PATH是用来搜索所执行的可执行文件路径的
DAO(DataAccessObjects)模式
其被称为数据进程访问对象, 所谓的面向对象的设计模式,在我看来分为四部分。
Druid/BaseDao = 数据连接函数, 提供了一个socket对象与数据库通信
//引自菜鸟教程,改写了注释
public class BaseDao {
//相当于C的lib库,一个*.h文件
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://127.0.0.1:3306/epet";
private static String user="root";
private static String password="root";
static {
try {
//把指定的代码函数字节码文件加载到内存
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throws SQLException {
if(rs!=null) {
rs.close();
}
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
}
public int executeSQL(String preparedSql, Object[] param) throws ClassNotFoundException {
Connection conn = null;
PreparedStatement pstmt = null;
/* 处理SQL,执行SQL */
try {
conn = getConnection(); // 拦截了端口协议的数据
pstmt = conn.prepareStatement(preparedSql); // 构建一条SQL语句对象
if (param != null) {
for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数
}
}
ResultSet num = pstmt.executeQuery(); // 把SQL语句发给MySQL然后得到结果
} catch (SQLException e) {
e.printStackTrace(); // 处理SQLException异常
} finally {
try {
BaseDao.closeAll(conn, pstmt, null);//断开连接
} catch (SQLException e) {
e.printStackTrace();
}
}
return 0;
}
}
Entity = 结构体函数,被JAVA称为类,用来映射数据库表里面的每列数据
//我刚学的时候疑惑写那么多get/set这不是吃了没事做吗
//虽然JAVA是高级语言,但它的结构体赋值用的一点都不爽,对我看来这是冗余
public class Pet {
private Integer id;
private Integer ownerId; //主人ID
private Integer storeId; //商店ID
private String name; //姓名
private String typeName; //类型
private int health; //健康值
private int love; //爱心值
private Date birthday; //生日
}
Interface(本义是面向对象,被中文翻译为接口) = 规范函数的功能
//Interface在计算机机器语言中是不存在的,只是编译器的限制方式
public interface PetDao {
/**
* 查询所有宠物
*/
List<Pet> findAllPets() throws Exception;
}
对Interface的实现称为xxx-Impl
public class PetDaoImpl extends BaseDao implements PetDao {
/**
* 查询所有宠物
*/
public List findAllPets() throws Exception {
Connection conn=BaseDao.getConnection();
String sql="select * from pet";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
List petList = new ArrayList();
while(rs.next()) {
Pet pet=new Pet(
rs.getInt("id"),
rs.getInt("owner_id"),
rs.getInt("store_id"),
rs.getString("name"),
rs.getString("type_name"),
rs.getInt("health"),
rs.getInt("love"),
rs.getDate("birthday")
);
petList.add(pet);
}
BaseDao.closeAll(conn, stmt, rs);
return petList;
}
}
DAO模式是最原始易懂的增删改查数据库的一种方式
发现DAO有很多可以改进的地方
1.第一Socket通信层
同一时间有多条SQL语句执行, 每次都要GET和CLOSE进行重复发包,而这是效率低下的。
因为这是计算机,而不是一次性的杯子,完全可以反复利用第一个创建的连接对象。
如果1分钟没有SQL语句执行,可以告诉计算机进行CLOSE端口。
还有就是通信是要等待回应的,在等待的时间,可以把下一条SQL语句发过去。
可以利用线程,创建多个预通信对象(就是协议包,不是创建多个端口),提升SQL语句的执行效率。
2010-11-15年阿里巴巴的Druid,号称是Java语言中最好的数据库连接池,就改进了这些功能。
1.并且提供了网页的方式查看SQL语句的执行类型和执行时间
2.连接密码加密
GitHub - alibaba/druid: 阿里巴巴计算平台事业部出品,为监控而生的数据库连接池
怀疑写这个喜欢Druid/德鲁伊,魔兽玩家
2.参数的获取和设置
什么getInt,getsString这毫无意义,要是每个表写一遍,我炸裂。
hibernate,澳大利亚墨尔本一位名为Gavin King的27岁的程序员开发的
mybatis(原名为iBATIS = “internet”和“abatis”,apache下的一个产品,2010年改名)
这两个扩展包就解决了这个问题,是基于XML文件或注解的配置完成参数的设置,获取字段名称。
不仅如此,还提供了数据库缓存,例如一张简单的表的内容,查过一次就给存到程序内存里面了。
这样避免了反复向数据库发送重复,意义不大的SQL语句,提升了访问速度。
Tomcat
apache旗下的产品,实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,
所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
以前不用Spring-boot时,要把项目的字节码和lib包放到cat的webapps目录下才能运行。
Tomcat主要是作为Servlet/JSP容器
Servlet 是一个协议包修改器,用户每次发过来一个http协议包,Servlet就会把信息拦截下来,
然后在Servlet 里面根据用户请求写函数,把指定的包发回去。
Servlet是一段规则,规则只会创建一次,只有Tomcat关闭时候,才会销毁Servlet
forward是把客户包转发给另一个程序,客户包的数据不会被扔掉
redirect是把客户包扔掉,发一个地址包给客户端,客户请求另一个地址