Java持久性API(JPA)第1讲——简单实例

采用的是servlet+JSP+JPA的学生信息管理系统 本系统是学生信息管理系统,主要演示JPA在实际项目中的使用,采用的是servlet+JSP+JPA.是EJB JPA 这本书里的例子。 立即下载
 
目标:使用Java持久性API把数据库中的数据显示出来。
基本过程包括:
u       加载驱动程序
u       创建数据库以及表
u       在NetBeans中加载驱动程序
u       在NetBeans中创建连接
u       创建持久单元以及实体类
u       创建访问持久单元的会话Bean
u       创建Servlet客户端程序,访问会话Bean,并显示结果
1、放JDBC驱动程序到下面的目录
根据自己的安装目录进行修改。如果采用默认安装,应该放在下面的目录下。
C:/Sun/AppServer/domains/domain1/lib/ext
2、在MySQL数据库中添加数据库entity
create database entity
3、创建表userinfo
    在entity数据库中创建表,表结构与书上25章的一样,插入几条测试数据。
create table userinfo
(
   userid varchar(10) primary key not null,
   username varchar(10) not null,
   userpass varchar(10) not null,
   usertype char(1) not null
)
插入如下测试数据:
insert into userinfo values('user001','zhangsan','zhangsan','0');
insert into userinfo values('user002','lisi','lisi','0');
insert into userinfo values('admin001','mishu','mishu','0');
4、在NetBeans中添加驱动程序
在Drivers上面点击右键,选择New Driver。选择JDBC驱动程序所在的jar压缩包。
5、添加连接
在上图的Databases上点击右键选择New Connection,在弹出的界面上选择前面添加的驱动程序,然后修改URL,修改后:jdbc:mysql://localhost:3306/entity。
其中:localhost表示主机,3306表示端口,entity表示数据库。
6、创建EJB Module
    选择FileàNew Project,选择中间的Enterprise,然后选择右边的EJB Module。工程的名字是UserSession。
7、创建持久单元
在工程上面点击右键,选择NewàFile/Folder,选择中间的Persistence,右边选择Persistence Unit。在弹出的界面中,选择数据源:选择New DataSource。在弹出的界面中输入一个JNDI名字entity2,然后选择前面第5步创建好的连接。
生成的文件如下:
<?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="UserPU" transaction-type="JTA">
    <provider>
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
</provider>
    <jta-data-source>entity2</jta-data-source>
    <properties>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
 </persistence-unit>
</persistence>
8、创建持久类
在工程上面点击右键,选择New,然后选择Entity Class from DataBase。在DataSource中选择刚才配置好的数据源entity2。然后在左下方会出现表,选择中间的Add,添加到右边。选择下一步,然后完成即可。生成的文件如下:
/*
 * Userinfo.java
 *
 * Created on 2007年5月21日, 上午6:17
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
 
package jpa;
 
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
 
/**
 * Entity class Userinfo
 *
 * @author Administrator
 */
@Entity
@Table(name = "userinfo")
@NamedQueries( {
        @NamedQuery(name = "Userinfo.findByUserid",
 query = "SELECT u FROM Userinfo u WHERE u.userid = :userid"),
        @NamedQuery(name = "Userinfo.findByUsername",
query = "SELECT u FROM Userinfo u WHERE u.username = :username"),
        @NamedQuery(name = "Userinfo.findByUserpass",
query = "SELECT u FROM Userinfo u WHERE u.userpass = :userpass"),
        @NamedQuery(name = "Userinfo.findByUsertype",
query = "SELECT u FROM Userinfo u WHERE u.usertype = :usertype")
    })
public class Userinfo implements Serializable {
 
    @Id
    @Column(name = "userid", nullable = false)
    private String userid;
 
    @Column(name = "username", nullable = false)
    private String username;
 
    @Column(name = "userpass", nullable = false)
    private String userpass;
 
    @Column(name = "usertype", nullable = false)
    private char usertype;
   
    /** Creates a new instance of Userinfo */
    public Userinfo() {
    }
 
    /**
     * Creates a new instance of Userinfo with the specified values.
     * @param userid the userid of the Userinfo
     */
    public Userinfo(String userid) {
        this.userid = userid;
    }
 
    /**
     * Creates a new instance of Userinfo with the specified values.
     * @param userid the userid of the Userinfo
     * @param username the username of the Userinfo
     * @param userpass the userpass of the Userinfo
     * @param usertype the usertype of the Userinfo
     */
    public Userinfo(String userid, String username, String userpass, char usertype) {
        this.userid = userid;
        this.username = username;
        this.userpass = userpass;
        this.usertype = usertype;
    }
 
