JPA抽取BaseDao和CRUD
导入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);
}
}