工作-2017.07.30-周记总结篇(一)

【MySQL乱码问题】

【MyBatis动态查询】

【SQL语法中的Select count(*)和count(1)的用法及其他连接查询的使用方法】

【MyBatis中的association标签有什么用】

【c3p0、dbcp、tomcat jdbc pool 连接池区别】

【连接池的工作原理】

【RESTful风格架构和WebService那些事儿】

【WebService在CXF框架下的框架结构】

【‘面向接口’编程思想】

【为什么重写后equals方法就得重写hashCode()方法呢?】

【CORS跨域访问】

【gradle和maven的区别和联系】


MySQL乱码问题

乱码问题主要是因为编码格式不同。MySQL默认是latin类型的字符,而插入进去的大都是utf-8或者是gbk。解决问题的方法基本上是围绕着MySQL来的。主要就是更改MySQL的安装目录bin下的my.ini文件,


如果,没有的,可以自行创建一个同名txt文件,然后在其中放入图片中的配置。这样修改后,基本上就能保证数据库,库表都是utf-8的格式了。此时可以用show variables like“character%”的命令再确认一下。如果插入到表中的中文数据还是乱码的话,可以再去查看下对应字段的编码类型,命令为:show create table 表名。根据实际情况再做更改。更改的名令为:altertable 表名 modify 字段名 字段类型定义(varchar之类的)。

ALTER使用命令修改,格式:

ALTERCOLUMN TABLE 表名  MODIFY 字段名字段类型定义;

例如:

ALTERCOLUMNVARCHAR TABLE chatter_users  MODIFY ip (50);

来自https://zhidao.baidu.com/question/489537901834944212.html

如果闲麻烦的,可以直接在navicat等可视化工具中去改。


【MyBatis动态查询】

         在后续操作MyBatis的过程中遇到了一个问题,就是bind的用法。顾名思义,绑定的意思。一般的话,它会和pattern(模糊的意思)结合使用,用在模糊查询中(where xxx like #{pattern})。Bind并不适合用在具体查询中(wherexxx = #{pattern}),这种用法往往会返回空的结果。


返回结果null;


成功的返回结果。

关于MyBatis中更多的动态查询方式可以看这里

动态sql(查询学习) -mybatis - 辉色天空 

http://huisky.com/blog/17060611405568mybatis

【SQL语法中的Select count(*)和count(1)的用法及其他连接查询的使用方法】

SQL COUNT() 函数 

COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):

SELECTCOUNT(column_name) FROM table_name

(计算该列有多少条数据)

SQL COUNT(*) 语法

COUNT(*) 函数返回表中的记录数:

SELECT COUNT(*) FROMtable_name

一. count(1)和count(*)的区别

1. count(1)和count(*)的作用:

都是检索表中所有记录行的数目,不论其是否包含null值。

2.区别:但是count(1)比count(*)效率更高

如果你的数据表没有主键,那么count(1)比count(*)快  

如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快  

如果你的表只有一个字段的话那count(*)就是最快的啦  

-----》延伸扩展

内连接和外链接

内连接 inner join(inner可以省掉),INNER JOIN 关键字在表中存在至少一个匹配时返回行。就是返回结果的前提条件就是至少有一条数据记录匹配查询条件(即A.id = B.id),否则,返回null。

外链接分为left join和right join

LEFTJOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

RIGHTJOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

什么意思呢?就是以join为分界点,left看左表,并以其为主参照,right看右表,同样以其为主参照。

总结下来就是:

参照谁,全显谁!



全连接,简单来讲就是查询所有结果---》右连接和左连接的并集!

还有一个连接嘞的查询,叫union查询

UNION操作符用于合并两个或多个SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s)FROM table_name1 UNION SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s)FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2

另外,UNION结果集中的列名总是等于 UNION中第一个 SELECT语句中的列名。

更多详细内容参见:
http://www.w3school.com.cn/sql/sql_func_count.asp


【MyBatis中的association标签有什么用】

Association指的是关联的结果查询。。。

关联结果查询这种其实就是多表间关联查询的意思,来看这里

