一、jpa是什么
JPA:java persistence API java持久化API罗捎,是一種ORM規(guī)范芋肠,由廠商來實(shí)現(xiàn)列吼,目前有HB幽崩,OpenJPA,TopLink和? EclipseJPA。
二寞钥、spring集成JPA
1.JPA一共兩種配置類型:應(yīng)用程序驅(qū)動(dòng)(管理)和容器驅(qū)動(dòng)(管理)
1)兩種類型都需要獲取的EntityManagerFactory,然后來訪問數(shù)據(jù)庫陌选。
2)區(qū)別在于理郑,
a.應(yīng)用程序管理類型是基于配置文件的,persisitence.xml,在這個(gè)配置文件中咨油,配置n個(gè)持久化單元和數(shù)據(jù)庫屬性配置您炉,請(qǐng)求到達(dá)后,由程序去解析文件來配置和創(chuàng)建這個(gè)持久化單元役电,至于事物需要應(yīng)用程序本身來控制赚爵,集成到spring之后,獲取factory和事物由spring容器來控制法瑟,但是配置文件仍是必須的冀膝。
b.根據(jù)上述應(yīng)用程序管理的配置,可以看出來霎挟,至少需要一個(gè)配置窝剖,并且每次請(qǐng)求到達(dá)后,由程序來初始化酥夭。而容器管理器赐纱,依托于spring容器時(shí),在初始化的時(shí)候熬北,直接根據(jù)配置信息初始化相關(guān)bean疙描,生成所需要的factory。這種配置信息可以放到xml文件里讶隐,也可以使用代碼的方式起胰,比如下面:
@Bean
public xxxxxxx? xxx(){
.....}
2.由于上述觀點(diǎn),主要研究一下基于容器管理的JPA
1)LocalContainerEntityManagerFactory 此為構(gòu)造容器JPA的主要bean整份,也是要在初始化spring容器時(shí)需要注入到spring容器中的待错。
他支持幾個(gè)平時(shí)常用的方法,eg:
a.? setDataSource(dataSource)? 參數(shù)就是你的數(shù)據(jù)源烈评,你可以自定義數(shù)據(jù)源火俄,可以在xml里,也可以用@bean的方式注入讲冠。
b.? setJpaVendorAdapter(vendorAdapter) 標(biāo)注廠商類型瓜客,因?yàn)镴PA只是一種規(guī)范,剛開始提到的(這個(gè)adapter可以自己實(shí)現(xiàn),具體的就不細(xì)說了)谱仪。
c.? setPackagesToScan(String[]) 掃描指定包路徑下的所有被@Entity表示的bean
以上只是一部分玻熙,因?yàn)檫@個(gè)類有個(gè)抽象父類。
3.還有jndi的方式疯攒。
上面只是代表我們已經(jīng)集成了JPA規(guī)范嗦随,啟動(dòng)spring 容器后,容器中有我們可用的factory敬尺,下面是如何使用枚尼。
4.在service類中,注入以下其中之一的bean
1)?
????@PersisitenceUnit
????private EntityManagerFactory emf;
使用:emf.createEntityManager.xxxx
2)
????@PersistenceContext
????private EntityManager em;
使用:em.xxxxx;
第一種是直接講factory注入到service中砂吞,調(diào)用創(chuàng)建manager的方法之后執(zhí)行 數(shù)據(jù)庫操作署恍。
EntityManager接口中具體的方法,還需要參照EntityManager.class中的
5.我們可以用spring data jpa 來封裝 和豐富dao層的這些api蜻直,因?yàn)閟pring會(huì)在運(yùn)行時(shí)期自己查找匹配類和分解方法簽名
eg:findUserByIdOrNameOrderByNoAllIgnoringCase(Long id) spring會(huì)自定解析 之后動(dòng)態(tài)生成子類盯质,find為動(dòng)詞,動(dòng)詞是spring指定的幾個(gè)概而,比如呼巷,get read find count。
user為查找的對(duì)象到腥,可以省略朵逝,下面再說為何可以省略,by 連接詞 后面跟條件乡范,Or sql中的意思配名,OrderBy排序,AllIgnoringCase忽略大小寫晋辆。
這樣渠脉,根據(jù)約定來編寫方法簽名的接口即可動(dòng)態(tài)生成子類。
這個(gè)接口如果寫的瓶佳,前面說到查找對(duì)象為何可以省略呢芋膘,在這
public interface S implements JpaRepository 泛型中,User為目標(biāo)對(duì)象類型霸饲,Long 為主鍵類型为朋。
6.其實(shí)寫到這,ORM的DAO層就已經(jīng)結(jié)束了厚脉,但是我們知道习寸,基本的dao方法加上上面說的根據(jù)自定義方法簽名來生成方法 有很多時(shí)候并不符合我們的業(yè)務(wù)邏輯,比如簡單的傻工,兩個(gè)表連接查詢霞溪。這個(gè)時(shí)候孵滞,spring data為我們提供了另一個(gè)方便:
public interface Op{
List search();
}
public interface S implements JpaRepository ,Op{
}
Op接口實(shí)現(xiàn)類,自定義自己的方法體鸯匹,但是這個(gè)實(shí)現(xiàn)類的命名一定要以上面接口名稱為前綴坊饶,以「iml」為后綴
public class Siml implements Op{
public List search(){
..............;
}
}
這樣,容器在掃描時(shí)殴蓬,會(huì)自動(dòng)去匹配實(shí)現(xiàn)某接口的匿级,以xx為前綴 以iml為后綴,將動(dòng)態(tài)生成的實(shí)現(xiàn)類與這個(gè)實(shí)現(xiàn)類組合成一個(gè)類科雳,在使用時(shí)直接注入
@Service
private Op siml;即可