JPA基础(二)之实现一个简单 JPA 例子

实现一个简单 JAP 例子

需要学习 JPA,首先需要把环境搭起来,这里选择实现 JPA 规范的持久层框架是 Hibernate,版本为 5.0.7.Final,并且采用 maven 进行依赖包的管理,具体步骤如下:

  1. 创建 Maven 项目,这一步比较简单,可以直接在 IDE 创建。
  2. 添加 hibernate-entitymanager 依赖包:使用 Hibernate 来进行实体的管理,实现实体的 CRUD 操作,我们只需要引入这个 hibernate-entitymanager依赖包即可,其它需要依赖的包将由 maven 自动引入,这样我们就不用关系具体需要依赖哪些 jar 包了。当然,junit 和数据库驱动也是必不可少的。

1.创建一个 maven 的 java 工程
2.创建数据库 jpademo,导入数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for customer_product
-- ----------------------------
DROP TABLE IF EXISTS `customer_product`;
CREATE TABLE `customer_product` (
	`customer_id` int(11) NULL DEFAULT NULL COMMENT '客户编号',
	`product_id` int(11) NULL DEFAULT NULL COMMENT '产品编号'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT 
= Dynamic;

-- Records of customer_product
-- ----------------------------
INSERT INTO `customer_product` VALUES (1, 3);
INSERT INTO `customer_product` VALUES (2, 1);
INSERT INTO `customer_product` VALUES (3, 1);
INSERT INTO `customer_product` VALUES (4, 2);
INSERT INTO `customer_product` VALUES (2, 2);
INSERT INTO `customer_product` VALUES (3, 5);
INSERT INTO `customer_product` VALUES (3, 4);

-- ----------------------------
-- Table structure for tb_customer
-- ----------------------------
DROP TABLE IF EXISTS `tb_customer`;
CREATE TABLE `tb_customer` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
	`remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
	`telephone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
	`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
	`typeId` int(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`) USING BTREE,
	INDEX `FK50l46bmpv01y2ievd9f81roo`(`typeId`) USING BTREE,
	CONSTRAINT `FK50l46bmpv01y2ievd9f81roo` FOREIGN KEY (`typeId`) REFERENCES 
	`tb_customer_type` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_customer
-- ----------------------------
INSERT INTO `tb_customer` VALUES (1, '小菜鸟', '这是一个备注', '17373172188', '长沙', 1);
INSERT INTO `tb_customer` VALUES (2, 'admin', '管理员', '13543567653', '长沙开福区', 2);
INSERT INTO `tb_customer` VALUES (3, '小羊苏西', '佩奇最好的朋友', '13235325389', '长沙岳麓区', 2);
INSERT INTO `tb_customer` VALUES (4, '天线宝宝', '传说可以中码的节目', '13643567653', '长沙雨花区', 3);
INSERT INTO `tb_customer` VALUES (5, '大象佩罗一', '不知道写什么', '13743567652', '长沙望城区', 1);
INSERT INTO `tb_customer` VALUES (6, '小狗丹尼', '汪汪汪', '13843567654', '长沙天心区', 4);

