天天看点

2017.02.17

1.模糊查询:like关键字,单引号包括模糊匹配表达式,%代表一个或者多个字符。

查询地址带有广州的所有department_code

selet * from zzgjs_department_define where chinese_address like ‘%广州%’

2.对缓存redis做一层层的封装,spring中只注入一个缓存bean.针对不同的业务需求,比如ITS,UM等,再分别写自己的类封装这个唯一的redis bean,加上分别业务的方法,对

外暴露出专门接口。这就是分解-封装的思想。

3.构建程序代码结构,要有分解封装的思想

4.一般来说。我们会将一些配置的信息放在。properties文件中。

然后使用${}将配置文件中的信息读取至spring的配置文件。

首先。我们要先在spring配置文件中。定义一个专门读取properties文件的类,叫PropertyPlaceholderConfigurer。

这个bean要注入的属性石location,用以指定要读取的配置文件路径。

如下:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<list>

<value>classpath:jdbc.properties</value>

<!--要是有多个配置文件,只需在这里继续添加即可 -->

</list>

</property>

</bean>

这里为什么用locations(还有一个location)

是因为。一般来说。我们的项目里面。配置文件可能存在多个。

就算是只有一个。那将来新添加的话。只需在下面再加一个value标签即可。

然后我们就可以在jdbc.properties文件中填写具体的配置信息了。

<!-- 配置C3P0数据源 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

<property name="driverClass">

<value>${jdbc.driverClassName}</value>

<property name="jdbcUrl">

<value>${jdbc.url}</value>

<property name="user">

<value>${jdbc.username}</value>

<property name="password">

<value>${jdbc.password}</value>

jdbc.properties文件写的信息。

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/test

jdbc.username=root

jdbc.password=root

30.spring mvc流程及常用注解梳理

32.在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求。

31.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用

@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。

32.@Controller 用于标记在一个类上后,

分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法

才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做

Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式:

  (1)在SpringMVC 的配置文件中定义MyController 的bean 对象。

  (2)在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。

<!--方式一-->

<bean class="com.host.app.web.controller.MyController"/>

<!--方式二-->

< context:component-scan base-package = "com.host.app.web" />//路径写到controller的上一层(扫描包详解见下面浅析)

33.@RequestMapping, value, method;

34.3、@Resource和@Autowired

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

2、不同点

(1)@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

public class TestServiceImpl {

// 下面两种@Autowired只要使用一种即可

@Autowired

private UserDao userDao; // 用于字段上

public void setUserDao(UserDao userDao) { // 用于属性的方法上

this.userDao = userDao;

}

3.@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称

(byName)来装配,可以结合@Qualifier注解一起使用。如下:

@Qualifier("userDao")

private UserDao userDao;

4.(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性

解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定

name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

复制代码

// 下面两种@Resource只要使用一种即可

@Resource(name="userDao")

public void setUserDao(UserDao userDao) { // 用于属性的setter方法上

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

40.5、@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:

42.redis是可以删除key的值的、。redis也是可以删除值的。如:jedis.del(key);

43.接口类,要以I开头命名

44.3.每一个service都要继承pafa框架的BaseService,每一个controller都要继承Pafa框架的BaseController,每一个dao都要继承pafa框架的BaseDao。

BaseDao是在pafa-biz.jar里,BaseService也在pafa-biz.jar包,BaseController在pafa-web.jar包。

如果你感觉一层直接继承,不方便你项目的运用,还可以再继承一层,添加自己的东西。比如Controller,可以自己定义APPBaseController,其继承BaseController,

APPBaseController类里添加一些本地化功法和变量,比如添加Logger,添加异常处理返回,生成APPResult等。然后项目所有的controller再继承AppBaseController。

45.所有具体controller的父类AppBaseController,controller父类里可以包括的方法有:1.添加logger。2.处理token。3.处理异常返回 4.生成APPResult返回,设置返回响应

46.isDebugEnabled 、isInfoEnabled 为啥要使用

:为什么要加上logger.isInfoEnabled()?原因有两点。

1).直接使用logger.info("User " + userId + " is using app " + appId)来输出log,也能够达到log级别为INFO或在INFO以下时才输出:("User " + userId + " is using

app " + appId),因为logger.info方法内部有判断输出级别的代码。但是在进入logger.info函数之前,("User " + userId + " is using app " + appId) 这个表达式已经通

过运算拼接成了一个字符串;而如果事先使用 if (logger.isInfoEnabled())进行判断,那么当log级别在INFO以上时,就能省去上述的字符串操作,在高并发和复杂log信息拼

接的情况下,使用这种标准的方法输出log能够省去不小的系统开销。另外,如果构造log信息的过程需要大量字符串操作,建议使用StringBuilder来完成字符串拼接。

2).ERROR及其以上级别的log信息是一定会被输出的,所以只有logger.isDebugEnabled和logger.isInfoEnabled方法,而没有logger.isErrorEnabled方法。

50.例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开

放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。

47.1 Log的用途

不管是使用何种编程语言,日志输出几乎无处不再。总结起来,日志大致有以下几种用途:

l 问题追踪:通过日志不仅仅包括我们程序的一些bug,也可以在安装配置时,通过日志可以发现问题。

l 状态监控:通过实时分析日志,可以监控系统的运行状态,做到早发现问题、早处理问题。

l 安全审计:审计主要体现在安全上,通过对日志进行分析,可以发现是否存在非授权的操作。

2.2 日志对性能影响

不管是多么优秀的日志工具,在日志输出时总会对性能产生或多或少的影响,为了将影响降低到最低,有以下几个准则需要遵守:

l 如何创建Logger实例:创建Logger实例有是否static的区别,在log4j的早期版本,一般要求使用static,而在高版本以及后来的slf4j中,该问题已经得到优化,获取(创建

)logger实例的成本已经很低。所以我们要求:对于可以预见的多数情况下单例运行的class,可以不添加static前缀;对于可能是多例居多,尤其是需要频繁创建的class,我

们要求要添加static前缀。

继续阅读