zoukankan      html  css  js  c++  java
  • JPA之hibernate例子+总结

       1,About JPA

         JPA是sun公司定义的一套持久化API,他只是定义了相关的Interface,实现产品多种多样如Hibernate,Ibatis,topLink,openJPA等等,JPA的伟大之处就是结束了多少年以来个大ORM产品各自为营的局面,使得各ORM产品统一,使用JPA,如过你的实现产品是HIbernate,以后换其他的ORM产品就变的很方便,使我们的代码变的非常灵活。

      2.这里做一个简单的事例,实现产品使用Hibernate,所使用的jar包如下所示:

      

     

     3. 在src下新建一个名为M“ETA-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_1_0.xsd" version="1.0">
        
        <persistence-unit name="JPA" transaction-type="RESOURCE_LOCAL">
              <properties>
                  <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
                  <property name="hibernate.hbm2ddl.auto" value="update"/>
                  <property name="hibernate.show_sql" value="true"/>
                <property name = "hibernate.connection.driver_class" value = "com.mysql.jdbc.Driver"/>
                <property name = "hibernate.connection.url" value = "jdbc:mysql://localhost:3306/test"/>
                <property name = "hibernate.connection.username" value = "root"/>
                <property name = "hibernate.connection.password" value = "rootroot"/>
              </properties>
        </persistence-unit>
      
    </persistence>

     4.实体bean

    package com.youcent;
    
    import java.io.Serializable;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    @Entity
    public class User implements Serializable{
        private Integer id;
        private String name;
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + "]";
        }
        
    }

    5.建立test类进行测试

    package com.youcent;
    
    import java.util.List;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import javax.persistence.Query;
    
    import org.junit.Test;
    
    public class TestUser {
        //添加
        @Test
        public void testSave() {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
            EntityManager em = factory.createEntityManager();
            em.getTransaction().begin();
            User u = new User();
            u.setName("jerry");
            em.persist(u);
            em.getTransaction().commit();
            em.close();
            factory.close();
        }
        //删除
        @Test
        public void testRemove() {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
            EntityManager em = factory.createEntityManager();
            em.getTransaction().begin();
            User u = em.find(User.class,2);
            em.remove(u);
            em.getTransaction().commit();
            em.close();
            factory.close();
        }
        //修改
        @Test
        public void update() {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
            EntityManager em = factory.createEntityManager();
            em.getTransaction().begin();
            //第一种方法
            //User u = em.find(User.class,1);
            //u.setName("tom");
            //第二种方法
            User u1 = new User();
            u1.setId(3);
            u1.setName("xyz");
            em.merge(u1);
            em.getTransaction().commit();
            em.close();
            factory.close();
        }
        //hql 取得所有对象
        @Test
        public void findAll() {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
            EntityManager em = factory.createEntityManager();
            Query query = em.createQuery("select u from User u");
            List<User> list = query.getResultList();
            for(User u : list){
                System.out.println(u.toString());
            }
            em.close();
            factory.close();
        }
        //hql 取得单一结果 ,使用位"置参数查询"
        @Test
        public void findById() {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
            EntityManager em = factory.createEntityManager();
            Query query = em.createQuery("select u from User u where u.id=?1"); //表示明确指定从1开始设置参数
            query.setParameter(1, 4);
            User u  = (User) query.getSingleResult();    //取得单一结果
            System.out.println(u.toString());
            em.close();
            factory.close();
        }
        //hql 取得单一结果 ,同样任何查询可以使用"命名参数"查询
            @Test
            public void findByHql() {
                EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
                EntityManager em = factory.createEntityManager();
                Query query = em.createQuery("select u from User u where u.id=:id"); //表示明确指定从1开始设置参数
                query.setParameter("id", 4);
                User u  = (User) query.getSingleResult();    //取得单一结果
                System.out.println(u.toString());
                em.close();
                factory.close();
            }
        //hql分页查询
            @Test
            public void findByPage() {
                EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
                EntityManager em = factory.createEntityManager();
                Query query = em.createQuery("select u from User u");
                query.setFirstResult(1);  //表示从第二条记录开始
                query.setMaxResults(2);   //向后去两条
                List<User> list = query.getResultList();
                for(User u : list){
                    System.out.println(u.toString());
                }
                em.close();
                factory.close();
            }
            //hql更新查询,须开事务
            @Test
            public void updateByhql() {
                EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
                EntityManager em = factory.createEntityManager();
                em.getTransaction().begin();
                Query query = em.createQuery("update User u set u.name=:name where u.id=:id");
                query.setParameter("name", "tom1");
                query.setParameter("id", 1);
                int rows = query.executeUpdate(); //更新查询要执行的方法
                if(rows>0){
                    System.out.println("更新成功!");
                }
                em.getTransaction().commit();
                em.close();
                factory.close();
            }
            //hql删除查询,须开事务
            @Test
            public void removeByhql() {
                EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
                EntityManager em = factory.createEntityManager();
                em.getTransaction().begin();
                Query query = em.createQuery("delete from User u where u.id=:id");
                query.setParameter("id", 4);
                int rows = query.executeUpdate(); //更新查询要执行的方法
                if(rows>0){
                    System.out.println("删除成功!");
                }
                em.getTransaction().commit();
                em.close();
                factory.close();
            }        
    }

    6.总结一下常用注解

    1、日期:
      @Temporal(TeporalType.DATE)  -----> Date

    2、枚举:
      @Enumerated(EnumType.STAING) ---> Enum

    3、大文本,二进制数据:
      @Lob ------> String,Byte[]
        
    4、不和数据库映射
      @Transient

    5、延迟加载
      @Basc(fetch=FetchType.LAZY),只有当使用属性的get方法

    是才从数据中获取!

  • 相关阅读:
    Linux -- 查看是否安装了指定的包
    linux -- 部署java服务器(1) linux安装jdk
    spring boot -- 接收文件接口
    vue3 --相对于vue2的改变T1档次
    243交换输出
    24416进制的简单运算
    7街区最短路径问题
    206矩形的个数
    33蛇形填数
    273字母小游戏
  • 原文地址:https://www.cnblogs.com/zhougaojun/p/3322147.html
Copyright © 2011-2022 走看看