http://blog.csdn.net/isea533/article/details/20868189Mybatis

示例之 Association - 偶尔记一下 - CSDN博客  



【c3p0、dbcp、tomcat jdbc pool 连接池区别】

c3p0、dbcp、tomcat jdbcpool 连接池区别(推荐使用jdbc pool)

 - chenaini119的专栏 - CSDN博客 

http://blog.csdn.net/chenaini119/article/details/69254803

 

Tomcat自带的JDBC pool(打7开始后)和C3P0的区别

dbcpc3p0都是单线程的,在高并发的环境下性能会非常低下

Tomcat 7.0以前的版本都是使用commons-dbcp做为连接池的实现,但是 dbcp饱受诟病,原因有:

dbcp是单线程的,为了保证线程安全会锁整个连接池 

dbcp性能不佳 

dbcp太复杂,超过 60个类 

dbcp使用静态接口,在 JDK 1.6编译有问题 

dbcp发展滞后 

因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecp, druid (@wenshao )等。

为此,Tomcat 7.0开始引入一个新的模块:Tomcat jdbc pool

tomcat jdbc pool近乎兼容 dbcp,性能更高 

异步方式获取连接 

tomcat jdbc pool tomcat的一个模块,基于 tomcatJULI,使用 Tomcat的日志框架 

使用 javax.sql.PooledConnection接口获取连接 

支持高并发应用环境 

超简单,核心文件只有8个,比 c3p0 

更好的空闲连接处理机制 

支持 JMX 

支持 XA Connection 

tomcat jdbc pool的优点远不止这些,详情请看这里。

tomcat jdbc pool可在 Tomcat中直接使用,也可以在独立的应用中使用。



【连接池的工作原理】

以下摘录的说明来自这两篇博文:

https://www.oschina.net/question/157182_72094

Java 连接池的工作原理 - 开源中国社区 

http://www.cnblogs.com/newpanderking/p/3875749.html

数据库连接池的工作原理 -NewPanderKing - 博客园 

【数据库连接很昂贵】!

       之所以说它昂贵,因为创建数据库连接需要经历驱动程序注册,请求链接过审,然后再创建Socket链接的的过程。最后这一步往往会花费较多的时间(相对而言),如果遇到创建Socket连接的时间要比查询的时间还长的,那就尴尬了。所以就有了连接池的概念。根据不同的业务场景和相应的配置,可以创建不同的连接池。

       一次性的创建足够数量的连接数,在系统启动时会较慢,但在访问时会变快,对于客户来讲,这样的用户体验是可行的。这些连接能够被不同的线程申请使用。默认会创建最小数量的连接数,如果用完了,且没有空闲连接时,则在最大连接数范围内创建新连接。待到连接被闲置后,同该连接关联的代理被关闭,然后该链接变为可用状态,供下一个需要连接的线程使用。如果达到最大值,则会进入到等待的时间中,在等待期内,有空闲连接腾出来的,会被继续使用。如果超时,连接池管理者则会抛送一个异常给用户。

       它用的是引用计数的设计模式,一旦一个连接被分配出去,那么就会对该连接的申请者进行登记,并且增加引用记数,当被释放回来时就删除他登记的信息,同时减少一次引用记数。这样做的一个很大的好处是,使得我们可以高效的使用连接,因为一旦所有连接都被分配出去,我们就可以根据相应的策略从使用池中挑出一个有效的连接来复用,而不是随便拿出一个连接去复用。

       连接池的关闭。当应用程序退出时,关闭连接池中所有的链接,释放连接池相关资源,该过程正好与创建相反。

相关问题细究:

在连接池的管理中,假设其最大连接数设置为20条,最小5条,在某个任务场景下,这20条都被用上了。

待任务处理完成后,20条都变成空闲的,等待其他的线程来调用。

问题:空闲状态下,是继续保持20条连接的就绪状态,还是说会回收连接,缩减至最小的5条?

答案是缩减至5条,你想嘛,没事浪费资源干嘛


