1.创建一个maven项目, 本地仓库先配置好,给项目添加一个jpa的模板
project structure ---- modules ---- + , 选择jpa即可
这里没有这个选项是因为已经添加了
2.配置 persistence.xml
移动文件夹
完成上面的创建modules后,会出现一个META-INF的文件夹,里面就是persistence.xml,
但第一步需要将这个 文件夹放在项目的resources文件夹里面
配置 persistence.xml
值得注意的是在 “持久化” 的注释下面的 第一行里面的name=product是这个 文件的 命名空间,这个名字后面需要用到
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--持久化单元的命名空间-->
<persistence-unit name="product" transaction-type="RESOURCE_LOCAL">
<properties>
<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" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!--是否每次创建连接时覆盖原来的表,第一次不存在所以需要覆盖就是新建,后面就不需要了,注释了-->
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
<!--显示出来-->
<property name="hibernate.show_sql" value="true"/>
<!--格式化-->
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
3.配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.dmc</groupId>
<artifactId>JPA-shopping</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.8.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
</project>
4.写工具类
创建连接时 需要找到命名空间
package cn.dmc.util;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class ProJPAUtil {
public static EntityManagerFactory factory;
static {
factory = Persistence.createEntityManagerFactory("product");//这里的product需要和命名空间相同
}
public static EntityManager getEntityManager(){
return factory.createEntityManager();
}
}
5.实体类domain,jpa自动根据实体类创建表,但需要手动创建数据库
需要注解Entity,这里的name是创建的表的名字,以及创建表的注解
在第一个字段上面打上注解表示id是 主键和 自增长
package cn.dmc.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Long dirId;
public Product(String name, Long dirId) {
this.name = name;
this.dirId = dirId;
}
public Product(){
}
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 getDirId() {
return dirId;
}
public void setDirId(Long dirId) {
this.dirId = dirId;
}
@Override
public String toString() {
return "Product{" +
"id=" + id +
", name='" + name + '\'' +
", dirId=" + dirId +
'}';
}
}
6.写实际 的jpa代码
package cn.dmc.dao.impl;
import cn.dmc.dao.IProductDao;
import cn.dmc.domain.Product;
import cn.dmc.util.ProJPAUtil;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
public class ProductDaoImpl implements IProductDao {
@Override
public void save(Product product) {
EntityManager manager = ProJPAUtil.getEntityManager();
manager.getTransaction().begin();
manager.persist(product);
manager.getTransaction().commit();
manager.close();
}
@Override
public void update(Product product) {
EntityManager manager = ProJPAUtil.getEntityManager();
manager.getTransaction().begin();
manager.merge(product);
manager.getTransaction().commit();
manager.close();
}
@Override
public void delete(Long id) {
EntityManager manager = ProJPAUtil.getEntityManager();
manager.getTransaction().begin();
Product p = manager.find(Product.class,id);
manager.remove(p);
manager.getTransaction().commit();
manager.close();
}
@Override
public List<Product> getAll() {
EntityManager manager = ProJPAUtil.getEntityManager();
//这是一个正确的,字符串的错误先不用管
String sql = "select p from cn.dmc.domain.Product p";
Query query = manager.createQuery(sql);
List list = query.getResultList();
manager.close();
return list;
}
@Override
public Product getOne(Long id) {
EntityManager manager = ProJPAUtil.getEntityManager();
Product p = manager.find(Product.class, id);
manager.close();
return p;
}
}
7.调用
package cn.dmc.test;
import cn.dmc.dao.IProductDao;
import cn.dmc.dao.IProductDirDao;
import cn.dmc.dao.impl.ProductDaoImpl;
import cn.dmc.dao.impl.ProductDirDaoImpl;
import cn.dmc.domain.Product;
import org.junit.Test;
import java.util.List;
public class Test01 {
IProductDirDao dao2 = new ProductDirDaoImpl();
IProductDao dao = new ProductDaoImpl();
@Test
public void create(){
Product p1 = new Product();
p1.setName("good2");
p1.setDirId(1l);
dao.save(p1);
}
@Test
public void delete(){
dao.delete(2l);
}
@Test
public void updata(){
Product p1 = new Product();
p1.setName("go0");
p1.setId(3l);
p1.setDirId(1l);
dao.update(p1);
}
@Test
public void findOne(){
Product one = dao.getOne(1l);
System.out.println(one);
}
@Test
public void findAll(){
List<Product> list = dao.getAll();
list.forEach(System.out::println);
}
}