JPA抽取BaseDao和CRUD

1 篇文章 0 订阅

导入jar包

<dependencies>
            <!--hibernate的核心包-->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>4.3.8.Final</version>
            </dependency>
            <!--hibernate对于jpa的支持包-->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>4.3.8.Final</version>
            </dependency>
            <!--只要操作数据库,不管使用什么框架,底层都是JDBC,所以都需要引入JDBC的驱动包-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
            <!--准备相应的测试包-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
    
        <build>
            <finalName>jpa</finalName>
            <plugins>
                <plugin>
                    <!-- Maven的编译插件-->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>

配置persistence.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    
        <!--
            persistence(持久化)-unit(单元):每个持久化单元代表它与某一个数据库的连接
                transaction-type:事务类型
                    RESOURCE_LOCAL:本地事务类型
                    JTA:功能非常强大(但是不支持)
        -->
        <persistence-unit name="cn.xxx.jpa" transaction-type="RESOURCE_LOCAL">
            <!--properties:这里面可以配置很多属性-->
            <properties>
                <!-- 配置属性(有哪些属性,值又是什么?) -->
                <!--所有配置都可以在 hibernate-release-4.3.8.Final\project\etc\hibernate.properties 中找到-->
    
                <!--1.配置连接数据库的四大金刚-->
                <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                <property name="hibernate.connection.url" value="jdbc:mysql:///jpa" />
                <property name="hibernate.connection.username" value="root" />
                <property name="hibernate.connection.password" value="123456" />
                <!--2.方言(连接的是什么样的数据库)
                        InnoDB:支持事务,支持外键   MyISAM:不支持事务,不支持外键,速度快
                -->
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
                <!--
                    3.建表策略:根据domain自动创建表
                        create-drop : 删除 - 创建 - 删除(EntityManagerFactory关闭)- 测试人员有用
                        create :删除 - 创建 -  测试人员有用
                        update :数据库没有这个表,会创建 如果表存在就不管
                                 添加相应的字段(只增不减)
                        validate :验证(不会对数据库产生任何影响,只会告诉你的映射是否正确,只检查写的东西)
                        none:什么都不做
                 -->
                <property name="hibernate.hbm2ddl.auto" value="create" />
                <!--4.是否显示SQL-->
                <property name="hibernate.show_sql" value="true" />
                <!--5.格式化SQL-->
                <property name="hibernate.format_sql" value="true" />
            </properties>
        </persistence-unit>    
    </persistence>

创建Product domain层

package cn.xxx.domain;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "t_product")
    public class Product {
        @Id
        @GeneratedValue
        private Long id;
        private String name;
        private Long dir_id;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Long getDir_id() {
            return dir_id;
        }
    
        public void setDir_id(Long dir_id) {
            this.dir_id = dir_id;
        }
    }