【RESTful风格架构和WebService那些事儿】

理解RESTful架构 - 阮一峰的网络日志 

http://www.ruanyifeng.com/blog/2011/09/restful.html

关键内容摘录:

REST--->RepresentationanlState Transfer表现层装状态转化,它革新了应用程序间的互动风格,而且具有简洁,易扩展等特性。已成为当下的主流之一。

网站即软件--》一种新型的软件定义,也是作为RESTful风格或架构诞生的背景之一。

关于RestFul架构有三点:

1)每一个URI(unique resourceidentifier)代表一种资源

2)作为客户端和服务器之间,传递这种资源的表现层

3)客户端通过四个动词去操作服务器上的资源,以达成‘表现层状态转化’的目的。

四个动词的详细解释

客户端用到的手段,只能是HTTP协议。

具体来说,就是HTTP协议里面,四个表示操作方式的动词:GETPOSTPUTDELETE

它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

RESTful风格接口的几个特性

1.无状态行:HTTP协议本身就是无状态协议,让其拥有良好的水平扩展能力;

2.幂等性:什么是幂等性呢?就是无论你执行CURD操作多少次,各操作对应的结果都是一致的;

3.唯一性:URL地址要唯一的去表示一个资源

http://www.ruanyifeng.com/blog/2009/08/what_is_web_service.html?20170726172230#comment-last

Web service是什么? - 阮一峰的网络日志 

关键内容摘录如下:

什么是WebService呢??

首先你得知道什么叫‘Service’服务。。。服务,简单来说,就是计算机可以提供的一种功能。细分之下,又分为本地服务和网络服务,本地服务就是能在本地作的事情些,而网络服务,相同的也是,为了达到某种目的,只是最终的结果是通过网络来获得,被处理的东西也由网络传递。

"网络服务"Web Service)的本质,就是通过网络调用其他网站的资源。

WebSerivcie的核心思想就是尽量的把非核心的功能拿出去,自己就专心的整核心的部分。

近年来很红的"云计算"cloud computing)或者"云服务"cloud services),实际上就是Web Service的同义词,不过更形象一些罢了。它们不说你把事情交给其他计算机去做,而说你把事情交给""去做。

WebService具有跨平台,灵活,易维护等特点,也越发的受到第三方软件的青睐。。。

 

 

【WebService在CXF框架下的框架结构】

服务端(Tomcat Sever)---》war OR exploed 包,部署的

(接口提供:SOAP+http)

客户端cxf(反实例化访问) OR htttp访问(一般是get和post)

 


【‘面向接口’编程思想】

Java设计第一原则:面向接口编程 - 追风的Java专栏 - CSDN博客 http://blog.csdn.net/yajunren/article/details/10312845

面向接口编程就是先把客户的业务提取出来,作为接口。业务具体实现通过该接口的实现类来完成。当客户需求变化时,只需编写该业务逻辑的新的实现类,通过更改配置文件(例如Spring框架)中该接口的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。

(比如手机,本身我只是想要它能打电话就行了的。此时,我就只需要 ICall()的接口,然后在ICallImpl类中去实现打电话的功能就好。后来,有一天,我觉得我的手机应该有个类似陌陌的娱乐功能,如果变动不是很大,可以在ICallImpl类中中实现的,就可直接沿用的。如果不行的,再从新开个接口IMomo(),然后在之前的Impl类中同包下再新建一个IMmoImpl类就好了。然后打上注释,把它们交给容器(例如Spring)去管理就好。需求虽然有变动,但是对于代码的整个结构不会有太大的影响)

所以通常说的“面向接口编程”可以理解为: 

只有实现者和调用者都遵循面向接口编程这个准则,制定者的协调目的才能达到。 

面向接口编程,目的就是为了尽最大可能的去实现高内聚,低耦合的软件设计伟大目标!往细点来说,面向接口属于面向对象的一个分支。它的存在,就是为了更好协同制定者,实现者,调用者之间的关系,达成制定者的终极目的。正是因为有规范的存在,所以才有了高效合作的可能。

