?? jpa開發(fā).txt
字號(hào):
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的是企業(yè)級(jí)應(yīng)用規(guī)范,JPA(Java Persistence API)作為Java EE 5.0平臺(tái)標(biāo)準(zhǔn)的ORM規(guī)范,將得到所有Java EE服務(wù)器的支持。Sun這次吸取了之前EJB規(guī)范慘痛失敗的經(jīng)歷,在充分吸收現(xiàn)有ORM框架的基礎(chǔ)上,得到了一個(gè)易于使用、伸縮性強(qiáng)的ORM規(guī)范。從目前的開發(fā)社區(qū)的反應(yīng)上看,JPA受到了極大的支持和贊揚(yáng),JPA作為ORM領(lǐng)域標(biāo)準(zhǔn)化整合者的目標(biāo)應(yīng)該不難實(shí)現(xiàn)。Sun引入新的JPA ORM規(guī)范出于兩個(gè)原因:其一,簡(jiǎn)化現(xiàn)有Java EE和Java SE應(yīng)用的對(duì)象持久化的開發(fā)工作;其二,Sun希望整合對(duì)ORM技術(shù),實(shí)現(xiàn)天下歸一。
二、glassfish安裝配置與使用
1. glassfish介紹
由SUN公司的GlassFish社團(tuán)開發(fā),Glassfish JPA - 一個(gè)基于 Oracle’s TopLink ORM framework 的開源項(xiàng)目。GlassFish(水晶魚)是一個(gè)免費(fèi)、開放源代碼的應(yīng)用服務(wù),它實(shí)現(xiàn)了Java EE 5。 Java EE 5 平臺(tái)包括了以下最新技術(shù):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雖然是一個(gè)標(biāo)準(zhǔn)的Java EE服務(wù)器,但是它同樣具有輕便的Web容器的優(yōu)點(diǎn),它和Tomcat一樣是優(yōu)秀的Servlet容器,同時(shí),它具備延遲加載的功能,也就是說(shuō), GlassFish在啟動(dòng)時(shí)只會(huì)啟動(dòng)一些必需的核心服務(wù)項(xiàng),如Local JNDI服務(wù),用于管理的JMX服務(wù)等,而對(duì)于暫時(shí)用不到的服務(wù)通通不予加載,直到需要的時(shí)候再說(shuō),而且這個(gè)特性不需要額外的配置。這樣 GlassFish的啟動(dòng)時(shí)間是以前的一半,內(nèi)存占用也只有以前的一半。
GlassFish的另外一個(gè)秘密武器,就是Grizzly,Grizzly是一個(gè)基于Java NIO(New IO)技術(shù),并完全以Java實(shí)現(xiàn)的一個(gè)HTTP的Listener,有了Grizzly,GlassFish在靜態(tài)文件傳輸方面的性能比Tomcat要 強(qiáng)得多,而且可以支持更多的并發(fā)訪問(wèn)。我們可以拋棄JBoss+Tomcat和Apache+Tomcat這樣的組合了。
D:\Program\glassfish\lib\ant\bin下自帶了一個(gè)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)設(shè)置環(huán)境變量
GLASSFISH_HOME=D:\Program\glassfish
path=%GLASSFISH_HOME%\bin
2) java -jar *.jar 可解壓出一個(gè)目錄
3) ant -f setup.xml 再安裝
4) 系統(tǒng)默認(rèn)的 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. 啟動(dòng)與停止
$GLASSFISH_HOME/bin/asadmin start-domain domain1
asadmin stop-domain domain1
5. 配置與myEclipse的連接
一切按默認(rèn)配置后,啟動(dòng),報(bào)幾個(gè)jar沒有找到,沒關(guān)系,在GlassFish1-paths-Append to ClassPath中導(dǎo)入javaee.jar/jmac-api.jar即可。
5. 訪問(wèn)
web應(yīng)用目錄:http://localhost:8080/
管理控制臺(tái):http://localhost:4848/ 用戶名:密碼=admin:adminadmin
6. 部署應(yīng)用程序
拷貝 hello.war domains/domain1/autodeploy/
訪問(wèn):http://localhost:8080/hello/index.jsp
也可用命令:
asadmin deploy jpa.war
asadmin undeploy h.war
部署出錯(cuò),要訪問(wèn)日志文件:
D:\Program\glassfish\domains\domain1\logs\server.log
7. Derby數(shù)據(jù)庫(kù)
Glassfish App Server捆綁了一個(gè)數(shù)據(jù)庫(kù)叫Derby,是一個(gè)理想的,并且開源的,100% Java編寫的,容易管理的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),它可以和一些商業(yè)產(chǎn)品的特性進(jìn)行交付。這篇文章是關(guān)注Apache Derby項(xiàng)目
配置環(huán)境變量:
DERBY_HOME=D:\Program\glassfish\javadb
PATH=%DERBY_HOME%\bin
啟動(dòng)命令是: $GLASSFISH_HOME/bin/asadmin start-database --不要加;
停止命令是:$GLASSFISH_HOME/bin/asadmin stop-database
創(chuàng)建一個(gè)叫accp數(shù)據(jù)庫(kù),并建立連接
ij> connect 'jdbc:derby://localhost:1527/accp;create=true';
然后運(yùn)行建表語(yǔ)句的sql文件
ij> run 'abc.sql';
直接建表,sql通用
SHOW SCHEMAS;
SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema }
DESCRIBE name;
三、javaSe開發(fā)
1. 新建java項(xiàng)目
導(dǎo)入javaee.jar,jmac-api.jar,toplink-essentials.jar,toplink-essentials-agent.jar,derbyclient.jar
2. 建庫(kù)建表
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. 寫個(gè)普通的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. 寫個(gè)UserDao
public class UserDao {
//Apache Derby數(shù)據(jù)庫(kù)提供2類JDBC驅(qū)動(dòng)程序: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項(xiàng)目中新建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項(xiàng)目開發(fā)
1. 在derby數(shù)據(jù)庫(kù)中創(chuàng)建表與數(shù)據(jù)
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應(yīng)用程序
導(dǎo)入jpa的jar包,javaee.jar
3. 寫Entity類
Entity類實(shí)際上是一個(gè)JavaBean,它表示了一個(gè)數(shù)據(jù)庫(kù)中的表.類中使用了以下3個(gè)annotation.
@Entity: 指定這個(gè)類為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. 數(shù)據(jù)庫(kù)操作類
這個(gè)類提供了對(duì)數(shù)據(jù)庫(kù)操作的方法,實(shí)際上是通過(guò)EntityManager類中的方法進(jìn)行操作的.而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類
在這個(gè)類中由container注入一個(gè)EntityManagerFactory并且把它傳遞給UserDao類.注意EntityManagerFactory 的注入需要在由容器管理的實(shí)體中進(jìn)行(比如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();
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -