项目结构图

数据库环境 数据库:MySQL

版本:5.x

数据库名:jpa-demo

用户名密码:root/1234

代码清单 1:数据库脚本: /*

Navicat MySQL Data Transfer

Source Server : localhost

Source Server Version : 50525

Source Host : localhost:3306

Source Database : jpa-demo

Target Server Type : MYSQL

Target Server Version : 50525

File Encoding : 65001

Date: 2014-11-20 20:09:27

*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for `address`

-- ----------------------------

DROP TABLE IF EXISTS `address`;

CREATE TABLE `address` (

`addressID` int(11) NOT NULL,

`city` varchar(55) NOT NULL,

`street` varchar(55) NOT NULL,

`zip` varchar(8) NOT NULL,

PRIMARY KEY (`addressID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of address

-- ----------------------------

INSERT INTO `address` VALUES ('1', '深圳', '坂田市场', '518001');

INSERT INTO `address` VALUES ('2', '深圳', '坂田路口', '518002');

INSERT INTO `address` VALUES ('3', '深圳', '四季花城', '518003');

-- ----------------------------

-- Table structure for `userinfo`

-- ----------------------------

DROP TABLE IF EXISTS `userinfo`;

CREATE TABLE `userinfo` (

`userID` int(11) NOT NULL,

`username` varchar(20) NOT NULL,

`birthday` datetime DEFAULT NULL,

`sex` varchar(8) NOT NULL,

`addressID` int(11) NOT NULL,

PRIMARY KEY (`userID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of userinfo

-- ----------------------------

INSERT INTO `userinfo` VALUES ('1', '张金雄', null, 'male', '1');

INSERT INTO `userinfo` VALUES ('2', '李某某', null, 'male', '2');

INSERT INTO `userinfo` VALUES ('3', '王某某', '2006-08-10 00:00:00', 'female', '3');

INSERT INTO `userinfo` VALUES ('4', '陈某某', '2006-08-12 00:00:00', 'male', '3');

源代码

代码清单 2:pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

com.coderdream

jpa-demo

war

0.0.1-SNAPSHOT

jpa-demo Maven Webapp

http://maven.apache.org

UTF-8

4.11

5.1.17

1.7.5

2.1-60f

junit

junit

${junit.version}

test

toplink.essentials

toplink-essentials

${toplink.essentials.version}

toplink.essentials

toplink-essentials-agent

${toplink.essentials.version}

org.slf4j

slf4j-log4j12

${slf.version}

mysql

mysql-connector-java

${mysql.version}

jpa-demo

代码清单 3:persistence.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

version="1.0">

oracle.toplink.essentials.PersistenceProvider

com.coderdream.model.UserInfo

com.coderdream.model.Address

代码清单 4:Address.java

package com.coderdream.model;

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

@Entity

public class Address implements Serializable {

// 地址id, 不能为空, 必须唯一

@Id

@Column(name = "addressid", unique = true, nullable = false)

private int addressid;

// 城市, 不能为空

@Column(name = "city", nullable = false)

private String city;

// 街道, 不能为空

@Column(name = "street", nullable = false)

private String street;

// 邮政编码, 不能为空

@Column(name = "zip", nullable = false)

private String zip;

public Address() {

}

public Address(int addressid) {

this.setAddressid(addressid);

}

public int getAddressid() {

return this.addressid;

}

public void setAddressid(int addressid) {

this.addressid = addressid;

}

public String getCity() {

return this.city;

}

public void setCity(String city) {

this.city = city;

}

public String getStreet() {

return street;

}

public void setStreet(String street) {

this.street = street;

}

public String getZip() {

return this.zip;

}

public void setZip(String zip) {

this.zip = zip;

}

@Override

public int hashCode() {

return this.addressid;

}

@Override

public boolean equals(Object object) {

if (!(object instanceof Address))

return false;

final Address other = (Address) object;

return this.addressid == other.addressid;

}

@Override

public String toString() {

return "Address[addressid=" + getAddressid() + ", city='" + getCity() + "', street='" + getStreet() + "', zip='" + getZip() + "";

}

}

代码清单 5:UserInfo.java

package com.coderdream.model;

import java.io.Serializable;

import java.sql.Timestamp;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.OneToOne;

import static javax.persistence.CascadeType.*;

@Entity

public class UserInfo implements Serializable {

// 用户id, 不能为空, 必须唯一

@Id

@Column(name = "userid", unique = true, nullable = false)

private int userid;

// 用户名, 不能为空

@Column(name = "userName", nullable = false)

private String userName;

// 性别, 不能为空

@Column(name = "sex", nullable = false)

private String sex;

// 出生日期, 可以为空

@Column(name = "birthday")

private Timestamp birthday;

// 地址, 不能为空

// PERSIST 表示更新、新增UserInfo数据时会同时更新、新增Address的数据

// REMOVE 表示从数据库删除UserInfo会同时删除Address表中对应的数据

@OneToOne(cascade = { PERSIST, REMOVE })

@JoinColumn(name = "addressID", nullable = false)

private Address address;

public UserInfo() {

}

public UserInfo(int userid) {

this.setUserid(userid);

}

@Override

public int hashCode() {

return this.getUserid();

}

@Override

public boolean equals(Object object) {

if (!(object instanceof UserInfo))

return false;

final UserInfo other = (UserInfo) object;

return this.userid == other.userid;

}

@Override

public String toString() {

return "UserInfo[userid=" + this.userid + ", userName='" + userName + "', sex='" + sex + "', birthday=" + birthday + ", address="

+ address + "";

}

public int getUserid() {

return userid;

}

public void setUserid(int userid) {

this.userid = userid;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public Timestamp getBirthday() {

return birthday;

}

public void setBirthday(Timestamp birthday) {

this.birthday = birthday;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public Address getAddress() {

return address;

}

public void setAddress(Address address) {

this.address = address;

}

}

代码清单 6:SimpleService.java

package com.coderdream.service;

import java.util.List;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

import com.coderdream.model.Address;

import com.coderdream.model.UserInfo;

public class SimpleService {

/**

* 删除用户id=6的数据

*/

