日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > 互聯(lián)網(wǎng) > J2EE開(kāi)發(fā)框架搭建(6) - 使用hibernate4完成基本Dao的封裝

J2EE開(kāi)發(fā)框架搭建(6) - 使用hibernate4完成基本Dao的封裝

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-09-29 08:00:01 閱讀次數(shù):2701次

現(xiàn)在orm框架有很多,比如說(shuō)guzz,hibernate,mybaits....,在封裝一個(gè)框架的時(shí)候我們可以選擇一種,也可以選擇多種實(shí)現(xiàn),供以后使用選擇,這里我只實(shí)現(xiàn)了hibernate,目錄結(jié)構(gòu)圖如下:

1. 首先查詢BaseRepository這個(gè)接口,該接口泛型 :T 表示實(shí)體類(lèi)型;ID表示主鍵類(lèi)型;雖然在框架里面已經(jīng)提供了查詢的結(jié)構(gòu)Searchable,但是Searchable也不能做到無(wú)限強(qiáng)大,比如一個(gè)多變關(guān)聯(lián)查詢,嵌套查詢是沒(méi)有辦法完成的,所有只能自己編寫(xiě)sql語(yǔ)句,但是hibernate編寫(xiě)sql語(yǔ)句都只能寫(xiě)在java代碼里面,用過(guò)mybaits的朋友就知道sql語(yǔ)句可以配置在xml里面 ,這里我們就可以簡(jiǎn)單的仿照mybaits來(lái)完成,在這個(gè)接口中就提供了調(diào)用xml中的sql語(yǔ)句的方法,具體怎么實(shí)現(xiàn)后面再說(shuō)明:

package com.hqhop.framework.common.orm; ///import ..... /** * <p> * 抽象DAO層基類(lèi) 提供一些簡(jiǎn)便方法<br/> * <p/> * <span style="color:#ff0000;">泛型 :T 表示實(shí)體類(lèi)型;ID表示主鍵類(lèi)型</span> * <p> * Version: 1.0 * * @author silentwu */ public interface BaseRepository<T extends AbstractEntity<ID>, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { /** * 根據(jù)主鍵刪除 * * @param ids */ public void delete(ID... ids); /** * 根據(jù)條件查詢所有 條件 + 分頁(yè) + 排序 * * @param searchable * @return */ public Page<T> findAll(Searchable searchable); /** * 根據(jù)條件統(tǒng)計(jì)所有記錄數(shù) * * @param searchable * @return */ public long count(Searchable searchable); public void update(T entity); /** * 自定義sql更新 * * @param sqlKey * @param params */ public void update(String sqlKey, Object... params); /** * 自定義sql查詢 * * @param sqlKey * @param params * @return */ public List<T> findAll(String sqlKey, Object... params); public Page<T> findPage(Pageable pageable, String sqlKey, Object... params); /** * 自定義sql刪除 * * @param sqlKey * @param params */ public void delete(String sqlKey, Object... params); }

該接口繼承了spring的PagingAndSortingRepository接口, 然而PagingAndSortingRepository又繼承了CrudRepository接口,所以BaseRepository就具有了基本的增刪改查以及自己定義的一些方法:

@NoRepositoryBean public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
@NoRepositoryBean public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); <S extends T> Iterable<S> save(Iterable<S> entities); T findOne(ID id); boolean exists(ID id); Iterable<T> findAll(); Iterable<T> findAll(Iterable<ID> ids); long count(); void delete(ID id); void delete(T entity); void delete(Iterable<? extends T> entities); void deleteAll(); }
2. 接下來(lái)查看BaseRepository的實(shí)現(xiàn)類(lèi)BaseRepositoryImpl,由于要使用hibernate操作數(shù)據(jù)庫(kù),所以要提供session,在hibernate4中已經(jīng)建議直接使用session操作數(shù)據(jù)庫(kù),建議不要在使用hibernateTemplate;要使用sessionFactory.getCurrentSession()來(lái)獲取當(dāng)前的線程中的session就必須開(kāi)啟事物,所以在spring-config.xml中加入下代碼:

<!-- 開(kāi)啟注解事務(wù) 只對(duì)當(dāng)前配置文件有效 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> <!-- 配置Hibernate事務(wù)管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
在BaseRepositoryImpl就可以使用如下代碼了:

@Autowired private SessionFactory sessionFactory; public Session getSession() { // 事務(wù)必須是開(kāi)啟的(Required),否則獲取不到 return sessionFactory.getCurrentSession(); }
3. 在BaseRepositoryImpl中還必須要有一個(gè)Class 屬性,指定運(yùn)行時(shí)刻BaseRepositoryImpl操作的實(shí)體類(lèi),因?yàn)樵趆ibernate中做了sql查詢或者是hql查詢,查詢的結(jié)果通過(guò)反射轉(zhuǎn)化為實(shí)體類(lèi)返回到service。那么又怎么給這個(gè)Class對(duì)象賦值呢?在這里我們需要自己定義一個(gè)注解Repository,在這個(gè)注解中就記錄了BaseRepositoryImpl要操作的實(shí)體類(lèi):