一个老生常谈的例子就是JDBC。 

优点: 

接口和实现分离了,适于团队的协作开发。 

主要为了实现松散耦合的系统,便于以后升级,扩展。

缺点: 

设计难了,在你没有写实现的时候,就得想好接口,接口一变,全部乱套,这就是所谓的设计比实现难。 

所以设计接口的人工资都高啊!!!

*-------》这也就是人们常说的:点子贵如金呐!



【为什么重写后equals方法就得重写hashCode()方法呢?】

http://lelglin.iteye.com/blog/1826152

为什么在重写了equals()方法之后也必须重写hashCode()方法 - - ITeye博客 

关键内容摘录

在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样

l 对于值对象,==比较的是两个对象的值

l 对于引用对象,比较的是两个对象的地址

默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。

一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。

所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

1、重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用;

a: Map、Set等集合类型存放的对象必须是唯一的;

b: 集合类判断两个对象是否相等,是先判断equals是否相等,如果equals返回TRUE,还要再判断HashCode返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的。

2、由于Object的hashCode返回的是对象的hash值,所以即使equals返回TRUE,集合也可能判定两个对象不等,所以必须重写hashCode方法,以保证当equals返回TRUE时,hashCode也返回Ture,这样才能使得集合中存放的对象唯一。

简单举个例子,两个学生对象,学号相同,姓名相同,性别相同。只是用了

Student s1 = newStudent();

Student s2= newStudent();

s1==s2---à肯定是不同,因为用的是默认Object的 == 方法,然而他们是两个不同的对象,也即不同的引用,地址也不同嘚。

要让他俩是相等的,就必须重写equals方法和hashcode方法、

 

【CORS跨域访问】

@CrossOrigin(origins="*",maxAge=3600)

@RestController

@RequestMapping("/account")

Publicclass AccountController {

      @RequestMapping("/{id}")    

                   public Accountretrieve(@PathVariable Long id) {

         // ...   

          }    

 @RequestMapping(method = RequestMethod.DELETE,path = "/{id}")

     public void remove(@PathVariable Long id){  

      // ...}

 }

这里指定当前的AccountController中所有的方法可以处理所有域上的请求,

在方法上使用@CrossOrigin注解

看了这个你就大概明白了吧??

项目中的xxxController上的注解起的作用就是《Controller中的所有方法都可以去处理来自不同域(域A或者是域B以及其他所有域)的请求》!

---》一夫在关,万夫可开

【gradle和maven的区别和联系】

       它们都是项目构建工具,用来集成jar包的。只是Maven是前辈,gradle是跟着AS一起来的后生。相比之下,gradle更为简洁,它省去了Maven文件中XML内容的繁琐配置,取而代之以简单的几行类Java代码来指明需要集成的jar包。gradle的简洁依赖于Groovy脚本的支持(Groovy,敏捷开发用的动态语言,能很好的同Java结合编程,简单的几行代码就能完成对某个业务场景的实现。使用该种语言不必编写过多的代码,同时又具有和动态语言中的其他特性。---来之 360百科)。

        较之于Maven或者AntXML配置脚本,Gradle使用的Grovvy脚本杀伤力太大了,爱美之心,人皆有之,相比于七旬老妇松松垮垮的皱纹,大家肯定都喜欢少女紧致的脸蛋,XML就是那老妇的皱纹。

         Gradle给我最大的有点是两点。其一是简洁,基于Groovy的紧凑脚本实在让人爱不释手,在表述意图方面也没有什么不清晰的地方。其二是灵活,各种在Maven中难以下手的事情,在Gradle就是小菜一碟,比如修改现有的构建生命周期,几行配置就完成了,同样的事情,在Maven中你必须编写一个插件,那对于一个刚入门的用户来说,没个一两天几乎是不可能完成的任务。

作者:EZLippi

链接:https://www.zhihu.com/question/29338218/answer/51293828

来源:知乎

 ------

不是一般的乱,如果需要的,能对你有帮助,请结合搜索 ctrl+F 来查看吧。

谢谢您的支持啦


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值