Jpa环境配置及入门(增删改查)

article/2025/9/30 5:48:41

案例:客户的相关操作(增删改查)

1.分析:

1.搭建环境:

  • 创建maven工程,导入相关坐标;

  • 配置使用jpa的核心配置文件;

    位置;需要配置到类路径下叫做 META-INF的文件夹下
    命名:persistence.xml

  • 编写客户实体类;

  • 配置实体类和表,类中属性和表中字段形成映射关系。

2.完成基本CRUD

2.入门代码:

1.导入坐标

   <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.hibernate.version>5.0.7.Final</project.hibernate.version></properties><dependencies><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- hibernate对jpa的支持包 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${project.hibernate.version}</version></dependency><!-- c3p0 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-c3p0</artifactId><version>${project.hibernate.version}</version></dependency><!-- log日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- Mysql and MariaDB --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency></dependencies>

2.配置persistence.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><!--配置persistence-unit节点--><!--名称;事务管理方式(两种:分布式和本地)--><persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL"><!--配置JPA实现方式(服务提供商)--><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><!--配置数据库--><properties><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="javax.persistence.jdbc.url" value="jdbc:mysql:///ssm"/><property name="javax.persistence.jdbc.user" value="root"/><property name="javax.persistence.jdbc.password" value="root"/><!--配置实现方配置信息--><!--显示sql--><property name="hibernate.show_sql" value="true"/><property name="hibernate.format_sql" value="true"/><!--自动生成表--><!--create:程序运行时创建书籍库表,如果存在会先删除在创建update:运行时创建表,如果存在,不会删除none:不会创建表--><property name="hibernate.hbm2ddl.auto" value="update"/></properties></persistence-unit>
</persistence>

3.使用注解配置对应关系

package com;import javax.persistence.*;/*
配置用户实体类:配置映射关系:1.实体类和表的映射关系(Entity和Table)2.实体类属性和表中字段的映射关系/*注意:主键生成使用哪种策略,底层诗句库必须支持Generation.IDENTITY :mysqlGeneration.SEQUENCE:oracle// 了解Generation.Table:JPA提供,通过生成一张表的形式完成主键自增Generation.AUTO:程序自己看着生成(也是多了一张表)*/@Entity    //声明实体类
@Table(name = "account")    //配置实体类和表的映射关系    //name即是表的名称public class Account {@Id  //声明主键配置
@GeneratedValue(strategy = GenerationType.IDENTITY)  //配置主键生成策略(自增)
@Column(name="id")  //配置属性和字段的映射关系private int id;  //id独一无二,其他普通的只需要直接配置映射关系即可@Column(name="name")private String name;@Column(name="money")private double money;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", name='" + name + '\'' +", money=" + money +'}';}
}

