【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)的用法及其他连接查询的使用方法】
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECTCOUNT(column_name) FROM table_name
SELECT COUNT(*) FROMtable_name
如果你的数据表没有主键,那么count(1)比count(*)快
如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快
-----》延伸扩展
内连接和外链接
内连接 inner join(inner可以省掉),INNER JOIN 关键字在表中存在至少一个匹配时返回行。就是返回结果的前提条件就是至少有一条数据记录匹配查询条件(即A.id = B.id),否则,返回null。
LEFTJOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
RIGHTJOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
什么意思呢?就是以join为分界点,left看左表,并以其为主参照,right看右表,同样以其为主参照。
总结下来就是:
全连接,简单来讲就是查询所有结果---》右连接和左连接的并集!
UNION操作符用于合并两个或多个SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的列的顺序必须相同。
SELECT column_name(s)FROM table_name1 UNION SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 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的区别
dbcp和c3p0都是单线程的,在高并发的环境下性能会非常低下
Tomcat在 7.0以前的版本都是使用commons-dbcp做为连接池的实现,但是 dbcp饱受诟病,原因有:
因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecp, druid (@wenshao )等。
为此,Tomcat从 7.0开始引入一个新的模块:Tomcat jdbc pool
tomcat jdbc pool近乎兼容 dbcp,性能更高
tomcat jdbc pool是 tomcat的一个模块,基于 tomcatJULI,使用 Tomcat的日志框架
使用 javax.sql.PooledConnection接口获取连接
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条?
【RESTful风格架构和WebService那些事儿】
理解RESTful架构 - 阮一峰的网络日志
http://www.ruanyifeng.com/blog/2011/09/restful.html
关键内容摘录:
REST--->RepresentationanlState Transfer表现层装状态转化,它革新了应用程序间的互动风格,而且具有简洁,易扩展等特性。已成为当下的主流之一。
网站即软件--》一种新型的软件定义,也是作为RESTful风格或架构诞生的背景之一。
1)每一个URI(unique resourceidentifier)代表一种资源
3)客户端通过四个动词去操作服务器上的资源,以达成‘表现层状态转化’的目的。
具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
RESTful风格接口的几个特性
1.无状态行:HTTP协议本身就是无状态协议,让其拥有良好的水平扩展能力;
2.幂等性:什么是幂等性呢?就是无论你执行CURD操作多少次,各操作对应的结果都是一致的;
http://www.ruanyifeng.com/blog/2009/08/what_is_web_service.html?20170726172230#comment-last
Web service是什么? - 阮一峰的网络日志
关键内容摘录如下:
首先你得知道什么叫‘Service’服务。。。服务,简单来说,就是计算机可以提供的一种功能。细分之下,又分为本地服务和网络服务,本地服务就是能在本地作的事情些,而网络服务,相同的也是,为了达到某种目的,只是最终的结果是通过网络来获得,被处理的东西也由网络传递。
"网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源。
WebSerivcie的核心思想就是尽量的把非核心的功能拿出去,自己就专心的整核心的部分。
近年来很红的"云计算"(cloud computing)或者"云服务"(cloud services),实际上就是Web Service的同义词,不过更形象一些罢了。它们不说你把事情交给其他计算机去做,而说你把事情交给"云"去做。
WebService具有跨平台,灵活,易维护等特点,也越发的受到第三方软件的青睐。。。
【WebService在CXF框架下的框架结构】
服务端(Tomcat Sever)---》war OR exploed 包,部署的
客户端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个对象内存地址肯定不一样
默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。
一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。
所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。
1、重写equals方法时需要重写hashCode方法,主要是针对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中所有的方法可以处理所有域上的请求,
项目中的xxxController上的注解起的作用就是《Controller中的所有方法都可以去处理来自不同域(域A或者是域B以及其他所有域)的请求》!
---》一夫在关,万夫可开
【gradle和maven的区别和联系】
它们都是项目构建工具,用来集成jar包的。只是Maven是前辈,gradle是跟着AS一起来的后生。相比之下,gradle更为简洁,它省去了Maven文件中XML内容的繁琐配置,取而代之以简单的几行类Java代码来指明需要集成的jar包。gradle的简洁依赖于Groovy脚本的支持(Groovy,敏捷开发用的动态语言,能很好的同Java结合编程,简单的几行代码就能完成对某个业务场景的实现。使用该种语言不必编写过多的代码,同时又具有和动态语言中的其他特性。---来之 360百科)。
较之于Maven或者Ant的XML配置脚本,Gradle使用的Grovvy脚本杀伤力太大了,爱美之心,人皆有之,相比于七旬老妇松松垮垮的皱纹,大家肯定都喜欢少女紧致的脸蛋,XML就是那老妇的皱纹。
Gradle给我最大的有点是两点。其一是简洁,基于Groovy的紧凑脚本实在让人爱不释手,在表述意图方面也没有什么不清晰的地方。其二是灵活,各种在Maven中难以下手的事情,在Gradle就是小菜一碟,比如修改现有的构建生命周期,几行配置就完成了,同样的事情,在Maven中你必须编写一个插件,那对于一个刚入门的用户来说,没个一两天几乎是不可能完成的任务。
链接:https://www.zhihu.com/question/29338218/answer/51293828
来源:知乎
------
不是一般的乱,如果需要的,能对你有帮助,请结合搜索 ctrl+F 来查看吧。
谢谢您的支持啦