排序算法
冒泡排序
选择排序
插入排序
## 希尔排序
基本类型:
string
number
boolean
undefined 定义未赋值
null 赋值为null
对象类型:
object
function
array
初始赋值为null表示将要赋值为对象
undefined代表定义未赋值
*未定义的代表定义未赋值
2.什么时候给变量赋值为null呢?
2.什么时候给变量赋值为空呢?
*初始赋值,表明将要赋值为对象
结束前,让对象成为垃圾对象(被垃圾回收器回收
数据的类型
*基本类型
*基本类型
对象类型.
*变量的类型(变量内存值的类型)
*变量的类型(变量内存值的类型)
基本类型:保存就是基本类型的数据
基本类型:保存就是基本类型的数*引用类型:保存的是地址值
*引用类型:保存的是地址值
(function)() 防止污染或占用全局变量
隐藏实现
不会污染外部(全局) 命名空间
用它来编码js模块
网站管理:网站的基础设置和主题以及插件相关信息。
网站标题、网站副标题、网站描述、网站ico图标、网站Logo、网站关键词、网站网址。
用户管理:用户的注册和登录,发表博文和评论。
用户ID、用户名、用户昵称、用户密码、用户邮箱、用户头像、注册时间
评论管理:用户可以评论博文和回复其他用户的评论。
评论ID、评论日期、点赞数、发表用户、评论文章ID、评论内容、父评论ID。
博文管理:用户可以在网站中发表和设置博文。
博文ID、发布日期、发表用户、博文标题、博文内容、点赞数、回复数、游览量。
分类管理:添加和删除分类,给文章设置分类。
分类ID、分类名称、分类别名、分类描述、父分类ID。
标签管理:添加和删除标签,给文章设置标签。
标签ID、标签名称、标签描述。
这种方式要想全局代理就要用类似Proxifier的客户端
但是还没找到自动判定只有被墙才用代理的客户端
Proxifier 不知为啥网页访问Google
还是访问不了
但是要它能做游戏代理 网页访问还要用类似Proxy SwitchyOmega
的插件
所以建议用SS/SSR
1、首先,编译安装SS5需要先安装一些依赖组件
1 | yum -y install gcc gcc-c++ automake make pam-devel openldap-devel cyrus-sasl-devel openssl-devel |
2、去官网http://ss5.sourceforge.net/ 下载SS5最新版本的源代码
1 | wget https://jaist.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz |
3、解压后开始编译安装:
1 | tar zxvf ./ss5-3.8.9-8.tar.gz |
4、让SS5随系统一起启动
1 | chmod +x /etc/init.d/ss5 |
修改认证方式 /etc/opt/ss5/ss5.conf
1 | vi /etc/opt/ss5/ss5.conf |
删除原来所有配置 添加如下两行
1 | auth 0.0.0.0/0 - - |
默认的是:无用户认证。
如果想要使用用户认证,需要将上面两行修改成下面这样:
1 | auth 0.0.0.0/0 - u |
添加用户名及密码
1 | vi /etc/opt/ss5/ss5.passwd |
添加用户密码 每行一个用户+密码(之间用空格)
1 | test1 12345 |
修改ss5启动的参数,自定义代理端口 /etc/sysconfig/ss5
(如果不设置,默认是1080)
此文件ss5启动时会主动加载,将
1 | #SS5_OPTS=" -u root" |
取消注释,修改成下面这样
1 | SS5_OPTS=" -u root -b 0.0.0.0:10808" |
一定要在root用户目录下,执行
1 | /etc/rc.d/init.d/ss5 restart |
也可以用
1 | service ss5 start |
启动完成后,可以使用以下命令查看连接情况
1 | netstat -an | grep 10808 |
查看日志
1 | more /var/log/ss5/ss5.log |
1 | /etc/rc.d/init.d/ss5 stop |
也可以用
1 | service ss5 stop |
Proxifier下载
Proxifier注册码:
1 | L6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C(Portable Edition) |
Please note that starting from High Sierra you need to manually allow Proxifier extension signed by “Initex LLC” at /Applications/System Preferences -> Security & Privacy 打开 安全性与隐私->通用->允许插件载入
如果服务器采用的是windows系统
一种比较常用的搭配是CCProxy
(ss5代理服务器)+ Proxifier
(客户端)
一般搭建ss5代理服务器最好使用用户认证的方式(用户名密码),但大多数客户端软件默认都没有此功能(但可以装插件)。 比如ie浏览器、360安全浏览器、火狐浏览器等。 所以如果想要使用这些软件设置sock5代理的话,ss5代理服务器需保持默认的无认证模式。 QQ和遨游浏览器支持用户认证。
IE
127.0.0.1
10.0.0.0-10.255.255.255
172.16.0.0-172.31.255.255
192.168.0.0–192.168.255.255
火狐(Chrome)
自动切换规则配置
规则列表网址
1 | https://raw.githubusercontent.com/int64ago/private-gfwlist/master/gfwlist.txt |
1 | 我们有如下的用户访问数据 |
1 | CREATE TABLE test_sql.test1 ( |
1 | SELECT t2.userid, |
1 | 有50W个京东店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志, |
1 | CREATE TABLE test_sql.test2 ( |
1 | (1)方式1: |
1 | 已知一个表STG.ORDER,有如下字段:Date,Order_id,User_id,amount。 |
1 | CREATE TABLE test_sql.test3 ( |
1 | (1) |
1 | 有一个5000万的用户文件(user_id,name,age),一个2亿记录的用户看电影的记录文件(user_id,url),根据年龄段观看电影的次数进行排序? |
1 | CREATE TABLE test_sql.test4user |
1 | SELECT |
1 | 有日志如下,请写出代码求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有访问记录的用户) |
1 | CREATE TABLE test5( |
1 | SELECT sum(total_user_cnt) total_user_cnt, |
1 | 请用sql写出所有用户中在今年10月份第一次购买商品的金额, |
1 | CREATE TABLE test_sql.test6 ( |
1 | SELECT |
1 | 现有图书管理数据库的三个数据模型如下: |
1 | (1) |
1 | 有一个线上服务器访问日志格式如下(用sql答题) |
1 | CREATE TABLE test_sql.test8(`date` string, |
1 | SELECT ip, |
1 | 有一个充值日志表credit_log,字段如下: |
1 | CREATE TABLE test_sql.test9( |
1 | WITH TEMP AS |
1 | 有一个账号表如下,请写出SQL语句,查询各自区组的money排名前十的账号(分组取前10) |
1 | CREATE TABLE test_sql.test10( |
1 | SELECT dist_id, |
上集回顾:狂神说MyBatis01:第一个程序
namespace
结论:
配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!
select
select标签是mybatis中最常用的标签之一
select语句有很多属性可以详细配置每一条SQL语句
需求:根据id查询用户
1、在UserMapper中添加对应方法
1 | public interface UserMapper { |
2、在UserMapper.xml中添加Select语句
1 | <select id="selectUserById" resultType="com.kuang.pojo.User"> |
3、测试类中测试
1 | @Test |
课堂练习:根据 密码 和 名字 查询用户
思路一:直接在方法中传递参数
1、在接口方法的参数前加 @Param属性
2、Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型
1 | //通过密码和名字查询用户 |
思路二:使用万能的Map
1、在接口方法中,参数直接传递Map;
1 | User selectUserByNP2(Map<String,Object> map); |
2、编写sql语句的时候,需要传递参数类型,参数类型为map
1 | <select id="selectUserByNP2" parameterType="map" resultType="com.kuang.pojo.User"> |
3、在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求!
1 | Map<String, Object> map = new HashMap<String, Object>(); |
总结:如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
insert
我们一般使用insert标签进行插入操作,它的配置和select标签差不多!
需求:给数据库增加一个用户
1、在UserMapper接口中添加对应的方法
1 | //添加一个用户 |
2、在UserMapper.xml中添加insert语句
1 | <insert id="addUser" parameterType="com.kuang.pojo.User"> |
3、测试
1 | @Test |
注意点:增、删、改操作需要提交事务!
**
**
update
我们一般使用update标签进行更新操作,它的配置和select标签差不多!
需求:修改用户的信息
1、同理,编写接口方法
1 | //修改一个用户 |
2、编写对应的配置文件SQL
1 | <update id="updateUser" parameterType="com.kuang.pojo.User"> |
3、测试
1 | @Test |
delete
我们一般使用delete标签进行删除操作,它的配置和select标签差不多!
需求:根据id删除一个用户
1、同理,编写接口方法
1 | //根据id删除用户 |
2、编写对应的配置文件SQL
1 | <delete id="deleteUser" parameterType="int"> |
3、测试
1 | @Test |
小结:
思考题
模糊查询like语句该怎么写?
第1种:在Java代码中添加sql通配符。
1 | string wildcardname = “%smi%”; |
第2种:在sql语句中拼接通配符,会引起sql注入
1 | string wildcardname = “smi”; |
配置解析
核心配置文件
1 | configuration(配置) |
我们可以阅读 mybatis-config.xml 上面的dtd的头文件!
environments元素
1 | <environments default="development"> |
配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
子元素节点:environment
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
数据源是必须配置的。
有三种内建的数据源类型
1 | type="[UNPOOLED|POOLED|JNDI]") |
unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等….
详情:点击查看官方文档
这两种事务管理器类型都不需要设置任何属性。
具体的一套环境,通过设置id进行区别,id保证唯一!
子元素节点:transactionManager - [ 事务管理器 ]
1 | <!-- 语法 --> |
子元素节点:数据源(dataSource)
mappers元素
mappers
file:///
的 URL),或类名和包名等。映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始,还支持接口映射器,这种映射器方式允许以Java代码的方式注解定义SQL语句,非常简洁。引入资源方式
1 | <!-- 使用相对于类路径的资源引用 --> |
Mapper文件
1 | <?xml version="1.0" encoding="UTF-8" ?> |
namespace中文意思:命名空间,作用如下:
MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。
Properties优化
数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。具体的官方文档
我们来优化我们的配置文件
第一步 ; 在资源目录下新建一个db.properties
1 | driver=com.mysql.jdbc.Driver |
第二步 : 将文件导入properties 配置文件
1 | <configuration> |
更多操作,可以查看官方文档!【演示带领学习】
typeAliases优化
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
1 | <!--配置别名,注意顺序--> |
当这样配置时,User
可以用在任何使用com.kuang.pojo.User
的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
1 | <typeAliases> |
每一个在包 com.kuang.pojo
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
若有注解,则别名为其注解值。见下面的例子:
1 | @Alias("user") |
去官网查看一下Mybatis默认的一些类型别名!
其他配置浏览
设置
设置(settings)相关 => 查看帮助文档
一个配置完整的 settings 元素的示例如下:
1 | <settings> |
类型处理器
对象工厂
生命周期和作用域
作用域(Scope)和生命周期
理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。
我们可以先画一个流程图,分析一下Mybatis的执行过程!
作用域理解
多对一的理解:
数据库设计
1 | CREATE TABLE `teacher` ( |
搭建测试环境
1、IDEA安装Lombok插件
2、引入Maven依赖
1 | <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> |
3、在代码中增加注解
1 | @Data //GET,SET,ToString,有参,无参构造 |
4、编写实体类对应的Mapper接口 【两个】
1 | public interface StudentMapper { |
5、编写Mapper接口对应的 mapper.xml配置文件 【两个】
1 | <?xml version="1.0" encoding="UTF-8" ?> |
按查询嵌套处理
1、给StudentMapper接口增加方法
1 | //获取所有学生及对应老师的信息 |
2、编写对应的Mapper文件
1 | <?xml version="1.0" encoding="UTF-8" ?> |
3、编写完毕去Mybatis配置文件中,注册Mapper!
4、注意点说明:
1 | <resultMap id="StudentTeacher" type="Student"> |
5、测试
1 | @Test |
按结果嵌套处理
除了上面这种方式,还有其他思路吗?
我们还可以按照结果进行嵌套处理;
1、接口方法编写
1 | public List<Student> getStudents2(); |
2、编写对应的mapper文件
1 | <!-- |
3、去mybatis-config文件中注入【此处应该处理过了】
4、测试
1 | @Test |
小结
按照查询进行嵌套处理就像SQL中的子查询
按照结果进行嵌套处理就像SQL中的联表查询
一对多处理
一对多的理解:
实体类编写
1 | @Data |
….. 和之前一样,搭建测试的环境!
按结果嵌套处理
1、TeacherMapper接口编写方法
1 | //获取指定老师,及老师下的所有学生 |
2、编写接口对应的Mapper配置文件
1 | <mapper namespace="com.kuang.mapper.TeacherMapper"> |
3、将Mapper文件注册到MyBatis-config文件中
1 | <mappers> |
4、测试
1 | @Test |
按查询嵌套处理
1、TeacherMapper接口编写方法
1 | public Teacher getTeacher2(int id); |
2、编写接口对应的Mapper配置文件
1 | <select id="getTeacher2" resultMap="TeacherStudent2"> |
3、将Mapper文件注册到MyBatis-config文件中
4、测试
1 | @Test |
小结
1、关联-association
2、集合-collection
3、所以association是用于一对一和多对一,而collection是用于一对多的关系
4、JavaType和ofType都是用来指定对象类型的
注意说明:
1、保证SQL的可读性,尽量通俗易懂
2、根据实际要求,尽量编写性能更高的SQL语句
3、注意属性名和字段不一致的问题
4、注意一对多和多对一 中:字段和属性对应的问题
5、尽量使用Log4j,通过日志来查看自己的错误