-- ----------------------------
-- Table structure for tb_customer_type
-- ----------------------------
DROP TABLE IF EXISTS `tb_customer_type`;
CREATE TABLE `tb_customer_type` (
	`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
	`typeName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户类型',
	PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 
	COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
	
-- ----------------------------
-- Records of tb_customer_type
-- ----------------------------
INSERT INTO `tb_customer_type` VALUES (1, '普通会员');
INSERT INTO `tb_customer_type` VALUES (2, '银卡会员');
INSERT INTO `tb_customer_type` VALUES (3, '金卡会员');
INSERT INTO `tb_customer_type` VALUES (4, '紫卡会员');

-- ----------------------------
-- Table structure for tb_product
-- ----------------------------
DROP TABLE IF EXISTS `tb_product`;
CREATE TABLE `tb_product` (
	`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
	`product_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称',
	PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ciROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_product
-- ----------------------------
INSERT INTO `tb_product` VALUES (1, 'APP');
INSERT INTO `tb_product` VALUES (2, 'PC');
INSERT INTO `tb_product` VALUES (3, 'html5');
INSERT INTO `tb_product` VALUES (4, '小程序');
SET FOREIGN_KEY_CHECKS = 1;

3、在pom.xml里添加依赖

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-entitymanager</artifactId>
	<version>5.3.6.Final</version>
</dependency>

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.13</version>
</dependency>

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
</dependency>

4、创建一个 jpa 的核心配置文件
在 src/main/resources/META-INF/下创建配置文件 persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence”
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
	http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	
	<!--
		name 属性用于定义持久化单元的名字, 必选
		transaction-type:指定 JPA 的事务处理策略。RESOURCE_LOCAL:默认值,
		数据库级别的事务,只能针对一种数据库,不支持分布式事务。
		如果需要支持分布式事务,使用 JTA:transaction-type="JTA“
	-->

	<persistence-unit name="jpademo" >
		<!—添加配置信息 -->
	</persistence-unit>
</persistence>

5、在 jpa 的核心配置文件的配置三块基本的信息

<persistence-unit name="jpademo">
	<!-- 指定一个 jpa 具体实现为 HibernatePersistenceProvider --> 
	<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
		<properties>
		<!-- 2、连接数据库的基本信息 -->
		<property name="javax.persistence.jdbc.driver" 
				value="com.mysql.cj.jdbc.Driver" /> 
		<property name="javax.persistence.jdbc.url" 
				value="jdbc: mysql://127.0.0.1:3306/ssm?useUnicode=true characterEncoding=utf- 8" /> 
		<property name="javax.persistence.jdbc.user" value="root" />
		<property name="javax.persistence.jdbc.password" value="root" />
		<!--3、 jpa 的具体实现,hibernate 的基本属性 -->
		<property name="hibernate.dialect" 
			value="org.hibernate.dialect. MySQL8Dialect" />
		<!—显示 sql 语句 -->
		<property name="hibernate.show_sql" value="true"/>
		<!- 格式化 sql 语句 -->
		<property name="hibernate.format_sql" value="true"/>
		<!--自动创建|更新|验证数据库表结构 --> 
		<property name="hibernate.hbm2ddl.auto" value="update"/>
	</properties>
</persistence-unit>

6、创建实体类,并用注解关联实体类和数据表的映射关系

@Data
@Entity
@Table(name = "tb_customer")
public class Customer implements java.io.Serializable {
	/**
	* 版本号
	*/
	private static final long serialVersionUID = 3416844643852851984L;
	
	/**
	* id
	*/
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id", unique = true, nullable = false, length = 10)
	private Integer id;
	
	/**
	* address
	*/
	@Column(name = "address", nullable = true, length = 255)
	private String address;
	
	/**
	* name
	*/
	@Column(name = "name", nullable = true, length = 255)
	private String name;
	
	/**
	* remark
	*/
	@Column(name = "remark", nullable = true, length = 255)
	private String remark;
	
	/**
	* telephone
	*/
	@Column(name = "telephone", nullable = true, length = 255)
	private String telephone;
	@Column(name="typeid")
	private Integer typeId;

在实体类中使用的了 lombok, Lombok 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官方地址: https://projectlombok.org/,github 地址:
https://github.com/rzwitserloot/lombok。

IntelliJ IDEA 使用它的方法

1、先安装插件
在这里插入图片描述2、在pom.xml里引入 lombok 的 jar 包

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version> 1.18.8 </version>
</dependency>

3、注解的介绍

@Getter and @Setter
可以用@Getter / @Setter 注释任何字段,当然也可以注释到类上让 lombok 自动生成默认的 getter / setter 方法。

@ToString
生成 toString()方法,默认情况下,它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段
@ToString(exclude = “id”)
@ToString(exclude = {“id”,“name”})

@EqualsAndHashCode
生成 hashCode()和 equals()方法

@NoArgsConstructor
@NoArgsConstructor 生成一个无参构造方法。当类中有 final 字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final 字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull 字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。

@RequiredArgsConstructor
@RequiredArgsConstructor 会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以 final 修饰的未经初始化的字段,或者是以@NonNull 注解的未经初始化的字段

@AllArgsConstructor
生成一个全参数的构造方法

@Data
@Data 包含了 @ToString、@EqualsAndHashCode、@Getter / @Setter 和@RequiredArgsConstructor 的功能

其他JPA相关注解可以参考此处

7、创建单元测试方法做测试

@Test
public void test1() {
	// EntitymanagerFactory
	EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpademo");
		// MyBatis---SqlSession JPA --- EntityManager
		EntityManager entityManager = factory.createEntityManager();
		EntityTransaction tx = entityManager.getTransaction();
		tx.begin();
			Customer customer = new Customer();
			customer.setName("小灰灰");
			customer.setAddress("狼堡");
			customer.setTelephone("17232123221");
			customer.setRemark("这是一个备注");
			customer.setTypeId(2);
			entityManager.persist(customer);
		tx.commit();
		System.out.println("添加成功");
		entityManager.close();
	factory.close();
}

其他JPA概述、版本及注解问题点此处

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章