JPA框架学习
JPA入门
1.JPA认识
1.1什么是JPA
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据他的作用是简化对mysql的操作
1.2JQP的优缺点
优点: 1.JPA的主要目标之一就是提供更加简单的编程模型
2.JPA拥有可媲美JDBC的查询能力
3.JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句
缺点: 1.不能干预sql语句的生成
2.一个项目中,如果对sql语句的优化要求比较高,不适合用JPA
3.如果一张表的数据非常大的时候也不能用JPA
1.2 ORM :ORM框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中
1.3JPA的配置
1.首先导入依赖的包
<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>com</groupId>
<artifactId>wjx</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
<!-- mysql的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- junit的测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>pss</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>
</project>
然后Ctrl +Shift+s大开页面配置JPA
点击加号在下面找到JPA文件
然后在点击生成的JPA里面的加号找到加号直接配置生成文件 拖到你 工程里面
放在resource里面
在进行一下配置框起来的地方改成你数据库的名字
1.4第一个JPA程序
1.1创建一个实体类对象
给于字段提供get set方法
提供一个测试类进行测试
然后就是完成一个用JPA对数据库的CRUD(分层domain dao )
1.6 一级缓存和二级缓存
他就只会查询一次因为第二次其实已经在一级缓存中了
但是,
Customer customer1 = entityManager.find(Customer.class, 1);
//开启事务
transaction.begin();
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
//提交事务
transaction.commit();
//关闭事务
entityManager.close();
Customer customer2 = entityManager.find(Customer.class, 1);
这样他就回打印两次
二级缓存,就是要在不同的entityManager中,只查询一次
1.7单表映射配置细节
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id; //要求:主键,使用数据库的自动生成策略
@Column(length = 20,nullable = false,unique = true,name ="username")
private String name; //要求:varchar(20),数据库名称为username,不能为空,唯一
private String password;
@Column(insertable = false,columnDefinition = "int(10) default(25)")
private Integer age = 25; //要求:默认值是25,在插入数据时不允许覆盖(添加数据时不操作该字段)
private Boolean sex;// 数据库没有布尔类型,bit对象
@Column(columnDefinition = "decimal (19,2)")
private BigDecimal salary;// 19,2
@Column(updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;//包含年月日时分秒,不允许修改
@Temporal(TemporalType.DATE)
private Date birthday;//包含年月日
@Temporal(TemporalType.TIME)
private Date time;//包含时分秒
@Lob
private String text;//这是一个大文本
@Transient
private String temp;//这一个字段不要同步到数据库