目录
一、ORM
二、Mybatis
1、Mybatis了解
2、springboot整合Mybatis
3、springboot整合Mybatis和Rest
三、JPA
4、SpringData JPA 简介及入门
5、SpringData JPA 基本使用
ORM:对象关系映射(Jbject Relational Mapping),实现面向对象编程语言里不同类型系统的数据之间的转换。将程序对象和关系数据库之间相互映射。
异构性:ORM可以解决数据库与程序之间的异构性,比如字符串的表示,Java:String、Oracle:varchar2、MySQL:varchar、SQLserver:nvarchar。
映射:ORM提供了实现持久化层的另一种模式,采用映射元数据(XML)来描述对象-关系的映射细节,使得ORM中间件能在任何一个Java应用的业务逻辑层和数据库直接充当桥梁。
经典ORM框架:
Hibernate:全自动的框架,强大、复杂、笨重、学习成本高。
Mybatis:半自动的框架(懂数据库的人才能操作)必须自己写sql。
JPA:Java Persistence API,是Java自带的框架。
Mybatis介绍
持久层框架,前身iBatis,支持定制化SQL、存储过程及高级映射。
使用XML或注解来配置和映射原生信息。将接口和POJOS映射成数据库中的记录。
Mybatis架构
接口层:数据查询、数据增加、数据修改、数据删除、配置信息维护接口
数据处理层:参数映射、SQL解析、SQL执行、结果映射
框架支撑层:事务、连接池、缓存、SQL语句配置方式:基于XML、基于注解
引导层:基于XML配置方式、基于Java API方式
数据处理层:
参数映射(参数映射配置、参数映射解析、参数类型解析)
SQL解析(SQL语句配置、SQL语句解析、SQL语句动态生成)
SQL执行(单条、批量、复用)
结果映射:(结果映射配置、结果映射转换、结果类型转换)
Mybatis工作流程
SqlMapConfig.xml配置文件(映射)--SqlSessionFactory(数据库配置、全局)--SqlSession会话连接--executor(执行)--MappendStatement(参数、SQL、结果映射)--数据库
Mybatis结构
Configuration:MappendStatement(SqlSource、ResultMap)、BoundSql
JDBC:ResultSet、Statement(PreparedStatement、SimpleStatement、CallableStatement)
Mybatis主要成员
SqlSession:是Mybatis顶层API接口、作为和数据库交互的会话访问、完成数据库增删改查功能
Executor:Mybatis执行器,是Mybatis调度的核心,负责SQL动态语句的生成,和查询缓存的维护
StatementHandler:负责处理JDBC的Statement的交互,包括对Statement设置参数,以及将JDBC返回的ResultSet结果集转换成List
ParameterHandler:负责将用户传递的参数值,对Statement对象设置参数
ResultSetHandler:负责将ResultSet集合转换成List
TypeHandler
基于配置:MySQL配置(datasource)、Mybatis全局配置(mybatis-config.xml)、Mybatis映射文件配置(mapper/*.xml)、实体类的别名配置(即实体类包路径 mybatis.type-aliases-package)
基于注解:@Select
@MapperScan("映射接口包路径"):用于扫描Mapper映射
@Resource:表明注入的接口操作数据库
ModelMap:用于添加返回前端的响应参数
@Select(查询SQL)
@Results({@Result(property="Java对象关联的属性名",column="关联的数据库字段名",many=@Many(select="映射的查询接口的包名.接口名.方法名"))})
@Many:一对多
SpringData:
为了简化构建基于spring框架应用的数据访问技术。包括对关系数据库、非关系数据库、Map-Reduce框架、云数据服务等访问支持。
提供了统一的API标准来实现对数据访问层的操作。这套标准包含了CRUD(增删改查)、排序和分页的相关操作。
SpringData特点:
支持对象关系映射:具备ORM框架的对象关系映射功能
统一的Repository接口:Repository
统一的数据访问模板类xxxTemplate:如MongoTemplate、RedisTemplate
JPA(Java Persistence API):
是Sun官方提出的Java持久化规范。提供了一种对象/关联映射工具来管理Java应用中的关系数据。
它的出现主要为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink、JDO等ORM框架各自为营的局面。
充分吸收了现有ORM框架的基础上发展而来,具有易于使用、伸缩性强等优点。
(JPA是规范,不是产品,Hibernate、TopLink、JDO等是产品,如果这些产品实现了这个规范,就可以称它们为JPA的实现产品)
接口访问过程:
Application--SpringData--SpringData JPA、(SpringData Redis、SpringData MongoDB)--JPA规范--数据库底层实现:Hibernate、TopLink、JDO等
程序--通过统一数据访问API:SpringData来访问数据库--通过SpringData JPA访问关系型数据库、通过SpringData Redis访问Redis非关系数据库、通过SpringData MongoDB来访问Mongo
SpringData:统一数据访问API
通过ObjectMapping:对象关系映射、Templates:模型、Repository Support:Repository的支持 来访问数据库
SpringData JPA默认底层实现:Hibernate
数据访问过程:
程序--SpringData JPA规范--JPA规范--Hibernate(封装了JDBC操作)--数据库
SpringData JPA规范封装了JPA规范
简单使用:
pom添加jpa依赖:spring-boot-starter-data-jpa
自定义接口继承JpaRepository接口
定义实体类:@Entity(实体类定义)、@Table(映射表名)、@Id(主键ID)、@GeneratedValue(主键值生成方式)、@GenericGenerator(主键值生成器)、@Column(映射表字段)
@Data(lombok注解) @AllArgsConstructor(包含所有参数的构造方法)、@NoArgsConstructor(无参的构造方法)、@Builder(通过构造器来构造对象)
注意事项:
1.实体类属性名不要出现isXxx、getXxx的名称,会导致关键字拼凑出错
2.实体类属性名中间如果有大写字母,会导致数据库的字段名有下划线隔开。比如属性名:isMarried,映射到数据库会变成:is_married,导致无法对应
3.实体类属性名类型为Boolean类型,在某些数据库中会变成bit(1)类型,默认为0,其中0为false,1为true
4.使用like模糊查询,需在参数传入时需拼接%,否则jpa无法知道需要左模糊、右模糊还是左右模糊。例如参数:"%name%"
无法解决的问题:
1.实体类的属性名与表的字段名无法映射,导致关键字找不到(实体类的属性名中使用了大写字母,会映射成下划线,导致数据库找不到对应字段)
2.CURD操作方式比较另类
3.涉及到多表操作
注意事项:
1.手写SQL语句,使用@Query注解,不局限于查询操作,增删改查都可以使用这个注解
2.如果是删改操作,需要加@Modifying和@Transactional注解
3.默认是HQL语句,不能使用select *,如果要使用SQL语句,需在@Query注解加上nativeQuery = true的属性
4.传参方式一:使用?+数字的方式,数字从1开始,代表第几个参数
5.传参方式二:使用:+参数名的方式,这种方式最好配合@Param注解一起使用
6.HQL语句中的table name,要写成实体类名,不能写实际的表名
7.使用like模糊查询,需在参数传入时需拼接%,或者SQL语句中拼接%,否则jpa无法知道需要左模糊、右模糊还是左右模糊。例如参数:"%name%",或SQL:like %:name%
8.spel表达式:传入参数为实体类对象(@Param("user") User user),SQL中获取实体类对象的属性值时,使用spel表达式:(where name=:#{#user.name}),
使用数据接口:构建一个数据接口,里面的抽象方法就是SQL语句的查询结果的字段对应的getXXX的抽象方法
注意事项:使用数据接口来接收查询结果字段,必须为要查询的字段名起别名,否则无法会无法取到
使用集合(推荐):直接使用List/Map等集合嵌套的方式来获取到接收数据
使用VO(View Object):单独构建一个跟页面展示数据对应的VO实体类来接收数据
1、IDEA连接mysql数据库(url就写properties配置的url)
2、Project Structure,Modules,选中对应的项目,点+加号add,添加jpa,选中项目下面刚添加的jpa,Descriptors窗口中点击右边栏+加号,选第一个persistence.xml,OK
3、打开IDEA左边栏Persistence窗口,选择对应的项目右击,Generate Persistence Mapping,By Database Schema,数据源选之前创建的mysql连接,包路径选项目entity目录,
前缀和后缀不写,选择对应的数据库表,OK
4、查看项目entity目录,数据库表对应的实体类已生成。@Column name有红色波浪线错误,可忽视,也可点击Assign Data Source,选择关联的mysql数据源即可。
1、查询结果为单张表对应的实体对象:直接在SQL语句中关联多表查询,返回对象为实体类即可
2、使用数据接口接收多表查询结果:定义接口类,定义查询结果字段对应的get抽象方法,使用接口类或List<接口类>泛型来接收查询结果,SQL语句查询字段起别名:select u.name as uname, b.id as bid from...
3、使用简单集合List
QueryDSL:是一个通用的查询框架,专注于通过JavaAPI构建类型安全的Sql查询,也可以说QueryDSL是基于各种ORM框架以及Sql之上的一个通用的查询框架,QueryDSL的查询类似于SQL查询,很全面只不过一个是用SQL一个是用代码来代替SQL。
建议:单表或简单的多表操作,都不推荐使用QueryDSL,使用JPA自带API简洁又效率,但是涉及太复杂的查询,推荐使用QueryDSL。
QueryDSL的使用:构造器的方式:queryFactory.select(xx,xx).from(xx,xx).where(BooleanBuilder).fetchResults();
优点:复杂的多表查询能让结构清晰效率提高
缺点:单表以及简单的多表查询没有JPA简单及效率高
参考资料:http://www.querydsl.com/static/querydsl/latest/reference/html