JPA概述
是一套规范,mybatis,hiberante是产品
mybatis SQL语句用户自己去写
hibernate 不需要手动写SQL,程序运行时会自动生成并执行,如果非要写SQL语句,HIbernate建议使用面向对象的查询语句来完成
环境搭建
创建空maven工程并导入依赖
pom.xml文件如下
1 |
|
添加配置文件
在resource目录下创建文件夹META-INF,在里面创建persistence.xml文件
1 |
|
快速上手
创建表
1 | USE `jpa`; |
创建实体类
1 | package cn.itcast.domain; |
通过注解配置映射关系
1 | package cn.itcast.domain; |
编写测试类
1 | package cn.itcast.test; |
可能出现的错误信息
问题1:Cannot resolve xxx
解决办法
1.alt+enter 选择数据源 assign data source
2.选择数据库连接(如果没有数据源请先添加,教程地址:https://www.jianshu.com/p/d7db42636e63)
问题2:java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
解决办法
该问题是因为jdk1.9没有JAXB相关API的jar包,添加依赖即可
1 | <dependency> |
工具类抽取
抽取理由
理由1:EntityManagerFactory对象每次创建都需要读取配置文件,比较耗时
理由2:该对象是线程安全的在多线程环境中不会出现线程安全问题
工具类代码
1 | package cn.itcast.utils; |
使用工具类改进测试代码
1 | package cn.itcast.domain; |
升级Junit测试代码
观察以下代码思考问题
@After @Before @Test回顾
执行顺序 @Before > @Test > @After
改造思路
将初始化EntityManager和EntityTransaction,包括开启事务的操作放到@Before中
将提交事务和释放资源的代码放到@after中
让其他测试类继承该BaseTest类
BaseTest代码
1 | package cn.itcast.domain; |
基本操作
增加
1 | import javax.persistence.EntityTransaction; |
运行结果
删除
1 | package cn.itcast.domain; |
修改
1 | public class Test5 extends BaseTest { |
查询
根据ID查询
1 | package cn.itcast.domain; |
运行结果
延迟查询
代码
1 | package cn.itcast.domain; |
延迟查询和立即查询的区别
延迟加载(懒加载)
得到的是一个动态代理对象
什么时候用,什么使用才会查询
立即查询
调用查询方法就会马上执行SQL语句
使用延迟查询在控制台的结果
使用的是getRerence延迟加载方法,并且没有获取结果对象,所以不会执行SQL语句
立即查询在控制台的结果
使用的是find方法,虽然没有获取结果对象,但是会执行SQL语句,只要调用方法就会执行
面向对象语句(JPQL)查询数据库
语法
SQL : select * from 表名
select * from 表名 order by 字段名 desc
JPQL/HQL: from 实体类名
##7.1 查询全部
1 | package cn.itcast.domain; |
倒叙查询
1 | package cn.itcast.domain; |
统计查询
1 |
|
控制台打印
1 | 1.初始化EntityManager和EntityTransaction对象完毕 |
分页查询
需求
代码
注意这里不能使用limit语句!!!
1 |
|
查询结果
条件查询
提示:方式1比较老,建议使用方式2和方式3
方式1使用?占位符(旧)
1 |
|
1那里会报红线,忽略就好了
方式2使用命名参数占位符
1 |
|
方式3 使用JPA占位符
1 |
|