数据库访问中间件

目录

一、ORM

二、Mybatis

1、Mybatis了解

2、springboot整合Mybatis

3、springboot整合Mybatis和Rest    

三、JPA

4、SpringData JPA 简介及入门

5、SpringData JPA 基本使用


一、ORM

    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

1、Mybatis了解

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<T>:负责jdbcType与javaType之间的数据转换(1、对Statement对象设置特定的参数    2、对Statement返回的结果集ResultSet,取出特定的列)

2、springboot整合Mybatis

    基于配置:MySQL配置(datasource)、Mybatis全局配置(mybatis-config.xml)、Mybatis映射文件配置(mapper/*.xml)、实体类的别名配置(即实体类包路径 mybatis.type-aliases-package)
    基于注解:@Select

3、springboot整合Mybatis和Rest    

    @MapperScan("映射接口包路径"):用于扫描Mapper映射
    @Resource:表明注入的接口操作数据库
    ModelMap:用于添加返回前端的响应参数
    @Select(查询SQL)
    @Results({@Result(property="Java对象关联的属性名",column="关联的数据库字段名",many=@Many(select="映射的查询接口的包名.接口名.方法名"))})
    @Many:一对多

三、JPA

4、SpringData JPA 简介及入门

SpringData:
        为了简化构建基于spring框架应用的数据访问技术。包括对关系数据库、非关系数据库、Map-Reduce框架、云数据服务等访问支持。
        提供了统一的API标准来实现对数据访问层的操作。这套标准包含了CRUD(增删改查)、排序和分页的相关操作。
    
SpringData特点:
        支持对象关系映射:具备ORM框架的对象关系映射功能
        统一的Repository接口:Repository<T,ID extends Serializable>:统一接口、CrudRepository<T,ID>:基本CRUD操作、PagingAndSortingRepository<T,ID>:基本排序及分页
        统一的数据访问模板类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(通过构造器来构造对象)

5、SpringData JPA 基本使用

  • 单表SQL操作-使用关键字拼凑方法

        注意事项:
            1.实体类属性名不要出现isXxx、getXxx的名称,会导致关键字拼凑出错
            2.实体类属性名中间如果有大写字母,会导致数据库的字段名有下划线隔开。比如属性名:isMarried,映射到数据库会变成:is_married,导致无法对应
            3.实体类属性名类型为Boolean类型,在某些数据库中会变成bit(1)类型,默认为0,其中0为false,1为true
            4.使用like模糊查询,需在参数传入时需拼接%,否则jpa无法知道需要左模糊、右模糊还是左右模糊。例如参数:"%name%"
        无法解决的问题:
            1.实体类的属性名与表的字段名无法映射,导致关键字找不到(实体类的属性名中使用了大写字母,会映射成下划线,导致数据库找不到对应字段)
            2.CURD操作方式比较另类
            3.涉及到多表操作

  • 单表SQL操作-使用注解手写SQL语句(SQL、HQL)

        注意事项:
            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实体类来接收数据

  • JPA逆向工程操作:通过表生成实体类

        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<Object>来接收查询结果作为查询方法的响应
        4、使用嵌套集合List<Map<String,Object>>来接收查询结果(推荐)

  • 多表复杂查询的又一种方式-QueryDSL

    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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章