orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sql的mybatis,两者各有特点,在企业级系统开发中可以根据需求灵活使用。发现一个有趣的现象:传统企业大都喜欢使用hibernate,互联网行业通常使用mybatis。
hibernate特点就是所有的sql都用Java代码来生成,不用跳出程序去写(看)sql,有着编程的完整性,发展到最顶端就是spring data jpa这种模式了,基本上根据方法名就可以生成对应的sql了
mybatis初期使用比较麻烦,需要各种配置文件、实体类、dao层映射关联、还有一大推其它配置。当然mybatis也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和dao层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理dao层和配置文件等,发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-starter就是springboot+mybatis可以完全注解不用配置文件,也可以简单配置轻松上手。
一、Mybatis
mybatis初期使用比较麻烦,需要各种配置文件、实体类、dao层映射关联、还有一大推其它配置。
当然mybatis也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和dao层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理dao层和配置文件等。
发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-starter就是springboot+mybatis可以完全注解不用配置文件,也可以简单配置轻松上手。
mybatis-spring-boot-starter
官方说明:MyBatis Spring-Boot-Starter will help you use MyBatis with Spring Boot
其实就是myBatis看springboot这么火热也开发出一套解决方案来,使用起来确实顺畅了许多。mybatis-spring-boot-starter主要有两种解决方案,一种是使用注解解决一切问题,一种是简化后的老传统。
1、无配置文件,全部使用注解方式
创建项目,引入包:
1 |
|
创建配置文件,写入配置信息:
1 | mybatis.type-aliases-package=com.hu.pojo |
Mapper接口:
1 | package com.hu.mapper; |
实体类:
1 | package com.hu.pojo; |
测试类:
1 | import com.hu.AppData; |
结果:
1 | [User{id=1, name='张三丰', passWord='111111', userName='zhangsanfeng', age=80}, User{id=2, name='胡一刀', passWord='111111', userName='111111', age=22}] |
2、可以增加一点xml配置信息
比如在spring配置中增加mybatis配置信息,把sql代码写在xml中
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
二、Redis
Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。
1、缓存的作用
创建项目,上代码:
1 |
|
配置:
1 | # Redis数据库索引(默认为0) |
Redis配置类:
1 | package com.hu; |
实体类:
1 | package com.hu; |
入口:
1 |
|
测试:
1 | package com.hu; |
测试结果:
1 | test方法: |
刚开始由于没写实体类无参构造方法,导致抛这个异常:
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Can not construct instance of com.hu.User: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
2、实现共享Session
引入依赖
1 | <dependency> |
添加SessionConfig
1 | /** |
Controller中添加一个方法:
1 | "/uid") ( |
运行,浏览器输入http://localhost:8080/uid
查看Redis中也有数据
访问session返回还是一样的session
这是一种使用session最基本方式。
3、总结使用redis过程
添加依赖
1 | <dependency> |
application.properties中加入redis相关配置后,增加redis配置类。
其实可以不用配置,直接使用RedisTemplate,源码如下:
1 |
|
通过源码得到,SpringBoot自动在容器中生成了一个RedisTemplate和一个StringRedisTemplate。但是,这个RedisTemplate的泛型是<Object,Object>,并且没有序列化。RedisTemplate的泛型是<Object,Object>,为了方便还创建了一个泛型为<String,Object>形式的RedisTemplate。
@ConditionalOnMissingBean注解,说明如果Spring容器中有了RedisTemplate对象了,这个自动配置的RedisTemplate不会实例化。因此我们可以直接自己写个配置类,配置RedisTemplate。
1 | package com.hu.redis; |
接下来就可以直接用RedisTemplate操作Redis,封装成为一个工具类如下:
1 | package com.hu.redis; |
之后就可以根据实际需要来操作Redis
三、JPA
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。
JPA是一套规范,不是一套产品,如果某个产品这个JPA规范,叫JPA的实现。
Data JPA 是 spring data 项目下的一个模块,是Spring 基于 ORM 框架。提供了一套基于 JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA 来实现的。
spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现。
基本查询也分为两种,一种是spring data默认已经实现,一种是根据查询的方法来自动解析成SQL。
如何使用JPA
查询
1 | 查询所有数据 findAll() |
引入配置:
注意jpa和mysql包顺序,之前由于顺序反过来,启动时候报异常:IllegalArgumentException: At least one JPA metamodel must be present
1 |
|
配置文件:
1 | ######################################################## |
Repository:
1 | package com.hu.dao; |
也可以直接在这个接口中写对应需要的方法,如下;
1 |
|
入口:
1 |
|
测试:
1 | .class) (SpringRunner |
结果:
1 | 2019-04-15 09:36:37.101 INFO 34776 --- [ main] com.hu.test.Test : Started Test in 4.964 seconds (JVM running for 5.792) |
测试完全没问题,都不用建表,jpa帮我们自动建立表格。
问题:
1 | 检查一下包是否引入正确,引入一下: |