JPA的初级CRUD-01
一、JPA
1.1 什么是JPA
JPA:(Java Persistence API) ORM的规范
JPA是规范,Hibernate是它的实现(不唯一,但最好)
最底层的操作还是JDBC(引入驱动包)
1.2 什么是ORM
o(对象,java面向对象 object) r(关系 relational,关系型数据库) m(映射 mapping)
1.3 JPA与JDBC的区别
JPA(hibernate)的底层还是JDBC
JPA开发效率高(JPA代码简单)
JPA运行效率低(jdbc高:更接近低层)
JPA兼容各种数据库(方便移植)
JPA有内置缓存(性能在一定程度上还是有优化)
二.CRUD项目操作
2.1 新建项目支持
导入配置依赖包等
2.2 导包
在外层的pom.xml中进行导包
- 导包类型(hibernate核心包,JPA支持包,驱动包,测试包)
- JDK1.8插件配置支持
<?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>cn.itsource</groupId>
<artifactId>jpademo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>jpaday01</module>
</modules>
<!--导包:hibernate的包 ,hibernate对于JPA的支持包,数据库驱动包,junit测试包-->
<dependencies>
<!--hibernate的核心包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!--hiberante对于jpa的支持包-->
<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.21</version>
</dependency>
<!--junit测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--设置项目的JDK版本-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.3 引入persistence.xml
2.3.1 使用工具生成 META-INF\persistence.xml
可以手写,也可以使用同PS保存快捷键一样的ctrl+alt+shift+s进行配置
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--
咱们这个配置是要连接数据库的(jpa支持咱们连接多个数据库)
persistence-unit:持久化单元(可能有多个,每一个对应一个数据库)
name:取个名称(随便取)
transaction(事务,同生共死)-type(类型)
RESOURCE_LOCAL:本地的事务
JTA: 分布式系统要使用的事务
基本的数据库连接配置(四大金刚)
properties:属性(所有属性都可以在下面的文件中找到)
resources\源码包\hibernate-release-4.3.8.Final\project\etc\hibernate.properties
-->
<persistence-unit name="cn.dragon" 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" />
<!-- 配置方言(数据库兼容):你要操作的是什么数据库,根据不同的方言拼接不同的SQL
InnoDB:支持事务,支持外键 MyISAM:不支持事务,不支持外键(属性高)
-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!--配置建表策略(自动化帮我们创建相应的表)-->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!--可以看到SQL的展示-->
<property name="hibernate.show_sql" value="true" />
<!--可以看到SQL的展示(漂亮一点)-->
<!--<property name="hibernate.format_sql" value="true" />-->
</properties>
</persistence-unit>
</persistence>
2.4 准备domain对象
//告诉JPA:这个类是要做实体化的
/**
* @Entity:实体类,归JPA管
* @Table(name = "t_student"):与数据库的表有关系
* 如果不写,默认有一个表叫:Student
*/
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_employee")
public class Student {
/**
* @Id:主键
* @GeneratedValue:主键是自增的
*/
@Id
@GeneratedValue
private Long id;
private String name;
private String password;
}
2.5 基本功能测试
- Persistence -> EntityManagerFactory -> EntityManager -> crud
- 注意点:增删改需要事务 EntityManager可以拿到一个事务
/**
* 在JPA中,所以增删改都需要我们去提交事务
*/
//拿到EntityManagerFactory(传入持久化单元的名称)
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("cn.dragon");
//拿出到实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//拿出一个事务 EntityManager里面有一个事务(只能拿到一个事务)
//开始事务
entityManager.getTransaction().begin();
//persist:持久化(保存一条数据)
entityManager.persist(employee);
//提交事务
entityManager.getTransaction().commit();
//关闭资源
entityManager.close();
entityManagerFactory.close();
三.CRUD
先完成了工具类
//帮咱们拿到一个EntityManager对象
public class JpaUtil {
private static EntityManagerFactory factory;
//加载时运行,且只运行一次
static {
try {
factory = Persistence.createEntityManagerFactory("cn.dragon");
} catch (Exception e) {
e.printStackTrace();
}
}
//直接拿到EntityManager对象
public static EntityManager getEntityManager(){
return factory.createEntityManager();
}
}
增删改需要添加事务
3.1 添加
entityManager.persist(s
tudent
);
3.2 修改
entityManager.merge(s
tudent
);
3.3 删除
先查询,再判断,最后删除
Employee employee = entityManager.find(Student
.class, id);
if(student
!=null) {
//这里要求咱们传一个对象进去
entityManager.remove(student
);
}
3.4 查询一条数据
传类型与id
entityManager.find(Student
.class,id);
3.1 查询所有
query对象(entityManager创建) jpql:面向对象的查询语言
entityManager = JpaUtil.getEntityManager();
//使用查询对象,写JPQL:像SQL,但是更加简单(面向对象)
//1.准备JPQL 不要写* ,from后面是一个类
//String jpql = "select o from cn.dragon.domain.Student o";
// String jpql = "select o from Student
o";
String jpql = "from Student
";
//2.根据JPQL拿到查询对象
Query query = entityManager.createQuery(jpql);
//3.返回所有数据
return query.getResultList();
四.建表策略
4.1 create-drop
先删除-> 再创建 -> 用完(EntityManagerFactory关闭)再删(测试)
4.2 create
先删除-> 再创建(测试)
4.3 update
- 没有表就创建,有就修改
- 修改只增不减(不改类型)
4.4 validate
验证功能(只验证domain中写好的属性)
五.重要API认识
5.1 Persistence
- 解析相应的核心配置文件
- 创建EntityManagerFactory对象
5.2 EntityManagerFactory
- 重(连接池,二级缓存,所有实体关系,预编译的SQL/JPQL)
- 线程安全 (1:1:1)
- 创建 EntityManager对象
5.3 EntityManager
- 轻(连接,一级缓存)
- 线程不安全
- 完成CRUD
- 什么是一级缓存命中?
同一个EntityManagerFactory,同一个EntityManager,同一个OID
- OID是什么样子的? 类的全限定名#id
cn.dragon.domain.Employee#1
5.4 EntityTransaction
- EntityManager只有这一个事务
- 如果多个系统/多个数据库 -> JTA
六.映射细节
@Column
name = "username":对应的列名
length=2 :长度
nullable = false:该字符不能为空
unique = true:唯一
@Column(name = "username",length = 20,nullable = false,unique = true)
@Lob
大文本(装很多数据)
@Transient
临时属性(JPA不会管理这个属性)
@Temporal
时间设置
TemporalType.TIMESTAMP:年月日,时分秒
TemporalType.DATE:年月日
TemporalType.TIME:时分秒
JPA的初级CRUD-01的更多相关文章
- [读书笔记] 四、SpringBoot中使用JPA 进行快速CRUD操作
通过Spring提供的JPA Hibernate实现,进行快速CRUD操作的一个栗子~. 视图用到了SpringBoot推荐的thymeleaf来解析,数据库使用的Mysql,代码详细我会贴在下面文章 ...
- JPA的入门CRUD
主要目的: 操作实体类就相当于操作数据库表 建立两个映射关系: 实体类和表的映射关系 实体类中的属性和表中字段的映射关系 不在关注sql语句 常见的orm框架:Mybatis(ibatis).Hibe ...
- 【原】无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页
一.开发环境: 1.windows 7 企业版 2.IDEA 14 3.JDK 1.8 4.Maven 3.5.2 5.MariaDB 6.SQLYog 二.Maven设置: Maven目录下的con ...
- 【原】无脑操作:IDEA + maven + SpringBoot + JPA + EasyUI实现CRUD及分页
背景:上一篇文章的界面太丑.没有条件查询功能.所以做一些改进,整合EasyUI做实现.(仅以此文纪念表格中出现的这些朋友工作六周年,祭奠一下逝去的青春^_^) 一.开发环境(参照上一篇文章) 补充:E ...
- 使用springboot实现一个简单的restful crud——01、项目简介以及创建项目
前言 之前一段时间学习了一些springboot的一些基础使用方法和敲了一些例子,是时候写一个简单的crud来将之前学的东西做一个整合了 -- 一个员工列表的增删改查. 使用 restful api ...
- DP的初级问题——01包、最长公共子序列、完全背包、01包value、多重部分和、最长上升子序列、划分数问题、多重集组合数
当初学者最开始学习 dp 的时候往往接触的是一大堆的 背包 dp 问题, 那么我们在这里就不妨讨论一下常见的几种背包的 dp 问题: 初级的时候背包 dp 就完全相当于BFS DFS 进行搜索之后的记 ...
- 用Springboot+Jpa实现学生CRUD操作(含前端页面,含分页,自定义SQL)
前期准备 使用idea新建个SpringBoot项目 参考博客:https://blog.csdn.net/Mr_Jixian/article/details/89742366?tdsourcetag ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限
开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...
- spring-boot-route(九)整合JPA操作数据库
单调的增删改查让越来越多的程序员感到乏味,这时候就出现了很多优秀的框架,完成了对增删改查操作的封装,只需要简单配置,无需书写任何sql,就可以完成增删改查.这里比较推荐的是Spring Data Jp ...
随机推荐
- 取消IDEA默认打开最近的项目(设置打开选择创建页面)
Ctrl + Shift + s 打开设置界面 选择Appearance&Behavior 找到System Settings 将Reopen last project on startup ...
- python深拷贝,浅拷贝
1.浅拷贝, 首先要引用copy包 from copy import copy class A: def __init__(self): self.A=1 self.B=2 a = A() copy( ...
- pycharm+Django+MySQL项目连接数据库中原有数据库
1.安装驱动 一般会有MySQLdb.pymysql等,因为python版本等问题,我安装的是pymysql. 还可以在项目里安装,File->settings->project 2.在项 ...
- P61 实践作业
网络攻防实验环境搭建 根据链接下载的实验工具包,将其解压 打开VM虚拟机,点击图中红色框,扫描虚拟机 选择文件所在位置 点击下一步,完成.即可 在VM虚拟机设置中把网络适配器修改为桥接模式.如下图 在 ...
- 虚拟机JVM
虚拟机组成:类加载器,运行时数据区,执行引擎 运行时数据区:堆,栈,方法区,程序计数器,本地方法栈 堆:对象实例 栈:入栈出栈,线程的执行 栈帧:一个方法一个 栈的结构:放 局部变量表,操作数栈,动态 ...
- MySql数据库执行insert时候报错:Column count doesn't match value count at row 1
遇到这个问题之后,第一反应就是前后列数不等造成的,但是我检查SQL之后,发现列数是相同得,但是插入还是有问题,然后又写了简单得SQL只插入不为空得字段,执行还是报这个错,最后请教了高人,指点之后,大概 ...
- 微信小程序生成携带参数的小程序码
https://blog.csdn.net/qq_28988969/article/details/77969365
- aop原理及理解
概念 Aspect Oriented Programming,面向切面编程,实际上它是一个规范.一种设计思路,总之是抽象的. 先上图 使用目的 从项目结构上来说 对业务逻辑的各个部分进行隔离,降低业务 ...
- yii2-redis 扩展详解
安装yii2-redis composer require yiisoft/yii2-redis 修改config/web.php 的 components 配置 'cache' => [ / ...
- 关于逻辑回归是否线性?sigmoid
from :https://www.zhihu.com/question/29385169/answer/44177582 逻辑回归的模型引入了sigmoid函数映射,是非线性模型,但本质上又是一个线 ...