1.Spring注解
Spring常用的注解有:@Resource、@Autowired、@Service、@Repositiry、@Component、@Transaction六个注解
@Resource其实不是Spring中的注解,而是JAVA中的标准注解,是JSR-250中的一个规范,Spring对其进行了实现。使用@Resource注解可以注入JavaBean,默认按照名字注入JavaBean。
@Resource(name="personDao")
IPersonDao personDao;
<span style="font-family: "microsoft yahei"; font-size: 15px; color: rgb(100, 100, 100); background: yellow;"><span style="font-size: 14px;">@Autowired</span></span><span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 14px;">是<span style="font-family: Calibri;">Spring</span>的一个注解,作用和<span style="color: rgb(100, 100, 100); background: yellow;">@Resource</span><span style="color: rgb(100, 100, 100);">是一样的,</span><span style="color: rgb(100, 100, 100); background: yellow;">@Autowired</span>默认按照类型注入。</span>
<span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 14px;"><span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 15px;"> </span><span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 14px;"><span style="color: rgb(100, 100, 100); background: yellow;">@Service</span></span><span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 14px;">用来标注在<span style="font-family: Calibri;">Service</span>类上,表示让<span style="font-family: Calibri;">Spring</span>来实例化<span style="font-family: Calibri;">Service</span>类,也就是我们所说的<span style="font-family: Calibri;">IOC</span>。</span>
</span>
<span style="color: rgb(85, 85, 85); font-size: 14px;"><span style="color: rgb(85, 85, 85); font-size: 14px;"></span></span><pre name="code" class="java" style="font-family: "microsoft yahei";">@Service //标注service层
public class PersonService implements IPersonService
<span style="font-family: "microsoft yahei"; font-size: 14px; color: rgb(100, 100, 100); background: yellow;">@Repository</span><span style="font-family: "microsoft yahei"; color: rgb(85, 85, 85); font-size: 14px;">用来标注在</span><span style="font-family: Calibri; color: rgb(85, 85, 85); font-size: 14px;">DAO</span><span style="font-family: "microsoft yahei"; color: rgb(85, 85, 85); font-size: 14px;">类或是数据访层的类中,作用和</span><span style="font-family: "microsoft yahei"; font-size: 14px; color: rgb(100, 100, 100); background: yellow;">@Service</span><span style="font-family: "microsoft yahei"; color: rgb(85, 85, 85); font-size: 14px;">一样</span><pre name="code" class="java" style="font-family: "microsoft yahei";">@Repository //标注dao层
public class PersonDao extends GenericReposistoryHibernate implements IPersonDao
<span style="font-family: "microsoft yahei"; color: rgb(85, 85, 85); font-size: 14px;"><span style="color: rgb(100, 100, 100); background: yellow;">@Component</span></span><span style="font-family: "microsoft yahei"; color: rgb(85, 85, 85); font-size: 14px;">用来标注普通的<span style="font-family: Calibri;">JavaBean,</span>例如<span style="font-family: Calibri;">POJO</span>和<span style="font-family: Calibri;">MODEL</span>类等。</span><pre name="code" class="java" style="font-family: "microsoft yahei";">@Component("personPojo" )// 把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
public class PersonPojo extends GenericObject
<span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 15px;"> </span><span style="font-family: "microsoft yahei"; font-size: 15px; color: rgb(100, 100, 100); background: yellow;">@Transactional</span><span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 14px;">是事务注解,使用该注解可以让<span style="font-family: Calibri;">Spring</span>代替我们接管事务,不用每次都由程序员来提交和回滚事务</span>
<span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 14px;">
</span>
<span style="color: rgb(85, 85, 85); font-size: 14px;"></span><h3 style="font-family: "microsoft yahei"; margin: 0px; padding: 0px; color: rgb(85, 85, 85);">3.2 JPA与Hibernate注解</h3><p style="font-family: "microsoft yahei"; margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; color: rgb(85, 85, 85); font-size: 15px;"><span style="font-size: 14px;"> 之前讲到过<span style="font-family: Calibri;">Hibernate</span>中使用注解用到的是<span style="font-family: Calibri;">JPA</span>。<span style="font-family: Calibri;">JPA</span>其实也是<span style="font-family: Calibri;">JAVA</span>中的规范之一,是与<span style="font-family: Calibri;">EJB3</span>一起诞生的产物,全称为<em><span style="font-family: Calibri;">Java Persistence API</span></em>(<span style="font-family: Calibri;">JAVA</span>持久化<span style="font-family: Calibri;">API</span>)。使用<span style="font-family: Calibri;">JPA</span>可以实现<span style="font-family: Calibri;">Java Bean</span>的<span style="font-family: Calibri;">ORM</span>映射,包括对象和表、属性和字段、对象依赖和表间关系的映射(例如一对一、一对多、多对多的映射)。下面的示例是<span style="font-family: Calibri;">JPA</span>的基本使用方法:</span></p><pre name="code" class="java" style="font-family: "microsoft yahei";">@Table(name = "person") //标注对应的数据库表明。
@Component("personPojo" )// 把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
public class PersonPojo extends GenericObject {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
@Column(name = "name", unique = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<span style="font-family: "microsoft yahei"; font-size: 14px;">GenericObject</span><span style="font-family: "microsoft yahei"; font-size: 15px; background-color: rgb(255, 255, 0);">类</span><span style="font-size: 15px; font-family: Calibri;">,</span><span style="font-family: "microsoft yahei"; font-size: 15px; background-color: rgb(255, 255, 0);">该类提供一个父类的</span><span style="font-size: 15px; font-family: Calibri;">ID</span><span style="font-family: "microsoft yahei"; font-size: 15px; background-color: rgb(255, 255, 0);">,所有继承该类的子类都具有一个</span><span style="font-size: 15px; font-family: Calibri;">ID</span><pre name="code" class="java">public abstract class GenericObject{
private static final long serialVersionUID = 1L;
private String id;
public GenericObject() {
super();
}
@Id
@Column(name = "id", length = 36, nullable = true)
@GeneratedValue(generator = "hibernate-uuid.hex")
@GenericGenerator(name = "hibernate-uuid.hex", strategy = "uuid.hex")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
使用
<prop key=
"hibernate.hbm2ddl.auto"
>
update
</prop>
属性可以使
Hibernate
自动创建和修改表,而不用再手工修改。
<span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 14px;">
</span>
<span style="font-family:microsoft yahei;"></span><h3 style="margin: 0px; padding: 0px; color: rgb(85, 85, 85); font-family: "microsoft yahei";">3.1 Struts2注解</h3><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 15px;"><span style="font-size: 14px;"><span style="font-family: Calibri;"> Struts2</span>框架的注解是使用<span style="font-family: Calibri;">convention-plugin</span>插件实现的</span></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 15px;"><span style="font-size: 14px;">
</span></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 15px;"><span style="font-size: 14px;"></span><h2 style="margin: 0px; padding: 0px; color: rgb(85, 85, 85); font-family: "microsoft yahei";">4 如何在工程中使用Spring切面事务和增删改查</h2></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 15px;"><span style="font-size: 14px;"> 在使用<span style="font-family: Calibri;">JDBC</span>或者是<span style="font-family: Calibri;">Hibernate</span>对数据库的进行增删改查操作时,通常都需要使用事务。事务是保证数据一致性和完整性的重要技术,如果使用不当,可能会产生不完整的交易数据,所以在软件开发中对事务的控制一定要认真对待。<span style="font-family: Calibri;">Spring</span>为我们提供了<span style="font-family: Calibri;">AOP</span>切面事务,使程序员不用自行控制事务。使用<span style="font-family: Calibri;">Spring</span>事务我们只需要标注<span style="font-family: Calibri;">@Transactional</span>注解即可,<span style="font-family: Calibri;">Spring</span>会自动接管方法中的事务。我们可以定一个数据库访问层的公共类,所有的<span style="font-family: Calibri;">DAO</span>类都继承至该类,而不用在每个<span style="font-family: Calibri;">DAO</span>都使用<span style="font-family: Calibri;">@Transactional</span>注解。</span></p><pre name="code" class="java">/**
* 持久化基类
*
* @author 山人
*
*/
@Transactional
@Component("repositoryImp")
public class GenericReposistoryHibernate {
@Resource
protected SessionFactory sessionFactory;
private Session session = null;
@Transactional
public <T, PK extends Serializable> PK create(T newInstance) {
PK save = (PK) getSession().save(newInstance);
return save;
}
@Transactional
public <T> void delete(T transientObject) {
getSession().delete(transientObject);
}
@Transactional
public <T> void update(T transientObject) {
getSession().update(transientObject);
}
@Transactional(readOnly=true)
public <T> List<T> findAll(Class<T> type) {
return getSession().createCriteria(type).list();
}
public <T> List<T> findHQLByParam(String hql, int firstResult,
int maxResult, Object... params) {
Query query = getSession().createQuery(hql);
for (int i = 0; i < params.length; i++) {
query.setParameter(i + 1, params[i]);
}
query.setMaxResults(maxResult);
query.setFirstResult(firstResult);
return query.list();
}
@Transactional(readOnly=true)
public <T> List<T> findAllValid(Class<T> clas) {
return getSession().createCriteria(clas).list();
}
@Transactional(readOnly=true)
public <T, PK extends Serializable> T get(Class<T> type, PK id,
boolean block) {
if (block)
return (T) getSession().get(type, id, LockMode.UPGRADE);
else
return (T) getSession().get(type, id);
}
public Session getSession() {
if (sessionFactory.isClosed()) {
sessionFactory.openSession();
} else {
session = sessionFactory.getCurrentSession();
}
return session;
}
}