一、在Maven项目使用JPA
(项目结构)
1、新建一个Maven项目
(可以参考如何在idea创建Maven项目)
https://blog.csdn.net/weixin_45764765/article/details/106874510
2、在pom.xml中导入依赖
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.8.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.8.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
</dependency>
</dependencies>
(让它先下载一下jar包)
3、在src/main/resources下创建META-INF文件夹,再在这个文件夹新建一个persistence.xml文件。
(这个persistence.xml文件,将用来进行JPA的相关配置,数据库连接url、账户密码,打印SQL日志等)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--
JPA根据下面的配置信息创建EntityManagerFactory,一个项目中可以配置多个持久单元
name:为当前持久单元命名,可以通过该名称指定加载对应的配置信息
-->
<persistence-unit name="myPersistence">
<!--指定扫描贴Entity实体类所在的jar包-->
<properties>
<!--数据库的方言,告诉JPA当前应用使用的数据库-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<!--jpa的相关的配置信息-->
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="admin"/>
<!--是否在控制台打印执行的sql语句-->
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
4、做持久化,我们还需要设计一个连接数据库的JPA工具类
思路:(1)原理:JPA通过加载persistence.xml文件中配置的persistence-unit创建EntityManagerFactory对象
(2)EntityManagerFactory(用来创建EntityManage对象),相当于一个连接池对象,创建一个EntityManagerFactory对象,是非常消耗资源的,所以我们在项目中只需要创建一个EntityManagerFactory对象即可(它是线程安全的,可多线程公用)。
(3)EntityManager,相当于一个连接对象,线程不安全,所以每次对数据库的访问应该创建一个新的EntityManager对象。
(4)static修饰的代码块,只在类加载到虚拟机的时候,创建一次。
(所以,我们设计这样一个JPA的工具类,使用工厂设计模式)
package util;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public abstract class JpaUtil {
//用来创建EntityManager对象的工厂类
//在整个应用中只创建一个该对象即可
private static EntityManagerFactory emf;
//static静态代码块,在把该类加载到虚拟机时,只会创建一次
static {
// 加载persistence.xml文件中的myPersistence persistence-unit创建工厂对象
emf = Persistence.createEntityManagerFactory("myPersistence"); //通过myPersistence 找到对应的unit单元
}
//创建一个EntityManager对象,相当于一个连接对象
public static EntityManager getEntityManager(){
return emf.createEntityManager();
}
}
5、新建数据库和表,并在persistence.xml配置url,连接驱动,账号,密码
6、新建实体类
package domain;
import lombok.*;
import javax.persistence.*;
import java.util.Date;
/**
* 创建一个类和表,一对一映射
* 将用户信息从数据库中查询出来,封装到User对象中
* id,name,age,hiredate ---> User对象中的id,name,age,hiredate属性中
*/
@Getter // lombok插件提供的getter,setter方法,也可以手动编写
@Setter
@Entity // 告诉框架,当前User类是需要持久化的类
@Table //对类和表做映射,如果类名和表名不一样,需要使用该注解做映射
public class User {
@Id // 主键类型的属性
@Column(name = "id") // 对属性和列做映射,如属性和列对应的类型/长度不一样,使用该注解; 如果一样,不用加任何注解
@GeneratedValue(strategy = GenerationType.AUTO) // 指定主键的生成策略,AVTO,表示使用数据库中默认的方式生成主键
// MySQL:主键自增长的方式生成主键
private Long id;
private Integer age;
private String name;
@Temporal(TemporalType.DATE) // 对日期类型的属性做映射
private Date hiredate;
}
**字段,一般用包装类,这样可以通过null判断是否有值
7、增删改查操作(使用事务)
package crud;
import domain.User;
import org.junit.jupiter.api.Test;
import util.JpaUtil;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import java.util.Date;
import java.util.List;
/**
* 使用jpa进行增删改查
*/
public class CRUD {
/**
* 将要保存的数据封装到User对象
*/
@Test
public void save() throws Exception{
User user = new User();
user.setName("张大仙");
user.setAge(18);
user.setHiredate(new Date());
// 调用EntityManager中的方法完成数据持久化
EntityManager em = JpaUtil.getEntityManager();
//开启事务
em.getTransaction().begin();
//执行保存
em.persist(user);
//提交事务
em.getTransaction().commit();
// 释放资源(把em对象还给连接池)
em.close();
}
/**
* 删除
*/
@Test
public void delete() throws Exception{
EntityManager em = JpaUtil.getEntityManager();
em.getTransaction().begin();
User user = em.getReference(User.class, 1L);
em.remove(user);
em.getTransaction().commit();
em.close();
}
/**
* 更改
*/
@Test
public void update() throws Exception{
EntityManager em = JpaUtil.getEntityManager();
em.getTransaction().begin();
User user = em.find(User.class, 1L);
user.setName("冰心");
em.merge(user);
em.getTransaction().commit();
em.close();
}
/**
* 查询单条数据
*/
@Test
public void get() throws Exception{
EntityManager em = JpaUtil.getEntityManager();
/* 根据主键查询数据
* 参数1: 指定将查询到的结果封装成什么类型的对象
* 参数2:指定查询的主键列的数据
*/
User user = em.find(User.class, 2L);
em.close();
System.out.println(user);
}
/**
* 查询多条数据
*/
@Test
public void list(){
EntityManager em = JpaUtil.getEntityManager();
/*
*参数1:指定执行的JPQL(类似SQL)
*参数2:指定将查询结果封装成什么类型的对象
*/
TypedQuery<User> query = em.createQuery("SELECT u FROM User u", User.class);
// 执行查询,将结果存放到List集合中
List<User> list = query.getResultList();
em.close();
System.out.println(list);
}
}
补充:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117839.html