4.测试

    /*jpa操作步骤:1.加载配置文件,根据名称创建工厂;2.通过实体类工厂,获取实体管理器3.获取事务对象,开启事务4.完成增删改5.提交事务或者回滚6.释放资源*/
 @Testpublic void save(){// 1.加载配置文件,根据名称创建工厂;//   EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJPA");// 2.通过实体类工厂,获取实体管理器// EntityManager manager = factory.createEntityManager();EntityManager manger = JpaUtils.getEntityManger();EntityTransaction tx = manger.getTransaction();// 3.获取事务对象,开启事务tx.begin();//4.增删改 保存Account account = manger.find(Account.class, 1);account.setName("honey");manger.merge(account);  //更新// System.out.println(account);//提交事务tx.commit();//关闭资源manger.close();// factory.close();}

代码问题分析:
生成实体类工厂时,内部会卫华很多东西,所以会造成资源浪费。
在这里插入图片描述
那么,我们改如何解决??

解决:抽取工具类,以静态代码块的形式创建工厂,产生EntityManager公共对象。
注意,此时,因为总共只有一个工厂,所以不能再关闭工厂资源。

public class JpaUtils {private static EntityManagerFactory factory;static{factory = Persistence.createEntityManagerFactory("myJPA");}public static EntityManager getEntityManger(){return factory.createEntityManager();}}

在这里插入图片描述

3.增删改查语句:

1.保存:
在这里插入图片描述
2.根据id查询:


find:立即加载(得到的是对象本身)
getReferance:延迟加载(特点:得到的是一个**代理**对象;**什么时候使用什么时候加载(可以通过生成sql语句的时间来验证)**)延迟加载使用较多(不会造成资源浪费)

这里需要传入它的字节码文件
在这里插入图片描述
在这里插入图片描述
3.删除:
这里使用remove方法。我们可以看到这里面需要传递一个Object对象。所以删除我们需要两步(先根据id查询,返回一个对象,再remove)来完成。

在这里插入图片描述
4.更新:
需要三条语句:(先查询,再修改,再使用merge执行更新操作)
在这里插入图片描述


总结:
在这里插入图片描述

4.jpql查询:

即jpa提供的一种查询方法。
特点:它是面向对象的,即可进行更高级的查询。比如可以用来查询实体类和类中的属性。查询语句和sql相似。


1.查询所有:
注意:jpql不支持 *

  //查询全部String jpql="from com.Account";    //需要创建query对象,query才是执行jpql的对象Query query=manger.createQuery(jpql);//发送查询,并封装结果List list=query.getResultList();//遍历获取结果for(Object obj:list){System.out.println(obj);}

简写也是支持的

   String jpql="from Account";

2.倒序

//倒序 降序String jpql="from Account order by id desc ";

3.统计查询

        //聚合函数 统计结果String jpql="select count(id) from Account  ";//需要创建query对象,query才是执行jpql的对象Query query=manger.createQuery(jpql);Object result = query.getSingleResult();System.out.println(result);

4.分页查询:

//分页查询String jpql=" from Account ";//需要创建query对象,query才是执行jpql的对象Query query=manger.createQuery(jpql);query.setFirstResult(0);  //代表从0开始查询,不包含0,query.setMaxResults(2);   //每次显示两条

5.条件查询:

//分页查询String jpql=" from Account where name like ? ";//需要创建query对象,query才是执行jpql的对象Query query=manger.createQuery(jpql);query.setParameter(1,"honey");

http://chatgpt.dhexx.cn/article/dZJV52Tr.shtml

相关文章

PHP多国语言开发:CodeIgniter 2PHP框架中的多国语言,语言包(i18n)库

PHP多国语言开发&#xff1a;CodeIgniter 2PHP框架中的多国语言&#xff0c;语言包&#xff08;i18n&#xff09;多国语言库 引言 我们在CodeIgniter开发中经常会碰到多国语言网站&#xff0c;这里我们就来介绍一种简单有效的多国语言的操作方法。 做什么 语言在地址中是这…

Win 10 添加多国语言

不同用户对电脑系统的语言需求也不一样&#xff0c;出于工作原因需要使用其它语言&#xff0c;比如外国友人需要使用英语&#xff0c;俄罗斯语言等&#xff0c;此时很多用户都以为要下载对应语言版本的系统&#xff0c;然后重新安装系统&#xff0c;其实Win10是支持多国语言的&…

手工编译Flex SDK 多国语言包

项目需要将目前版本提供给其它地区&#xff1a;台湾、日韩等&#xff0c;面临着项目语言的国际化问题。 语言代号&#xff1a; 大陆&#xff1a;zh_CN 台湾&#xff1a;zh_TW 香港&#xff1a;zh_HK … 例如想支持繁体&#xff0c;没有zh_TW语言包怎么办&#xff1f; fl…

DevExpress去除多国语言包

DevExpress作为windows开发中较为强大的第三方组件&#xff0c;能极大的提高编程效率和界面效果。但也要引用它较多的dll文件&#xff0c;它专门有个查看dll程序集依赖的工具&#xff0c;在VS的工具菜单下&#xff1a; 在VS的工具菜单内有"DevExpress Assembly Deploymen…

关于VS编译DevExpress默认产生几个多余的多国语言包的问题解决

关于VS编译DevExpress默认产生几个多余的多国语言包的问题解决 VS15开始对于非系统的Dll都会默认复制到本地&#xff0c;即bin\debug下面&#xff0c;复制dll到本地好处在于发布的时候不用再去寻找相关dll,对于dev这么庞大的组件来说&#xff0c;更是如此&#xff0c;当然&…

php源码添加多国语言包,为win7系统添加多国语言包的方法

现在使用win7系统的人越来越多了&#xff0c;对于一些需求也是有所增长&#xff0c;很多用户希望能够将自己的操作系统安装成英文&#xff0c;法文&#xff0c;德文等语言&#xff0c;尤其是对经常出去外国出处的用户很有好吃&#xff0c;比如要和外国客户沟通交流时能看的懂自…

laravel框架安装多国语言包

laravel的一些提示信息都是默认英文&#xff0c;想更改为中文需要下载语言包&#xff0c;执行以下命令 composer require caouecs/laravel-lang:~3.0 执行完后将vendor中的caouecs中的src中的zh-CN文件夹放到views的lang文件夹中 然后还要更改配置项&#xff0c;将config里面…

window10c语言下载,[下载备用]Windows 10多国语言包和独立语言包下载

微软在上周发布Windows 10 周年更新版本之前&#xff0c;已经更新了微软支持库中的Windows 10多国语言包。 此次更新的Windows 10 多国语言包已经可以支持到Windows 10 Version 1607版本&#xff0c;也就是Windows 10 周年更新版本。 不过完整的多国语言包含有超过100种语言的独…

Android多国语言包

生成中文名称的APP如下&#xff1a; step1. step2. step3. step4. step5. 以上步骤仅仅是添加values-zh-rCN文件夹&#xff0c;在AS的res中是看不到的&#xff0c;即使同步后。 这是因为里面没有内容&#xff0c;只需要把默认的string.xml copy到刚才的文件夹中&#xff0c;将…

android语言包,安卓系统添加多国语言包

虽然Android 从 2.3 开始已经支持50种以上的语言,但是不是每种语言都有字体可以显示。遇到一个新需求, 有客户要求对 hindi  语言的支持。于是上 网找了一些资料,发现网上介绍的大部分是如何替换默认字体,就 是替换./works//data/fonts /DroidSansFallback.ttf,但是替换完…

invoke和begininvoke的使用

首先说下&#xff0c;invoke和begininvoke的使用有两种情况&#xff1a; 1. control中的invoke、begininvoke。 2. delegrate中的invoke、begininvoke。 这两种情况是不同的&#xff0c;我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begininvoke的官方定义。 con…

异步编程模式BeginInvoke和EndInvoke方法

转载自&#xff1a;异步编程模式BeginInvoke与EndInvoke方法 为什么要进行异步回调&#xff1f;众所周知&#xff0c;普通方法运行&#xff0c;是单线程的&#xff0c;如果中途有大型操作&#xff08;如&#xff1a;读取大文件&#xff0c;大批量操作数据库&#xff0c;网络传…

C# 异步委托 BeginInvoke EndInvoke

1. 简单主线程中委托: static void Main(string[] args) {//定义一个委托&#xff0c;并初始化Func<int, int, string> delFunc (a, b) > (a b).ToString();//黄色底纹部分换成{ return (a b).ToString(); }更好理解//同步方法调用&#xff08;跟调用一个方法一样…

Invoke and BeginInvoke

本文转自&#xff1a;http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate&#xff0c;至于委托的本质请参考我的另一随笔&#xff1a;对.net事件的看法。 一、为什么Control类提供了Invoke和…

C# Thread Delegate MethodInvoker Invoke BeginInvoke 关系

异步调用是CLR为开发者提供的一种重要的编程手段&#xff0c;它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来越普及的今天&#xff0c;异步编程允许使用非常少的线程执行很多操作。我们通常使用异步完成许多计算型、IO型的复杂、耗时操作&#xff0c;去取得我们的应用…

C#中Delegate/Control的Invoke/BeginInvoke/EndInvoke

目录 一、前言 二、背景 三、Delegate的Invoke/BeginInvoke/EndInvoke 1、基于[需求1] 1.1、直接在主线程中运行“耗时操作” 1.2、通过Thread将“耗时操作”放在子线程中运行 1.3、通过Delegate.BeginInvoke()将“耗时操作”放在子线程中运行 1.4、总结 2、基于[需求…

Invoke和BeginInvoke理解

在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate&#xff0c;至于委托的本质请参考我的另一随笔&#xff1a;对.net事件的看法。 一、为什么Control类提供了Invoke和BeginInvoke机制&#xff1f; 关于这个问题的最主要的原因已经是dotnet程序员众所周知的&…

C#的Invoke与BeginInvoke区别

【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别&#xff08;SamWang&#xff09; 今天无意中看到有关Invoke和BeginInvoke的一些资料&#xff0c;不太清楚它们之间的区别。所以花了点时间研究了下。 据msdn中介绍&#xff0c;它们最大的区别就是Be…

c# Invoke和BeginInvoke 区别详解

Control.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托。 Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。 以下为实际应用中碰到的问题&#xff0c;在主线程中启动一个线程&#xff0c;然后在这个线程…

C# beginInvoke

摘要 异步这东西&#xff0c;真正用起来的时候&#xff0c;发现事情还是挺多的&#xff0c;最近在项目中用到了异步的知识&#xff0c;发现对它还是不了解&#xff0c;处理起来&#xff0c;走了不少弯路。觉得还是补一补还是很有必要的。 MSDN原文地址&#xff1a;https://ms…