📄 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 + -