    /**
     * Gets the userid of this Userinfo.
     * @return the userid
     */
    public String getUserid() {
        return this.userid;
    }
 
    /**
     * Sets the userid of this Userinfo to the specified value.
     * @param userid the new userid
     */
    public void setUserid(String userid) {
        this.userid = userid;
    }
 
    /**
     * Gets the username of this Userinfo.
     * @return the username
     */
    public String getUsername() {
        return this.username;
    }
 
    /**
     * Sets the username of this Userinfo to the specified value.
     * @param username the new username
     */
    public void setUsername(String username) {
        this.username = username;
    }
 
    /**
     * Gets the userpass of this Userinfo.
     * @return the userpass
     */
    public String getUserpass() {
        return this.userpass;
    }
 
    /**
     * Sets the userpass of this Userinfo to the specified value.
     * @param userpass the new userpass
     */
    public void setUserpass(String userpass) {
        this.userpass = userpass;
    }
 
    /**
     * Gets the usertype of this Userinfo.
     * @return the usertype
     */
    public char getUsertype() {
        return this.usertype;
    }
 
    /**
     * Sets the usertype of this Userinfo to the specified value.
     * @param usertype the new usertype
     */
    public void setUsertype(char usertype) {
        this.usertype = usertype;
    }
 
    /**
     * Returns a hash code value for the object. This implementation computes
     * a hash code value based on the id fields in this object.
     * @return a hash code value for this object.
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.userid != null ? this.userid.hashCode() : 0);
        return hash;
    }
 
    /**
     * Determines whether another object is equal to this Userinfo. The result is
     * <code>true</code> if and only if the argument is not null and is a Userinfo object
that
     * has the same id field values as this object.
     * @param object the reference object with which to compare
     * @return <code>true</code> if this object is the same as the argument;
     * <code>false</code> otherwise.
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Userinfo)) {
            return false;
        }
        Userinfo other = (Userinfo)object;
        if (this.userid != other.userid &&
(this.userid == null || !this.userid.equals(other.userid)))
 return false;
        return true;
    }
 
    /**
     * Returns a string representation of the object. This implementation constructs
     * that representation based on the id fields.
     * @return a string representation of the object.
     */
    @Override
    public String toString() {
        return "jpa.Userinfo[userid=" + userid + "]";
    }
   
}
然后在Persistence.xml文件的设计界面的下面有 Add Class 按钮,点击该按钮,然后把刚创建好的实体类添加到持久单元中。
9、编写会话Bean访问该实体
在该工程中添加一个会话Bean,添加过程参考会话Bean的编写,Bean的名字是UserManager,提供Remote接口。
在该会话Bean中添加一个业务方法,下面是修改后的文件,红色部分是添加的。
9.1 接口文件
package jpa;
 
import javax.ejb.Remote;
import java.util.List;
 
 
/**
 * This is the business interface for UserManager enterprise bean.
 */
@Remote
public interface UserManagerRemote {
    public List<Userinfo> findAllUser();
}
 
9.2 Bean类
/*
 * UserManagerBean.java
 *
 * Created on 2007年5月21日, 上午6:18
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
 
package jpa;
 
import javax.ejb.Stateless;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import java.util.List;
 
/**
 *
 * @author Administrator
 */
@Stateless
public class UserManagerBean implements jpa.UserManagerRemote {
   
    @PersistenceContext
    EntityManager em;
   
    /** Creates a new instance of UserManagerBean */
    public UserManagerBean() {
    }
    public List<Userinfo> findAllUser(){
        return em.createQuery("select u from Userinfo u").getResultList();
    }
   
}
10、编写Servlet客户端访问会话Bean
需要引入会话Bean的客户端程序,可以在Web应用的Liberaries上点击右键,选择Add Project,如下面的界面,选择前面创建的EJB模块,选择添加即可(这样就不用拷贝会话Bean的接口文件了)。
然后在工程里面添加一个Servlet,名字为FindAllUserServlet,修改后的代码如下(红色部分是添加的):
/*
 * FindAllUserServlet.java
 *
 * Created on 2007年5月21日, 上午6:27
 */
 
package jpa.web;
 
import java.io.*;
import java.net.*;
 
import javax.servlet.*;
import javax.servlet.http.*;
import javax.ejb.EJB;
import jpa.UserManagerRemote;
import jpa.Userinfo;
import java.util.List;
import java.util.Iterator;
 
/**
 *
 * @author Administrator
 * @version
 */
public class FindAllUserServlet extends HttpServlet {
   
    @EJB
    UserManagerRemote user;
   
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
       
