Spring的注解形式:
@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展现层Bean。
@Overridejava
在面向对象中,只有接口和共有方法,继承方法有复写,私有方法不能够复写。web
@override编辑器能够自动判断复写的方法是否参数类型一致等,有了这个标识,对于私有的spring
方法进行复写,编译器会提示错误,当去掉@override,编译器不会报错,缘由是面向对象中,数据库
私有方法自己就是为了封装在类内部,不但愿别人来更改或者外部引用的编程
@Repositoryapi
用于标注数据访问层(即DAO层),具体只需将该注解标注在DAO类中数组
为何 @Repository 只能标注在 DAO 类上呢?这是由于该注解的做用不仅是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring自己提供了一个丰富的而且是与具体的数据访问技术无关的数据访问异常结构,用于封装不一样的持久层框架抛出的异常,使得异常独立于底层的框架。session
注入方式:app
把DAO实现类注入到action的service接口(注意不要是service的实现类)中,注入时不要new 这个注入的类,由于spring会自动注入,若是手动再new的话会出现错误,
而后属性加上@Autowired后不须要getter()和setter()方法,Spring也会自动注入。 框架
@Autowired
@Autowired注解是按类型装配依赖对象,默认状况下它要求依赖对象必须存在,若是容许null值,能够设置它required属性为false。若是咱们想使用按名称装配,能够结合@Qualifier注解一块儿使用。以下:
@Autowired @Qualifier("personDaoBean")
private PersonDao personDao;
@Resource
bean注入,即链接接口
@Resource注解和@Autowired同样,也能够标注在字段或属性的setter方法上,但它默认按名称装配。名称能够经过@Resource的name属性指定,若是没有指定name属性,当注解标注在字段上,即默认取字段的名称做为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名做为bean名称寻找依赖对象。
@Resource(name=“personDaoBean”)
private PersonDao personDao;//用于字段上
注意:若是没有指定name属性,而且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
@Resource的做用至关于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。因此若是使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。若是既不指定name也不指定type属性,这时将经过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 若是同时指定了name和type,则从Spring上下文中找到惟一匹配的bean进行装配,找不到则抛出异常
2. 若是指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 若是指定了type,则从上下文中找到类型匹配的惟一bean进行装配,找不到或者找到多个,都会抛出异常
4. 若是既没有指定name,又没有指定type,则自动按照byName方式进行装配;若是没有匹配,则回退为一个原始类型进行匹配,若是匹配则自动装配;
对于上述的spring和bean的理解,可参照以下内容
http://blog.csdn.net/chenssy/article/details/8222744
查询,需求广泛明确将符合条件的记录都显示出来,此处会用到list对象
List CorpStateList = new ArrayList();
List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。
List list = new ArrayList();这句建立了一个ArrayList的对象后把上溯到了List。此时它是一个List对象. 为何通常都使用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List有多个实现类,使用List list = new LinkedList(); ,便于程序代码的重构. 这就是面向接口编程的好处
该方法代码相似于
public List search(Guitar searchGuitar){
List match=new LinkedList();
Guitar guitar=new Guitar();
......通过一系列语句处理
match.add(guitar);
return match;
}
在查询类中,变量类型用枚举而不用string,可避免查询条件输入大小写或拼错的问题
public enum Wood{
FENDER,MARTIN;
public String toString(){
Switch(this){
case FENDER: return "Fender";
case MARTIN: return "Martin";
}}}
enum类型是定义一个类型(type)名称,像Wood,接着是该元素容许的一组值,
而后能够这样引用指定值,用Wood.MARTIN代替取其值
在CorpDaoImpl.java文件中引用了
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.stereotype.Repository;
注解:
HibernateTemplate提供了很是多的经常使用方法来完成数据库的基本操做,使得持久层访问摸板化,只要建立HibernateTemplate 实例后,注入一个SessionFactory的引用就能够了.无须手动建立sessionFactory,更加智能的管理Hibernate 的Session
Hibernate的复杂用法HibernateCallback
HibernateTemplate还提供一种更加灵活的方式来操做数据库,经过这种方式能够彻底使用Hibernate的操做方式。
HibernateTemplate的灵活访问方式是经过以下两个方法完成:
(1)Object execute(HibernateCallback action)
(2)List execute(HibernateCallback action)
这两个方法都是为了Spring在接管Hibernate以后,能够对HibernateDaoSupport进行灵活的扩展而用的。
两者的主要区别在于,execute返回的是一个Object,而executeFind方法返回的是一个List.
在new HibernateCallback的内部类的doInHibernate方法中,它的返回值,就是execute或executeFind方法的返回值
这两个方法都须要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。
程序开发者经过HibernateCallback,能够彻底使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。
HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),
该方法只有一个参数Session。一般,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,
方法doInHibernate的方法体就是Spring执行的持久化操做。
StringBuffer类append方法的用法和用途
StringBuffer hql = new StringBuffer();
hql.append(" WITH corp (CORPID, corpname, parentcorpid,corpstate) AS ( ");
注:
1. 先实例化
2.类.append("字符串") 有不少重载,具体查API
3.用途是当须要大量的字符串拼接时使用 优势效率比+=要高不少 (+=内存中是至关于建立副本从新赋值,StringBuffer是指针的引用)
select * from a union all select * from b
结果返回的是a和b全部的记录,含重复的数据,union不含重复的数据
Stringbuffer 有append()方法
Stringbuffer实际上是动态字符串数组
append()是往动态字符串数组添加,跟“xxxx”+“yyyy”至关那个‘+’号
跟String不一样的是Stringbuffer是放一块儿的
String1+String2 和Stringbuffer1.append("yyyy")虽然打印效果同样,但在内存中表示却不同
String1+String2 存在于不一样的两个地址内存 Stringbuffer1.append(Stringbuffer2)放再一块儿DetachedCirteria用法在WarningDaoImpl.java文件中,