springMVC+Hibernate+jpa整合(1)

實習第一個階段,來這邊有小半個月了,前面一週在熟悉這邊開發平臺,最近在學習一些基礎技術,週末開始接受培訓,這個公司用的是本身的框架,可是底層使用的仍是springMVC,jpa,hibernate這一套,只是對這些進行了封裝,兩天熟悉了下jpa今天開始整合一個demojava

一、首先導入相關的依賴包spring、hibernate、jpamysql

二、接下來是基本的配置,數據源、jpa實體管理工廠(hibernate的一些設置)、註解掃描、spring事務管理、事務的註解啓動、jpatemplatespring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:util="http://www.springframework.org/schema/util"
  xsi:schemaLocation="  
            http://www.springframework.org/schema/beans   
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
            http://www.springframework.org/schema/tx   
            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd  
            http://www.springframework.org/schema/context  
            http://www.springframework.org/schema/context/spring-context-3.1.xsd  
            http://www.springframework.org/schema/util   
            http://www.springframework.org/schema/util/spring-util-3.1.xsd">  

 
  
  <!-- annotation scan -->
  <context:component-scan base-package="com.wyk.sh4"/>
  	
  <!-- Data sourse  -->
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    >
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="root" />
  </bean>
  
  <!-- This will ensure that Hibernate or JPA exceptions are automatically   
        translated into Spring's generic DataAccessException hierarchy for those   
        classes annotated with Repository. For example, see ***DAOImpl. -->  
  <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    
  
   <!-- JPA Entity Manager Factory -->  
   		<!-- toscan待掃描的實體類包,再也不須要persistence.xml -->
   <bean id="entityManagerFactory"
   		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
   		p:packagesToScan="com.wyk.sh4.domain" p:dataSource-ref="dataSource"
   		p:jpaVendorAdapter-ref="hibernateVendor" p:jpaPropertyMap-ref="jpaPropertyMap"/>
   
   <util:map id="jpaPropertyMap">
   		<entry key="hibernate.hbm2ddl.auto" value="update"/>
   		<entry key="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
   		<!-- To enable Hibernate's second level cache and query cache settings -->  
        <entry key="hibernate.max_fetch_depth" value="4" />  
        
   </util:map>
   <bean id="hibernateVendor"
  		class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
  		p:database="MYSQL" p:showSql="true" p:generateDdl="true"
   		p:databasePlatform="org.hibernate.dialect.MySQLDialect"/> 
  		
   
   <!-- User declarative transaction management -->  
   <tx:annotation-driven transaction-manager="transactionManager"/>
   <!-- Transaction Config -->  		
   <bean id="transactionManager"
    	class="org.springframework.orm.jpa.JpaTransactionManager" 
    	p:entityManagerFactory-ref="entityManagerFactory">
    	<property name="jpaDialect">
    		<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
    	</property>
   </bean>
  
  
   <!-- jpaTemplate manager entityManagerFactory -->
   <bean id="jpaTemplate"
  		 class="org.springframework.orm.jpa.JpaTemplate"
  		 p:entityManagerFactory-ref="entityManagerFactory"/>

</beans>

三、完成配置以後進行測試sql

Domain對象框架

@Entity
public class Student {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	private String username;
	private String pwd;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}

DAO層dom

    BaseDAOide

    

public abstract class BaseDAO<T> implements IBaseDAO<T> {

	
	@Resource(name="jpaTemplate")
	private JpaTemplate jpaTemplate;
	
	//居圖數據類型處理
	private Class<T> clazz = null;
	
	public BaseDAO(){
	     //--得到具體類的具體類型
		 ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
		 clazz = (Class<T>) pt.getActualTypeArguments()[0];
	}
	
	@Override
	public void add(T entity) {
		jpaTemplate.persist(entity);
	}

	@Override
	public void update(T entity) {
		jpaTemplate.merge(entity);
	}

	@Override
	public void delete(Long[] ids) {
		for(Long id : ids){
			jpaTemplate.remove(getById(id));
		}
	}

	@Override
	public T getById(Long id) {
		return jpaTemplate.find(clazz, id);
	}

	
	@Override
	public List<T> getByIds(final List ids) {
	    return (List<T>) jpaTemplate.execute(new JpaCallback<T>() {

			@Override
			public T doInJpa(EntityManager em) throws PersistenceException {
				
				return (T) em.createQuery("FROM " + clazz.getSimpleName() + " WHERE id IN(:ids)")
						.setParameter("ids", ids)
						.getResultList();
			}
			
		});
	}

}

    StudentDAO
學習

    

/**
 * 實體DAO,完成實體對應的特殊操做
 * @author yk-Woo
 *
 */
@Repository
public class StudentDAO  extends BaseDAO<Student> implements IStudentDAO{

}

Service層測試

/**
 * 業務層,處理業務邏輯
 * @author yk-Woo
 *
 */
@Service
@Transactional
public class StudentService implements IStudentService {

	@Resource
	private IStudentDAO StudentDAO;
	@Override
	public void add(Student entity) {
		this.StudentDAO.add(entity);
	}

	@Override
	public void update(Student entity) {
		this.StudentDAO.update(entity);
	}

	@Override
	public void delete(Long[] ids) {
		this.StudentDAO.delete(ids);
	}

	@Override
	public Student getById(Long id) {
		return this.StudentDAO.getById(id);
	}

	@Override
	public List<Student> getByIds(List ids) {
		return this.StudentDAO.getByIds(ids);
	}

}

這裏要注意:fetch

            一、hibernate中使用批量查詢使用「IN {:ids}」這裏使用的是 "IN (:ids)"符號不同,在這裏使用「{}」會致使語法報錯;

            二、這裏ids用到的參數是List,hibernate中用改的是LONG[];

            三、因爲配置了事務管理,在執行「增長」、「修改」等操做時須要使用@Transaction註解開啓事務;

            四、一般作法是在service層中加@Transaction每次調用dao的操做時根據具體註解狀況spring會幫咱們開啓事務與關閉,這裏若是直接使用DAO層的話(測試過程當中),在basedao的實現中須要加入@Transaction啓用註解,具體實現類中的具體方法也須要加;

            五、這裏咱們使用的是jpaTemplate進行操做實體,不須要關注createEntityManage以及close

相關文章
相關標籤/搜索