        List<Userinfo> list=user.findAllUser();
        Iterator<Userinfo> i = list.iterator();
        while(i.hasNext()){
            Userinfo tmpUser = i.next();
            out.print(tmpUser.getUserid()+"-"+tmpUser.getUsername()+"<br>");
        }
 
        out.close();
    }
   
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
   
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
   
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
}
11、运行测试
        分别部署EJB模块和Web模块,访问Servlet可以得到用户列表。
更多内容可以参考本人的书《Java EE 5实用教程——基于WebLogic和Eclipse》
 
学生成绩管理系统(Servlet+JPA) 第16章 学生成绩管理系统(Servlet+JPA)EJB JPA数据库持久层开发 立即下载

相关推荐

学生管理系统jpa+jsp+servlet

jpa,jsp,servlet jpa,jsp,servlet jpa,jsp,servlet jpa,jsp,servlet

JPA学习(二) 创建JPAUtil 和 简单的增删改查

前章:https://blog.youkuaiyun.com/qq_28198181/article/details/102550503 这一节简单的记录一下 创建一个JPAUti类和增删改查的方法 依赖在上一章; 目录 1.创建JPAUTIL 2.创建增删改查方法 1.创建JPAUTIL 创建JPAUtil是用来通过这个方法得到一个单例的entityManagerFactory publi...

GinChou的萌新博客 1474

用blender为模型贴图并在gazebo中显示

用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型

qq_48427527的博客 8001

jpa二次封装:像使用mybatis-plus一样使用jpa查询

hibernate二次封装,可用像使用mybatis-plus一样使用hibernate进行数据库查询

C3245073527的博客 1140

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本设计通过NE555与三极管的巧妙配合,仅用基础元件实现了呼吸灯效果。核心在于利用RC积分电路将PWM信号转换为控制电压,并通过负反馈动态调节占空比。Proteus仿真验证了方案的可行性,读者可进一步优化参数或扩展功能,探索更多硬件设计可能性。

2201_75797484的博客 2983

debian mirrors 镜像源 riscv 64 赛昉 星光 starfive vf2 InRelease‘ doesn‘t support architecture ‘riscv64‘

debian mirrors 镜像 riscv 64 赛昉 星光2 starfive vf2 InRelease' doesn't support architecture 'riscv64'

qq_29758759的博客 1259

JPA+mysql+servlet实现的连接操作数据库的小例子

persistence.xml: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schem...

lpm528的博客 611

YOLOV8多模态(可见光+红外光目标检测任务,基于Ultralytics官方代码实现)

torch 2.3.1 torchvision 0.18.1 Python 3.8.19 tensorrt 8.5.3.1DroneVehicle数据集下载地址DroneVehicle 数据集由无人机采集的 56,878 张图像组成,其中一半是 RGB 图像,其余是红外图像。我们为这 5 个类别制作了丰富的注释,其中包含定向边界框。其中,汽车在 RGB 图像中有 389,779 个注释,在

Mjy的博客 7585

Java持久性API(The Java Persistence API)-一个简单的实体持久性编程模型

 Java持久性API(The Java Persistence API)-一个简单的实体持久性编程模型 原文连接:http://java.sun.com/developer/technicalArticles/J2EE/jpa/文章索引Java平台企业版(Java EE)第五版本最重要的主题是易于开发。贯穿整个平台的改变使开发企业Java应用程序变得更简单,需要少的多的代码。值得

龙行天下的专栏 1479

黏菌算法(Slime Mould Algorithm,SMA)

这是一篇关于黏菌算法的总结博客,包含算法思想,算法步骤,求函数最值(Python实现),算法改进等,持续更新ing

weixin_46838605的博客 1万+

【QGIS】【OsGeo4w】安装方法

every blog every motto: You will never know unless you try 0. 前言 因为目前要使用QGIS,然而环境配置就整了大半天,哎,进行简单记录,方便自己方便他人。 一共分为两种方式安装: 独立安装包 网络安装包(下载osgeo4w-setup) QGIS提供了不同的版本: 长期发行版(LTR) 最新版(LR) 开发人员版本(DEV,母版或测试版) 说明: 本文推荐第二种 1. 正文 1.1 下载osgeo4w 下载链接 下载完成: 1.2

胡侃有料的博客 2万+

什么是JPA? Java Persistence API简介

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-XtqzCGB1-1713465135075)]

2401_84010836的博客 833

Milvus 向量数据库部署方案全景指南:从单机开发到生产级高可用集群