创建ProductDir domain层

   package cn.xxx.domain;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "t_productdir")
    public class ProductDir {
    
        @Id
        @GeneratedValue
        private Long id;
        private String name;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

抽取JPAUtils

package cn.xxx.util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * JPA工具类,帮助我们获取EntityManager对象
 */
public class JPAUtils {

    //在一个项目中,它只需要创建一次
    private static EntityManagerFactory factory;

    //只会执行一次
    static {
        //ctrl+alt+t
        try {
            //在这里创建EntityManagerFactory对象
            factory = Persistence.createEntityManagerFactory("cn.xxx.jpa");
        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException("配置或者注解文件出现问题!");
        }
    }
	//获得EntityManager对象
    public static EntityManager createEntityManager(){
        return factory.createEntityManager();
    }
}

创建IBaseDao接口CRUD

package cn.xxx.dao;

import java.io.Serializable;
import java.util.List;

public interface IBaseDao<T> {
    void save(T t);
    void update(T t);
    //Serializable:序列化接口
    void delete(Serializable id);
    T findOne(Serializable id);
    List<T> findAll();
}

BaseDao实现类

package cn.xxx.dao.impl;

import cn.itsource.dao.IBaseDao;
import cn.itsource.util.JPAUtils;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.io.Serializable;
import java.util.List;

public class BaseDaoImpl<T> implements IBaseDao<T> {
    //子类的一个对应类型(这个值从子类获取)
    private Class entityClass;
    //必须传一个类型过来
    public BaseDaoImpl(Class entityClass){
        this.entityClass = entityClass;
    }
    /**
     * 只是增删改,都需搞定事务
     * 所有框架的事务都需要手动提交
     */
    //添加
    @Override
    public void save(T t) {
        EntityManager entityManager = null;
        try {
        	//获取EntityManager对象(完成CRUD的对象)
            entityManager = JPAUtils.createEntityManager();
            //开启事务
            entityManager.getTransaction().begin();
            //保存数据
            entityManager.persist(t);
            //提交事务
            entityManager.getTransaction().commit();
        } catch (Exception e) {
        	//发生异常事务回滚
            entityManager.getTransaction().rollback();
            e.printStackTrace();
        } finally {
        	//关闭entityManager
            entityManager.close();
        }
    }
	//更新
    @Override
    public void update(T t) {
        EntityManager entityManager = null;
        try {
            entityManager = JPAUtils.createEntityManager();
            entityManager.getTransaction().begin();
          	 //修改数据 merge:合并
            entityManager.merge(t);
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
            e.printStackTrace();
        } finally {
            entityManager.close();
        }
    }
	//删除一条数据
    @Override
    public void delete(Serializable id) {
        EntityManager entityManager = null;
        try {
            entityManager = JPAUtils.createEntityManager();
            entityManager.getTransaction().begin();
            //删除的数据需要先查出来
            T t = (T)entityManager.find(entityClass, id);
            if (t!=null){
             	//需要传的是一个对象(删除的是具体的对象)
                entityManager.remove(t);
            }
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
            e.printStackTrace();
        } finally {
            entityManager.close();
        }
    }
	//查询一条数据
    @Override
    public T findOne(Serializable id) {
        EntityManager entityManager = null;
        try {
        	// //参数一:对象类型(找到表)  参数二:主键(表中某一行数据)
            return (T)entityManager.find(entityClass, id);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            entityManager.close();
        }
        return null;
    }
	 /**
     * SQL - 数据库的查询语言
     * JPQL JPA+QL - JPA的查询语言 ->更加简单,面向对象
     */
    @Override
    public List<T> findAll() {
        EntityManager entityManager = null;
        try {
            entityManager = JPAUtils.createEntityManager();
            //准备一条JPQL
       		//String jpql = "select o from	获取子类对应的一个类型 o";
       		//可以简写 jpql = "select  from	类型"
            Query query = entityManager.createQuery("from" + entityClass.getName());
            return query.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
        return null;
    }
}

创建IProductDao,IProductDirDao继承IbaseDao指定泛型

package cn.xxx.dao;

import cn.xxx.domain.Product;

public interface IProductDao extends IBaseDao<Product> {
}
package cn.xxx.dao;

import cn.xxx.domain.ProductDir;

public interface IProductDirDao extends IBaseDao<ProductDir> {
}

ProductDaoImpl

ProductDaoImpl 继承 BaseDaoImpl 实现 IProductDao

package cn.xxx.dao.impl;

import cn.xxx.dao.IProductDao;
import cn.xxx.domain.Product;
public class ProductDaoImpl extends BaseDaoImpl<Product> implements IProductDao {

    public ProductDaoImpl() {
        super(Product.class);
    }

}

ProductDirDaoImpl

ProductDirDaoImpl继承 BaseDaoImpl 实现 IProductDao

package cn.xxx.dao.impl;

import cn.xxx.dao.IProductDirDao;
import cn.xxx.domain.ProductDir;

public class ProductDirDaoImpl extends BaseDaoImpl<ProductDir> implements IProductDirDao {
    public ProductDirDaoImpl() {
        super(ProductDir.class);
    }
}

测试类测试CRUD

package cn.xxx.test;

import cn.xxx.dao.IProductDao;
import cn.xxx.dao.IProductDirDao;
import cn.xxx.dao.impl.ProductDaoImpl;
import cn.xxx.dao.impl.ProductDirDaoImpl;
import cn.xxx.domain.Product;
import cn.xxx.domain.ProductDir;
import org.junit.Test;

public class JpaTest {
   private IProductDao productDao =  new ProductDaoImpl();
   private IProductDirDao productDirDao = new ProductDirDaoImpl();

    @Test
    public void testSave()throws Exception{
        Product product = new Product();
        product.setName("老大");
        product.setDir_id(1L);
        productDao.save(product);
    }
    @Test
    public void testSave2()throws Exception{
        ProductDir productDir = new ProductDir();
        productDir.setName("dir表");
        productDirDao.save(productDir);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值