JPA入门_从快速学会增删改查开始

导读:本篇文章讲解 JPA入门_从快速学会增删改查开始,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、在Maven项目使用JPA

(项目结构)

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,连接驱动,账号,密码

JPA入门_从快速学会增删改查开始

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);
    }

}

 (hibernate的底层会拼接SQL)JPA入门_从快速学会增删改查开始

JPA入门_从快速学会增删改查开始


补充:

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117839.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!