本文系统介绍了Milvus向量数据库的四大部署方案:嵌入式开发利器Milvus Lite、单机简易部署Standalone模式、生产级高可用Cluster模式以及全托管SaaS服务Zilliz Cloud。针对不同应用场景(开发测试、小型应用、大规模生产环境),详细分析了各模式的适用条件、资源配置要求和部署步骤,并提供了关键配置示例。文章强调正确选择部署方案对系统性能至关重要,帮助开发者根据向量规模、QPS和高可用需求,选择最优部署方式,实现资源优化与稳定运行。

reset2021的博客 385

什么是JPA?Java Persistence API简介

作为规范,Java Persistence API关注持久性,它将Java对象的创建过程和具体的创建形式解耦。并非所有Java对象都需要持久化,但大多数应用程序都会保留关键业务对象。JPA规范允许您定义应该保留哪些对象,以及如何在Java应用程序中保留这些对象。 JPA本身不是一个工具或框架; 相反,它定义了一组可以由任何工具或框架实现的概念。虽然JPA的对象关系映射(ORM)模型最初基于Hibe...

Java_fenxiang的博客 1820

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2171

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

什么是JPA?Java Persistence API简介(1)

";清单2中的代码是相当自我记录的。该对象可以来自任何地方(前端提交,外部服务等),并设置其ID和name字段。然后,对象上的字段用于提供SQLinsert语句的值。该类是JDBC的一部分,提供了一种将值安全地应用于SQL查询的方法。虽然JDBC允许手动配置附带的控件,但与JPA相比,它很麻烦。要修改数据库,首先需要创建一个SQL查询,该查询从Java对象映射到关系数据库中的表。然后,只要对象签名发生更改,就必须修改SQL。使用JDBC,维护SQL本身就成了一项任务。JPA的数据持久性。

Y1567409的博客 1113

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JPA-深度理解

Java应用程序传统上使用JDBC (Java数据库连接)等技术访问关系数据库,来持久存储数据。 由于面向对象技术和关系技术之间的差异,JDBC API要求开发人员手工编写SQL中最基本的CRUD(创建、读取、更新和删除)操作,而这些操作缺乏可移植性。 另外,代码完全依赖于SQL,当从一个数据库转换到另一个数据库时会更加困难。 因为关系技术关注的是数据及其关系,而面向对象不仅强调数据,而且还强调在数据上执行的操作。这导致了面向对象与面向关系不适配。 一个被广泛接受的解决方案是对象关系映射(ORM)。 J

海的那边,还是海吗 6903

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JPA简单实例

1、JPA JPA(Java持久性API)是存储业务实体关联的实体的来源。它显示了如何定义一个面向普通Java对象(POJO)作为一个实体,以及如何与管理关系实体。 2、安装JPA (1)创建一个新的JPA项目,首先选择File->New->JPA Project。 (2)输入项目名称JPATest,选择Target runtime jre7如下。 (3)点击下载库(如果没有库)

Borny鼎鼎的博客 2964

使用EJB3 Java Persistence API标准化Java持久性

持久性对于大多数企业应用程序都非常关键,因为它们需要访问关系数据库(例如Oracle Database 10g)。如果您正在使用Java开发应用程序,您可能需要完成一些常规任务(例如数据库更新和检索),这是通过编写JDBC和SQL来完成的。最近几年,几种对象关系(O-R)映射框架(例如Oracle TopLink、JBoss Hibernate和BEA Kodo)开始流行,因为它们简化了持久性问题

yzhjisji的专栏 651

Java持久性API(JPA)第4讲——删除和修改.doc

 Java持久性API(JPA)——删除和修改目标:使用JPA完成删除和修改功能。主要内容包括:u       根据主键查询u       删除信息u       修改信息因为删除功能和修改功能都是对已有的实体进行操作,通常需要先得到实体,然后对实体进行操作,得到实体需要根据主键进行查询。所以在介绍删除和修改信息之前先介绍如何根据主键查询。1、根据主键查询在第3

李绪成的一亩三分地 1万+

jpa和hibernate_JPA和Hibernate的Java持久性,第1部分:实体和关系

jpa和hibernate Java Persistence API(JPA)是一种Java规范,可在关系数据库和面向对象的编程之间架起桥梁。 这个由两部分组成的教程介绍了JPA,并说明了如何将Java对象建模为JPA实体,如何定义实体关系以及如何在Java应用程序中将JPA的EntityManager和Repository模式一起使用。 请注意,本教程使用Hibernate作为JPA提供程...

cxu0262的博客 254
上一篇: 消息驱动Bean(MDB)的开发
下一篇: Java持久性API(JPA)第2讲——完成信息添加
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值