實習第一個階段,來這邊有小半個月了,前面一週在熟悉這邊開發平臺,最近在學習一些基礎技術,週末開始接受培訓,這個公司用的是本身的框架,可是底層使用的仍是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