/** * * @author silentwu * */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @org.springframework.stereotype.Repository public @interface Repository { /** * Repository在spring容器中的實(shí)例名稱(chēng) */ String value() default ""; /** * Repository處理的實(shí)體類(lèi) * * @return */ Class<?> entity(); }
接下來(lái)我們就可以直接在BaseRepositoryImpl中獲取這個(gè)注解來(lái)得到Class,在BaseRepositoryImpl中添加如下代碼:

private Class<T> clazz; @PostConstruct @SuppressWarnings("unchecked") public void init() throws Exception { <span style="color:#ff0000;">Repository repository = this.getClass().getAnnotation(Repository.class);</span> if (Utils.isNotEmpty(repository)) { if (Utils.isNotEmpty(repository.entity())) { <span style="color:#ff0000;">this.clazz = (Class<T>) repository.entity();</span> this.countAllQL = String.format(COUNT_QUERY_STRING, clazz.getName()); this.findAllQL = String.format(FIND_QUERY_STRING, clazz.getName()); } else { throw new Exception(Repository.class + "注解的entity不能為空!"); } } else { throw new Exception(this.getClass() + " 必須要使用" + Repository.class + "注解!"); } }
在init()方法上面添加了@PostConstruct注解,表示在類(lèi)被spring容器實(shí)例化后要執(zhí)行的方法;也可以實(shí)現(xiàn)spring的InitializingBean接口來(lái)達(dá)到同樣的效果(但是spring已經(jīng)不推薦使用這種方式)

4. 在前面的章節(jié)中,我們提供了邏輯刪除的接口LogicDeleteable,具體實(shí)現(xiàn)邏輯的刪除就是在BaseRepositoryImpl中,在BaseRepositoryImpl中提供了多個(gè)刪除方法,但是主要的刪除操作只有一個(gè)delete(T entity),其他的刪除都是調(diào)用的這個(gè):

/** * 檢查是否實(shí)現(xiàn)了邏輯刪除接口 * * @return */ private boolean checkLogicDeleteable() { Class[] inters = this.clazz.getInterfaces(); boolean flag = false; for (int i = 0; i < inters.length; i++) { if ("LogicDeleteable".equals(inters[i].getSimpleName())) { flag = true; break; } } return flag; } @Override public void delete(T entity) { if (Utils.isNotEmpty(entity)) { if (entity instanceof LogicDeleteable) { ((LogicDeleteable) entity).markDeleted(); update(entity); } else { this.getSession().delete(entity); } } }
在刪除對(duì)象的時(shí)候首先判斷是否實(shí)現(xiàn)了LogicDeleteable接口,若為true  ==> 調(diào)用markDeleted(); 否則真實(shí)刪除。

5. BaseRepository,BaseRepositoryImpl的使用方式,操作User實(shí)體類(lèi):

接口UserDao

public interface UserDao extends BaseRepository<User, String> { }
實(shí)現(xiàn)類(lèi)UserDaoImpl,使用@Repository注解,指定操作的實(shí)體類(lèi)

@Repository(entity = User.class) public class UserDaoImpl extends BaseRepoitoryImpl<User, String> implements UserDao { }













生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 免费成人黄色 | 这里只有久久精品视频 | 一及毛片视频 | 中文字幕在线电影 | 成人97精品毛片免费看 | 日韩欧美精品区 | 成人在线视频网址 | 国产精品久久久久久久久久三级 | 在线中文一区 | 日本色网站 | 美女操人网站 | 久久99精品久久久久 | 国产一二区免费视频 | 国产精品乱| 亚洲综合色站 | 天天操,狠狠操 | 美女福利一区 | 黄色小视频在线看 | 婷婷综合| 久久国产欧美一区二区三区精品 | 2022国产精品 | 久久久综合亚洲91久久98 | 久久99精品久久久久久国产越南 | 日韩视频在线免费 | √天堂8在线网 | 午夜日韩 | 成人亚洲 | 日韩伦理电影网站 | 亚洲视频精品在线 | 日本黄在线| 美日韩毛片 | 国产精品免费一区 | 成人午夜网| 99热免费 | 免费精品视频一区二区三区 | 精品久久久久久久久久久久久久久 | 国产不卡在线播放 | 九九99久久| 精品日本一区二区 | 中文字幕一区二区三区四区在线观看 | 狼人av在线 |