搭建第一个JPA工程及基本增删改查操作

搭建第一个JPA工程

  1. 创建Java工程
  2. 导入jar包或者maven坐标
    <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>
    
  3. 创建核心配置文件

    在resources下面创建METE-INF文件夹,创建persistence.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence 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_2_0.xsd"
                 version="2.0">
        <!--配置持久化单元
            name:持久化单元名称
            transaction-type:事务类型
             RESOURCE_LOCAL:本地事务管理
             JTA:分布式事务管理 -->
        <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://localhost:3306/jpa?useUnicode=true&amp;characterEncoding=UTF-8" />
                <!-- 数据库用户名 -->
                <property name="javax.persistence.jdbc.user" value="root" />
                <!-- 数据库密码 -->
                <property name="javax.persistence.jdbc.password" value="123456" />
    
                <!--jpa提供者的可选配置:我们的JPA规范的提供者为hibernate,所以jpa的核心配置中兼容hibernate的配 -->
                <!--配置jpa实现方(hibernate)的配置信息
                    显示sql  :      false|true
                    自动创建数据库表:  hibernate.hbm2ddl.auto
                        create:程序运行时创建数据库表(如有表,先删除表再创建)
                        update:程序运行时创建表(如果有表,不会创建表)
                        none:不会创建表
                -->
                <property name="hibernate.show_sql" value="true" />
                <property name="hibernate.format_sql" value="true" />
                <property name="hibernate.hbm2ddl.auto" value="create" />
            </properties>
        </persistence-unit>
    </persistence>
    
    
  4. 创建实体类与数据表
    /*
    @Entity  实体类映射
    		@Table  映射的表格
    			name  表格名称
    		@Id     主键
    		@GeneratedValue  主键生成策略
    		
    				IDENTITY  主键自动递增(适用于底层支持自动递增的数据库)
    				SEQUENCE  序列(适用于Oracle)
    				AUTO      自动创建第三张表维护主键的下一个值
    				TABLE     创建第三张表维护主键的下一个值
    */
    
    @Entity
    @Table(name = "t_user")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
    
        private String username;
        private String password;
    
  5. 测试
    @Test
        public void jpaTest(){
            //创建实体管理器工厂
            EntityManagerFactory factory= Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理器
            EntityManager entityManager = factory.createEntityManager();
            User user=new User("张三","123456");
            //开启事务
            EntityTransaction transaction = entityManager.getTransaction();
            transaction.begin();
            //执行添加(持久化)操作
            entityManager.persist(user);
            //提交事务
            transaction.commit();
        }
    

基本增删改查操作

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrKwFphx-1628341715797)(file:///C:/Users/LJW/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png)]

对象状态:

​ 临时状态对象:new关键字创建的对象(不被数据库管理,不被实体类管理)

​ 持久化对象:数据库中存在,被entityManager管理

增加:persist(临时状态对象)

删除:remove(持久化对象)

修改:
merge(带有id的临时状态对象)
如果id在数据库中存在,则执行修改操作,但是在修改的时候需要提供所有的字段值
如果id在数据库中不存在,则执行添加操作

	merge(持久化状态对象)
		正常执行修改操作
		
	先调用find方法查询到持久化对象,在对象的基础之上直接修改属性,事务提交会默认执行修改语句

查询:find(反射类型,主键)通过find查询到的对象都是持久化对象

		不管是否使用到对象,都会发送sql语句,及时加载
		
		问题一:在使用对象的时候,关闭entityManager,不影响对象使用
		问题二:当查询的id在数据库中不存在的时候,返回null,后期需要注意空指针问题
		
	getReference(反射类型,主键)
		什么时候使用对象,什么时候发送sql语句,懒加载
		问题一:如果在使用对象的时候,关闭entityManager,会报错:
			org.hibernate.LazyInitializationException: could not initialize proxy - no Session

		问题二:当查询的id在数据库中不存在的时候,会报错:
			javax.persistence.EntityNotFoundException

JPA中的复杂查询

JPQL全称Java Persistence Query Language

Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。

其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

查询全部
//查询所有
    @Test
    public void getAllUser(){
    
    
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
        EntityManager entityManager= factory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        
        
        Query query = entityManager.createQuery("from User");
        List list = query.getResultList();
        
        
        System.out.println(list);
        transaction.commit();
        entityManager.close();
    }
分页查询
 //分页查询
    @Test
    public void findPage(){
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
        EntityManager entityManager= factory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        Query query = entityManager.createQuery("from User");
        //起始索引
        query.setFirstResult(0);
        //每页显示条数
        query.setMaxResults(2);
        
        List list = query.getResultList();
        System.out.println(list);
        transaction.commit();
        entityManager.close();
    }
条件查询
    //条件查询
    @Test
    public void test01(){
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
        EntityManager entityManager = factory.createEntityManager();
        
        Query query = entityManager.createQuery("from User where username=?");
        query.setParameter(1,"admin");
       
        List list = query.getResultList();
        //单一对象接收
        //User user = (User) query.getSingleResult();
        System.out.println(list);
    }
统计查询
    //统计查询
    @Test
    public void test02(){
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
        EntityManager entityManager = factory.createEntityManager();
        Query query = entityManager.createQuery("select count(id) from User");
        List list = query.getResultList();
        System.out.println(list);
    }

おすすめ

転載: blog.csdn.net/qq_45299673/article/details/119492803