?? jpa入門.txt
字號:
JPA日志:The logging utility is based on the java.util.logging. This utility provides you with nine levels of logging control over the amount and detail of the log output. Note that, as logging is not part of the JPA specification, the information the log output provides is TopLink JPA-specific.
要培植在persistence.xml中
<property name="toplink.logging.level" value="FINE" />
一、課程目標
ORM概念
JPA入門
二、引入持久化
well框架是怎么樣寫的呢?dao/db/po,數據是怎么樣保存到數據庫中去的呢?dao.save(po)方法,其中save方法是用sql保存進去的。
這個就叫持久化,持久(Persistence),即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內存中的數據存儲在關系型的數據庫中。
持久化還有哪些技術呢?
1. jdbc,well框架中用過
2. io流,將對象寫到文件中去,當然也可以存儲在磁盤文件中、XML數據文件中等等。
三、什么叫持久層呢
與持久化相關的一個概念就是持久層,處理持久化的一個邏輯層面。它是由多個類與接口組成的,目的就是實現持久化。譬如我們的well框架的數據層就是持久層。
四、ORM。
1. 持久層的煩惱
關系型數據庫中的數據基本都是以一行行的數據進行存取的,而程序運行卻是一個個對象進行處理,jjdbc保存時,就得把VO對象變成insert語句插入,查詢時,又要將結果集ResultSet組裝成VO對象。所以為解決這一困難,就出現 ORM 這一個對象和數據之間映射技術。
2. 概念
ORM-Object/Relational Mapper
即“對象-關系型數據映射組件”。對于O/R,即 Object(對象)和 Relational(關系型數據),表示必須同時使用面向對象和關系型數據進行開發。
3. 原理
面向對象概念 面向關系概念
類 表
對象 記錄
屬性 字段
屬性 主鍵
4. 優點
不用寫sql對數據進行操作,直接對對象進行操作
不用寫復雜的sql,用映射可以方便處理表與表之間的關系。
靈活性,改表與字段不用改程序。
5. orm的實現方式有兩種:
映射文件、注釋。哪個更好呢?
中小型項目100張表左右,或者開發團中無專人做映射,安全性高的用注釋
否則用映射文件
6. 常用框架
映射文件:Hibernate
注釋:JPA,EJB
五、JPA介紹
1. 概念
JPA(Java Persistence API),是JavaEE企業級應用規范,是開源的,基于ORM的用于實現數據的持久化。 作為Java EE 5.0平臺標準的ORM規范,將得到所有Java EE服務器的支持。
Sun這次吸取了之前EJB規范慘痛失敗的經歷,在充分吸收現有ORM框架的基礎上,得到了一個易于使用、伸縮性強的ORM規范。從目前的開發社區的反應上看,JPA受到了極大的支持和贊揚,JPA作為ORM領域標準化整合者的目標應該不難實現。
Sun引入新的JPA ORM規范出于兩個原因:
其一,簡化現有Java EE和Java SE應用的對象持久化的開發工作;
其二,Sun希望整合對ORM技術,實現天下歸一。
2. glassfish介紹
需要j2ee服務器的支持,到目前為止,有哪些j2ee服務器呢?Tomcat/Resin/JBOSS/GlassFish/WAS/WLS
由SUN公司的GlassFish社團開發,Glassfish JPA - 一個基于 Oracle’s TopLink ORM framework 的開源項目。GlassFish(水晶魚)是一個免費、開放源代碼的應用服務,它實現了Java EE 5。 Java EE 5 平臺包括了以下最新技術:EJB 3.0,JSF 1.2,Servlet 2.5,JSP 2.1,JAX-WS 2.0,JAXB 2.0, Java Persistence 1.0, Common Annonations 1.0, StAX 1.0 等。
GlassFish雖然是一個標準的Java EE服務器,但是它同樣具有輕便的Web容器的優點,它和Tomcat一樣是優秀的Servlet容器,同時,它具備延遲加載的功能,也就是說, GlassFish在啟動時只會啟動一些必需的核心服務項,如Local JNDI服務,用于管理的JMX服務等,而對于暫時用不到的服務通通不予加載,直到需要的時候再說,而且這個特性不需要額外的配置。這樣 GlassFish的啟動時間是以前的一半,內存占用也只有以前的一半。
GlassFish的另外一個秘密武器,就是Grizzly,Grizzly是一個基于Java NIO(New IO)技術,并完全以Java實現的一個HTTP的Listener,有了Grizzly,GlassFish在靜態文件傳輸方面的性能比Tomcat要 強得多,而且可以支持更多的并發訪問。我們可以拋棄JBoss+Tomcat和Apache+Tomcat這樣的組合了。
3. 下載:
JDK 5.0. http://java.sun.com/j2se/1.5.0/download.jsp
Java EE 5.0 App Server: https://glassfish.dev.java.net/public/downloadsindex.html; http://java.net/download/javaee5/v2_branch/promoted/WINNT/glassfish-installer-v2-b58g.jar
4. 安裝
1)設置環境變量
GLASSFISH_HOME=D:\Program\glassfish
path=%GLASSFISH_HOME%\bin
2) java -jar *.jar 可安裝,此時解壓出一個目錄
3) ant -f f:\glassfish\setup.xml 再編譯
D:\Program\glassfish\lib\ant\bin下自帶了一個ant
4) 系統默認的 administration 屬性值有:
domain.name="domain1"
instance.name="server"
admin.user="admin"
admin.password="adminadmin"
admin.port="4848"
instance.port"="8080"
orb.port="3700"
imq.port="7676"
https.port="8181"
5. 啟動與停止
$GLASSFISH_HOME/bin/asadmin start-domain domain1
asadmin stop-domain domain1
6. 配置與myEclipse的連接
一切按默認配置后,啟動,報幾個jar沒有找到,沒關系,在GlassFish1-paths-Append to ClassPath中導入javaee.jar/jmac-api.jar即可。這兩個jar包位于glassfish\lib下。
7. 訪問
web應用目錄:http://localhost:8080/
管理控制臺:http://localhost:4848/ 用戶名:密碼=admin:adminadmin
8. 部署應用程序
拷貝 hello.war domains/domain1/autodeploy/
訪問:http://localhost:8080/hello/index.jsp
也可用命令:
asadmin deploy jpa.war
asadmin undeploy h.war
部署出錯,要訪問日志文件:
D:\Program\glassfish\domains\domain1\logs\server.log
六. Derby數據庫
Glassfish App Server捆綁了一個數據庫叫Derby,是一個理想的,并且開源的,100% Java編寫的,容易管理的關系數據庫管理系統,它可以和一些商業產品的特性進行交付。這篇文章是關注Apache Derby項目
配置環境變量:
DERBY_HOME=D:\Program\glassfish\javadb
PATH=%DERBY_HOME%\bin
啟動命令是: $GLASSFISH_HOME/bin/asadmin start-database --不要加;
停止命令是:$GLASSFISH_HOME/bin/asadmin stop-database
創建一個叫accp數據庫,并建立連接
ij> connect 'jdbc:derby://localhost:1527/accp;create=true';
然后運行建表語句的sql文件
ij> run 'abc.sql';
直接建表,sql通用
SHOW SCHEMAS;
SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema }
DESCRIBE name;
七、javaSe開發
1. 新建java項目
導入javaee.jar,jmac-api.jar,toplink-essentials.jar,toplink-essentials-agent.jar,derbyclient.jar
2. 建庫建表
asadmin start-database
ij> connect 'jdbc:derby://localhost:1527/accp;create=true';
create table users(pk1 int not null primary key , userid varchar(20), PASSWORD varchar(20));
show tables;
show tables in app;
descrbite user;
3. 寫個普通的javaBean
@Entity
@Table(name="users")
//上面兩句可以寫成一句@Entity(name="users")
public class User implements Serializable {
private int pk1;
private String userid;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "pk1")
public int getPk1() {
return pk1;
}
public void setPk1(int pk1) {
this.pk1 = pk1;
}
@Column(name = "userid")
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
}
4. 寫個UserDao
public class UserDao {
//Apache Derby數據庫提供2類JDBC驅動程序:Embedded
//Driver(org.apache.derby.jdbc.EmbeddedDriver)和Client/Server
//Driver(org.apache.derby.jdbc.ClientDriver)
private static final EntityManagerFactory emf;
private static EntityManager em;
static {
//為了提升軟件的執行效率,我們通常選擇在某一個范圍內緩存 EntityManagerFactory 對象。在 EntityManagerFactory 使用完后,我們需要調用它的 close 方法來釋放相應的資源。
emf = Persistence.createEntityManagerFactory("aa");
//使用完后,也需要關閉em.close();永遠不要對注入的EntityManager實例調用close()方法,清除工作是應用服務器的任務。如果你手工關閉entity manager,則會導致IllegalStateException異常。
if (em == null)
em = emf.createEntityManager();
}
public void close() {
em.close();
emf.close();
}
//主鍵查詢
public void find(int uid){
User u = em.find(User.class, uid);
System.out.println(u.getUserid()+"\t"+u.getPassword());
}
//保存
public void persist(User u) {
em.getTransaction().begin();
em.persist(u);
em.getTransaction().commit();
}
//刪除
public void remove(int uid) {
User u = em.find(User.class, uid);
em.getTransaction().begin();
em.remove(u);
em.getTransaction().commit();
}
//更新
public void merge(int uid) {
User u = em.find(User.class, uid);
u.setPassword("888");
em.getTransaction().begin();
em.merge(u);
em.getTransaction().commit();
}
//查找所有的
@SuppressWarnings("unchecked")
public void findAll() {
String sql = "select u from User u";
List<User> list = em.createQuery(sql).getResultList();
for(User u : list)
System.out.println(u.getUserid()+"\t"+u.getPassword());
}
public static void main(String[] args) {
try{
UserDao udao = new UserDao();
//udao.find(1);
User u = new User();
u.setUserid("abc");
u.setPassword("123");
u.setPk1(3);
//udao.persist(u);
//udao.remove(3);
//udao.merge(3);
udao.findAll();
}finally{
udao.close();
}
}
5. 在java項目中新建META-INF目錄,再新建persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="aa">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<class>org.accp.User</class>
<properties>
<property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
<property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/accp;create=true" />
<property name="toplink.jdbc.user" value="app" />
<property name="toplink.jdbc.password" value="app" />
</properties>
</persistence-unit>
</persistence>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -