實現一個簡單 JAP 例子
需要學習 JPA,首先需要把環境搭起來,這裏選擇實現 JPA 規範的持久層框架是 Hibernate,版本爲 5.0.7.Final,並且採用 maven 進行依賴包的管理,具體步驟如下:
- 創建 Maven 項目,這一步比較簡單,可以直接在 IDE 創建。
- 添加 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概述、版本及註解問題點此處