public static void delete() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

final EntityManager em = emf.createEntityManager();

// 找不到数据的话这里会抛异常

UserInfo info = em.find(UserInfo.class, 6);

try {

em.getTransaction().begin();

em.remove(info);

em.getTransaction().commit();

} finally {

em.close();

}

}

/**

* 修改用户id=6的数据

*/

public static void update() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

final EntityManager em = emf.createEntityManager();

// 找不到数据的话这里会抛异常

UserInfo info = em.find(UserInfo.class, 6);

info.setUserName("哈哈");

info.getAddress().setStreet("坂田2");

try {

em.getTransaction().begin();

// 自动将info更新到数据库

em.getTransaction().commit();

} finally {

em.close();

}

}

/**

* 查询所有用户数据

*/

public static void query() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

long s = System.currentTimeMillis();

// 数据库连接失败这里会抛出异常

final EntityManager em = emf.createEntityManager();

long e = System.currentTimeMillis();

System.out.println("连接数据库耗时: " + (e - s) + "毫秒");

// 获取数据

@SuppressWarnings("unchecked")

List list = em.createQuery("SELECT a FROM UserInfo a").getResultList();

int i = 0;

for (UserInfo info : list) {

System.out.println("第" + (++i) + "个值为: " + info);

}

em.close();

}

/**

* 创建用户id=6的一条数据, 地址id=6

*/

public static void create() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

final EntityManager em = emf.createEntityManager();

UserInfo info = new UserInfo(6);

info.setSex("male");

info.setUserName("张某某");

info.setBirthday(new java.sql.Timestamp(System.currentTimeMillis()));

Address naddr = new Address(6);

naddr.setCity("深圳");

naddr.setStreet("坂田");

naddr.setZip("518000");

info.setAddress(naddr);

try {

em.getTransaction().begin();

em.persist(info);

em.getTransaction().commit();

} finally {

em.close();

}

}

/**

* 主函数

*/

public static void main(String[] args) throws Throwable {

SimpleService.query();

SimpleService.create();

System.out.println("新增一条数据后进行查询");

SimpleService.query();

SimpleService.update();

System.out.println("修改一条数据后进行查询");

SimpleService.query();

SimpleService.delete();

System.out.println("删除一条数据后进行查询");

SimpleService.query();

}

}

运行结果

[TopLink Info]: 2014.11.20 08:24:08.134--ServerSession(1112823384)--TopLink, version: Oracle TopLink Essentials - 2.1 (Build 60f (01/07/2009))

[TopLink Info]: 2014.11.20 08:24:08.822--ServerSession(1112823384)--file:/E:/E_441_64/workspace/jpa-demo/target/classes/-piscesPU login successful

连接数据库耗时: 1264毫秒

第1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

第2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

第3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

第4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

新增一条数据后进行查询

连接数据库耗时: 0毫秒

第1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

第2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

第3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

第4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

