?? 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" />
一、JPA介紹
JavaEE的是企業級應用規范,JPA(Java Persistence API)作為Java EE 5.0平臺標準的ORM規范,將得到所有Java EE服務器的支持。Sun這次吸取了之前EJB規范慘痛失敗的經歷,在充分吸收現有ORM框架的基礎上,得到了一個易于使用、伸縮性強的ORM規范。從目前的開發社區的反應上看,JPA受到了極大的支持和贊揚,JPA作為ORM領域標準化整合者的目標應該不難實現。Sun引入新的JPA ORM規范出于兩個原因:其一,簡化現有Java EE和Java SE應用的對象持久化的開發工作;其二,Sun希望整合對ORM技術,實現天下歸一。
二、glassfish安裝配置與使用
1. glassfish介紹
由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這樣的組合了。
D:\Program\glassfish\lib\ant\bin下自帶了一個ant
2. 下載:
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
3. 安裝
1)設置環境變量
GLASSFISH_HOME=D:\Program\glassfish
path=%GLASSFISH_HOME%\bin
2) java -jar *.jar 可解壓出一個目錄
3) ant -f setup.xml 再安裝
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"
4. 啟動與停止
$GLASSFISH_HOME/bin/asadmin start-domain domain1
asadmin stop-domain domain1
5. 配置與myEclipse的連接
一切按默認配置后,啟動,報幾個jar沒有找到,沒關系,在GlassFish1-paths-Append to ClassPath中導入javaee.jar/jmac-api.jar即可。
5. 訪問
web應用目錄:http://localhost:8080/
管理控制臺:http://localhost:4848/ 用戶名:密碼=admin:adminadmin
6. 部署應用程序
拷貝 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
7. 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")
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
@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 {
emf = Persistence.createEntityManagerFactory("aa");
if (em == null)
em = emf.createEntityManager();
}
//主鍵查詢
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) {
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();
}
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>
四、web項目開發
1. 在derby數據庫中創建表與數據
CREATE TABLE users (
pk1 int,
userid VARCHAR(20),
password varchar(20));
INSERT INTO users values(1,'張三','123');
INSERT INTO users values(2,'李四','123');
-------------------------------------------
2. 新建web應用程序
導入jpa的jar包,javaee.jar
3. 寫Entity類
Entity類實際上是一個JavaBean,它表示了一個數據庫中的表.類中使用了以下3個annotation.
@Entity: 指定這個類為Entity.
@Table : 指定mapping的表.
@Id : 指定表中的主鍵.
寫類
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="users")
public class User implements Serializable {
private int pk1;
private String userid;
private String password;
@Id
public String getPk1() {
return pk1;
}
public String getUserid() {
return this.userid;
}
public void setPk1(int pk1) {
this.pk1 = pk1;
}
......
}
4. 數據庫操作類
這個類提供了對數據庫操作的方法,實際上是通過EntityManager類中的方法進行操作的.而EntityManager類是由EntityManagerFactory生成的.
import java.util.*;
import javax.persistence.*;
import database.Book;
public class UserDao {
private ArrayList users;
private EntityManager em;
public UserDao(EntityManagerFactory emf) throws Exception {
em = emf.createEntityManager();
}
public void remove() {
try {
em.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public User findByPk(int uid){
User u = em.find(User.class, uid);
return u;
}
}
5 Servlet類
在這個類中由container注入一個EntityManagerFactory并且把它傳遞給UserDao類.注意EntityManagerFactory 的注入需要在由容器管理的實體中進行(比如Servlet).
public class UserServlet extends HttpServlet {
private UserDao userDao;
@PersistenceUnit
private EntityManagerFactory emf;
public void init() throws ServletException {
try {
userDao = new UserDao(emf);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public void destroy() {
userDao = null;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
response.setContentType("text/html");
// response.setBufferSize(8192);
PrintWriter out = response.getWriter();
String userid = request.getParameter("userid");
try {
User u = userDao.findByPk(Integer.valueOf(userid));
out.println(userid + ": " + u.getUserid());
} catch (Exception bnf) {
out.println("The book not found.");
out.close();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -