引言
在springboot 项目中,我们使用ORM 框架来操作数据库变的非常方便。下面我们分别整合mysql ,spring data jpa 以及redis 。让我们感受下快车道。
我们首先创建一个springboot 项目,创建好之后,我们来一步步的实践。
使用mybatis
引入依赖:
org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1
增加配置
application.properties 中增加连接数据库的配置。
# Mysql数据库连接配置 : com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falsespring.datasource.username=rootspring.datasource.password=123456
创建sql
接下来,我们创建sql 语句。方便我们后面测试吧。
# 创建数据库 CREATE DATABASE springbootdata; # 选择使用数据库 USE springbootdata; # 创建表t_article并插入相关数据 DROP TABLE IF EXISTS t_article; CREATE TABLE t_article ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '文章id', title varchar(200) DEFAULT NULL COMMENT '文章标题', content longtext COMMENT '文章内容', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; INSERT INTO t_article VALUES ('1', 'Spring Boot基础入门', '从入门到精通讲解...'); INSERT INTO t_article VALUES ('2', 'Spring Cloud基础入门', '从入门到精通讲解...'); # 创建表t_comment并插入相关数据 DROP TABLE IF EXISTS t_comment; CREATE TABLE t_comment ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '评论id', content longtext COMMENT '评论内容', author varchar(200) DEFAULT NULL COMMENT '评论作者', a_id int(20) DEFAULT NULL COMMENT '关联的文章id', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO t_comment VALUES ('1', '很全、很详细', 'luccy', '1'); INSERT INTO t_comment VALUES ('2', '赞一个', 'tom', '1'); INSERT INTO t_comment VALUES ('3', '很详细', 'eric', '1'); INSERT INTO t_comment VALUES ('4', '很好,非常详细', '张三', '1'); INSERT INTO t_comment VALUES ('5', '很不错', '李四', '2');
创建实体
再接下来,我们需要创建 一个实体类,我们就创建一个 t_comment 表对应的实体类吧。
public class Comment { private Integer id; //评论id private String content; //评论内容 private String author; //评论作者 private Integer aId; //外键:表示当前这条评论是属于那篇文章 //getter()/setter()
创建mapper
上面都做好后,我们当然是来创建一个mapper 接口,来操作数据库啦,这里我们来一个最简单的,使用注解的方式。
//标识该接口是mybatis的接口文件,并且让springboot能够扫描到该接口,生成该接口的代理对象,存到容器中@Mapperpublic interface CommentMapper { //根据id查询对应评论信息 @Select("select * from t_comment where id = #{id}") Comment findById(Integer id);}
创建测试
上面这样其实就已经完成了springboot 与mybatis 的整合,我们接下来测试一下。
在pom.xml 文件中引入:
org.springframework.boot spring-boot-starter-test test junit junit test org.junit.platform junit-platform-launcher test
在测试类中编写:
@RunWith(SpringRunner.class)@SpringBootTestclass SpringbootQuickstartApplicationTests { @Autowired private CommentMapper commentMapper; @Test void contextLoads() { Comment comment = commentMapper.findById(1); System.out.println(comment); }}
效果:
证明整合mybatis 是成功的。是不是很简单,只用引入一个starter 就可以正常使用mybatis 的功能。
基于xml 方式
上面的是基于注解的,我们也可以基于xml。我们在mapper 中不写sql ,而放到xml 中编写。这里 ArticleMapper 为例
@Mapperpublic interface ArticleMapper { //根据id查询对应的文章 public Article selectArticle(Integer id);}
对应的xml 文件:
<?xml version="1.0" encoding="UTF-8" ?>/span> "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> select * from t_article where id = #{id}
这里我们需要在配置文件中指定我们mapper.xml 的位置,如果不指定,就需要和mapper 同目录才行。resultType 可以在配置文件中指定别名。
#开启驼峰命名匹配映射mappermybatis.configuration.map-underscore-to-camel-case=true#配置mybatis的xml映射配置文件路径mybatis.mapper-locations=classpath:mapper/*.xml#配置mybatis映射配置文件中实体类别名mybatis.type-aliases-package=cn.quellanan.springbootquickstart.pojo
我们再写个测试方法测试下。
@Autowired private ArticleMapper articleMapper; @Test public void selectArticle(){ Article article = articleMapper.selectArticle(1); System.out.println(article); }
image-20200617155958167
这样springboot 整合mybatis 基本的就ok 啦。
使用jpa
上面我们springboot整个mybatis 需要自己写sql ,接下来我们偷偷懒,整合一下springData JPA。之前说过,springboot data jpa 是一种规范,必须使用实现这种规范的框架,所以前面用了 hibernate 。但是在springboot 中就不用这么麻烦啦,也不用引入 hibernate 相关的jar .我们也可以使用。下面我们来看看。
引入依赖
第一步还是需要在pom 文件中引入依赖。
org.springframework.boot spring-boot-starter-data-jpa
建立实体类和表的关系
引入依赖后,我们需要将实体类和表以及表属性建立联系。我们还是以 Comment 这个类。进行修改。
@Entity@Table(name = "t_comment")public class Comment { @Id //表明映射主键id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; //评论id private String content; //评论内容 private String author; //评论作者 @Column(name = "a_id") private Integer aId; //外键:表示当前这条评论是属于那篇文章 //getter()/setter()}
- 首先需要 @Entity 标识这个实体类,可以被处理
- @Table() 注解指定数据库对应的表名
- @Id 用来指定表的主键。
- @GeneratedValue() 用来指定主键的类型
- @Column 用来指定这个属性对应的表的列名,如果类属性和表列名一致可不指定,不一致就需要指定。
创建一个接口
我们接下来创建一个接口来使用它,继承JpaRepository 。有两个参数,第一个参数是是对应的实体类对象,第二个参数主键数据类型。
public interface CommentRepository extends JpaRepository {}
测试
接下来,我们就可以进行测试啦
@Autowired private CommentRepository commentRepository; @Test public void selectComment(){ Optional byId = commentRepository.findById(1); System.out.println(byId.get()); }
所以如果不想使用mybatis ,那springboot 整合jpa 也是一种不错的选择。
使用redis
上面不管是mybatis 还是 springdatajpa 都是基于关系型数据库操作的,我们上面操作的就是mysql 数据库。现在redis 也经常在项目中使用,那springboot 整合使用redis 也很方便。
引入依赖
一样的,我们首先需要引入依赖。
org.springframework.boot spring-boot-starter-data-redis
配置redis 连接信息
在application.propertis 中增加redis 的相关配置
#redis服务器地址spring.redis.host=127.0.0.1#redis服务器连接端口spring.redis.port=6379#redis服务器连接密码spring.redis.password=
其实到现在,我们就已经整合好了,可以在项目中操作redis 数据库啦。
我们来写一个测试方法,分别是插入和查找。
@Autowired private StringRedisTemplate redisTemplate; @Test public void insert(){ redisTemplate.opsForValue().set("quellanan","程序员爱酸奶"); } @Test public void select(){ String quellanan = redisTemplate.opsForValue().get("quellanan"); System.out.println(quellanan); }
可以看到我们直接用的 StringRedisTemplate 。这个就相当于 JdbcTemplate 操作数据库一样。兄弟们现在明白了吧,相当于是没有使用mybatis 或者jpa 这些框架,而是简单粗暴的操作数据库了。
现在很多公司使用数据库也是直接使用 StringRedisTemplate 或者 RedisTemplate 来操作的redis 的数据库的,因为基于redis 的持久层框架还不流行。当然我们也可以使用,接下来我们来点骚的。
创建一个实体类。
@RedisHash(value = "persons") //指定实体类对象在redis中的存储空间public class Person { @Id // 用来标识实体类主键 字符串形式的hashkey标识唯一的实体类对象id private String id; @Indexed // 用来标识对应属性在redis中生成二级索引 private String firstname; @Indexed private String lastname; private Address address;}
- @RedisHash 用来指定类的储存类型,这里使用的的是RedisHash 表示在数据库中使用hash 存储。值得注意的是只有@RedisHash 这个注解来作用于实体类上,这个persons 更像是文件夹,key 的前缀。
- @Id 表明主键,其实就是redis 中hash 结构的和前缀组成 key
- @Indexed,用来标识redis 数据库生成二级索引,方便条件查询,一样的和前缀以及属性名组成key。
创建一个接口。
这里继承的是CrudRepository 。并且也是基于jpa 范式的,感兴趣的可以试试。
public interface PersonRepository extends CrudRepository { // 根据城市信息查询对应的人 List findByAddress_City(String name);}
测试方法。
我们接下来,写一个测试方法。
@Autowired private PersonRepository personRepository; @Test public void savePerson(){ Person person = new Person(); person.setFirstname("张"); person.setLastname("三"); Address address = new Address(); address.setCity("北京"); address.setCountry("中国"); person.setAddress(address); // 向redis数据库中添加了数据 personRepository.save(person); } @Test public void selectPerson(){ List list = personRepository.findByAddress_City("北京"); for (Person person : list) { System.out.println(person); } }
image-20200617170016290
我们再看看redis 数据库。
image-20200617170128929
我们在来看下。这些key 都是什么类型存储的。除了key 为persons:916b5570-5c7f-4a96-b25f-98c9a2f1f43e 是hash 其他的都是set
image-20200617172445543
说明我们创建的索引,都是使用set 来存储的,并且这些索引只是存放了一个key 值,也就是我们真正存数据的地方。
而 persons:916b5570-5c7f-4a96-b25f-98c9a2f1f43e:idx 存放的是其他索引的key .
image-20200617172723012
这样我们也可以通过jpa 这种操作特别是比较负责的对象,我们也能很好的处理啦。
总结
到这就结束啦,知道在springboot 中怎么是用mybatis,spring data jpa,redis 就可以啦。