第5个值为: UserInfo[userid=6, userName='张某某', sex='male', birthday=2014-11-20 20:24:09.102, address=Address[addressid=6, city='深圳', street='坂田', zip='518000

修改一条数据后进行查询

连接数据库耗时: 0毫秒

第1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

第2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

第3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

第4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

第5个值为: UserInfo[userid=6, userName='哈哈', sex='male', birthday=2014-11-20 20:24:09.102, address=Address[addressid=6, city='深圳', street='坂田2', zip='518000

删除一条数据后进行查询

连接数据库耗时: 0毫秒

第1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

第2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

第3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

第4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

完整工程源代码

参考文档

maven jpa mysql_Maven 版 JPA 最佳实践相关推荐

  1. boot jpa mysql postman spring_听说过spring-data-jdbc么?来个最佳实践

    本文的完整示例代码,见github仓库.小q只在文中介绍最关键的代码块. https://github.com/yuanluoji/purestart-springboot-data-jdbc 很多人 ...

  2. java jpa性能_[Java Performance] 数据库性能最佳实践 - JPA和读写优化

    数据库性能最佳实践 当应用须要连接数据库时.那么应用的性能就可能收到数据库性能的影响. 比方当数据库的I/O能力存在限制,或者因缺失了索引而导致运行的SQL语句须要对整张表进行遍历.对于这些问题.只相 ...

  3. mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践

    Spring Data Jpa 虽然可以使用参数调整批量插入,但是仅限于主键策略不是 IDENTITY 的情况下,对于习惯了使用 IDENTITY 的 MySQL 选手来说,批量插入数据直接就悲剧了. ...

  4. Maven最佳实践:版本管理

    Maven最佳实践:版本管理 什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了 ...

  5. 《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    <深入理解Java虚拟机>阅读笔记 本repository为<深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)>阅读笔记,因为第一章主要讲的是Java的发展历史, ...

  6. maven依赖最佳实践_Maven最佳实践

    maven依赖最佳实践 尽管Maven提供了"配置之上的约定"解决方案,但是仍然有足够多的必要配置引起严重的头痛. 在这篇文章中,我将与您分享一些最佳实践,以简化对POM文件的维护 ...

  7. 实时计算 Flink 版 最佳实践

    简介: 实时计算 Flink 版 最佳实践目录 金融行业 行业背景 金融是现代经济的核心.我国金融业在市场化改革和对外开放中不断发展,金融总量大幅增长.金融稳定直接关系到国家经济发展的前途和命运,金融 ...

  8. Maven学习(六)————企业Maven项目最佳实践

    引言 在<Maven学习(三)----Maven核心概念(二)>中,学到了Maven 继承和 Maven 聚合的概念,这两个概念,解决的问题分别是: 1.解决一些公共依赖统一版本的问题. ...

  9. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...

    JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试.无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪 ...

最新文章

  1. large graph挖掘的技术基础
  2. C#.NET操作数据库通用类(MS SQL Server篇)
  3. 2年Java面试提问总结
  4. JSP 表单request内容
  5. 数组元素的修改会影响到转换过来的结合_数组长度属性背后有什么魔力?
  6. [js] 使用js实现一个图片剪裁的功能
  7. DouPHP 1.5 Release
  8. mac vscode debug安装调试moodle
  9. 模拟器:思科 创建Vlan,给2层交换机和3层交换机配置IP地址和子网掩码
  10. iNFTnews | 元宇宙进行时:那些跑步入场的互联网大厂在如何谋篇布局?
  11. MATLAB eof用法,经验正交函数分析法(EOF)在matlab上的实现
  12. Java基础回顾--jav集合1 集合的分类、解析
  13. 2个或2个以上路由器串联上网,在同一网段
  14. 数据交换技术(*):电路交换,报文交换,分组交换的概念,特点和优缺点以及存储转发技术概念
  15. 2018计算机中文期刊影响因子排名,2018年最新影响因子:839种5分以上期刊名录
  16. 2022年5月网络教育大学英语B统考题库复习题及考试时间
  17. 用C++制作一款电话簿
  18. vjdesign - vue 界面可视化设计器
  19. 关于hive异常:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStor
  20. 关于 ping-pong buff

热门文章

  1. 可再生能源虽好,也需电网配套跟上
  2. 决策树与K-近邻分类随堂笔记(二)
  3. 用gif图展示UML中箭头和线条的含义,及搞懂UML类图、时序图和用例图
  4. Spring5.0源码学习系列之Spring AOP简述(九)
  5. 如何用数据分析,搞定新媒体运营的定位和内容初始化?
  6. HTML 用过渡跟动画制作一个简易的旋转魔方
  7. python中使用cv2遍历图片像素点以及改变像素点的像素值
  8. R语言学习笔记-RStudio基础操作
  9. 洛谷-P1498 南蛮图腾
  10. 泛泰binx一键式离线刷机(可断网刷机,可刷任意版本)(官网脚本更新7.30)