使 用 Docker 安 装 MySQL
Mybatis插件
MybatisPlus的入门
搭建后台服务系统
实现新增房源服务
前后端进行整合,实现新增房源功能
1、使用Docker安装MySQL
好客租房项目的底层数据库采用MySQL,而MySQL采用衍生版本Percona,并且采用docker容器化的方式进行部 署。
1.1、什么是percona?
Percona 为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升。该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。
Percona Server 只包含 MySQL 的服务器版,并没有提供相应对 MySQL 的 Connector 和 GUI 工具进行改进。
Percona Server 使用了一些 google-mysql-tools, Proven Scaling, Open Query 对 MySQL 进行改造。官网:https://www.percona.com/software/mysql-database
1.2、安装部署
docker run --privileged=true -itd --name percona -v /data/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
无法启动容器时的错误:
Initializing database
mysqld: Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)
2020-03-06T04:39:22.601021Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-03-06T04:39:22.602808Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting.
2020-03-06T04:39:22.602826Z 0 [ERROR] Aborting
解决办法:
给映射的宿主机文件进行权限更改:
[root@VM_0_4_centos data]# chmod 777 mysql-data
测试:
在后台系统服务的开发过程中,必然要和数据库进行交互,在本套课程中,ORM这一层的技术选型,我们采用
Mybatis框架作为持久层框架,原因是Mybatis对SQL语句编写更加的灵活。
为了提升开发的效率,所以选用MybatisPlus作为mybatis的插件,以提升开发的效率。下面我们来学习下
MybatisPlus插件的使用。
2.1、简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2.2、特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD
操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
支持关键词自动转义:支持数据库关键词(order、key )自动转义,还可自定义关键词
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通
List 查询
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
2.3、架构
2.4、快速入门
2.4.1、创建表
首先,创建数据库:haoke:
2.4.2、创建工程以及导入依赖
导入依赖:
2.4.3、编写application.properties文件
2.4.4、创建User对象
2.4.5、编写UserMapper
2.4.6、编写SpringBoot启动类
2.4.7、编写单元测试用例
测试结果:
可以看到,通过简单的一些代码的编写即可实现数据的查询操作。
2.5、BaseMapper
在MybatisPlus中,BaseMapper中定义了一些常用的CRUD方法,当我们自定义的Mapper接口继承BaseMapper 后即可拥有了这些方法。
需要说明的是:这些方法仅适合单表操作。
2.5.1、like查询
2.5.2、条件查询
更多查看:http://mp.baomidou.com/guide/wrapper.html#abstractwrapper
2.5.3、插入数据
设置自增长id:
2.5.4、删除数据
2.5.5、修改数据
根据id修改数据,修改不为null的字段。
2.5.6、分页查询
首先需要配置分页插件:
下面进行查询:
2.6、配置
虽然在MybatisPlus中可以实现零配置,但是有些时候需要我们自定义一些配置,就需要使用Mybatis原生的一些配 置文件方式了。
application.properties:
更多配置:http://mp.baomidou.com/guide/config.html#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE
2.7、Lombok
lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,尤其是针对pojo,在
MybatisPlus中使用lombox。
官网:https://projectlombok.org/
2.7.1、配置安装
导入依赖:
安装IDEA插件:
如果不安装插件,程序可以正常执行,但是看不到生成的一些代码,如:get、set方法。
2.7.2、常用注解
@Data:注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、
hashCode 、 toString 方 法@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Slf4j:注解在类上;为类提供一个 属性名为log 的 slf4j日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
@Builder:使用Builder模式构建对象
测试一:使用@Data注解
是不是很神奇?!
测试二:使用@Slf4j注解
运行结果:
测试三:@AllArgsConstructor注解的使用
测试四:@Builder
测试结果:
2.7.3、使用lombok改造User对象
将前面测试的User对象进行改造。
后台服务系统采用SOA的架构思想,使用dubbo作为服务治理框架进行搭建。 后台服务系统架构:
工程结构:
3.1、创建itcast-haoke-manage工程
pom.xml文件:
3.2、创建itcast-haoke-manage-api-server工程
3.3、创建itcast-haoke-manage-dubbo-server工程
4、新增房源服务
接下来,我们实现新增房源功能。
4.1、数据结构
tb_estate(楼盘表):
1CREATE TABLE `tb_estate` (
2`id` bigint(20) NOT NULL AUTO_INCREMENT,
3`name` varchar(100) DEFAULT NULL COMMENT '楼盘名称',
4`province` varchar(10) DEFAULT NULL COMMENT '所在省',
5`city` varchar(10) DEFAULT NULL COMMENT '所在市',
6`area` varchar(10) DEFAULT NULL COMMENT '所在区',
7`address` varchar(100) DEFAULT NULL COMMENT '具体地址',
8`year` varchar(10) DEFAULT NULL COMMENT '建筑年代',
9`type` varchar(10) DEFAULT NULL COMMENT '建筑类型',
10`property_cost` varchar(10) DEFAULT NULL COMMENT '物业费',
11`property_company` varchar(20) DEFAULT NULL COMMENT '物业公司',
12`developers` varchar(20) DEFAULT NULL COMMENT '开发商',
13`created` datetime DEFAULT NULL COMMENT '创建时间',
14`updated` datetime DEFAULT NULL COMMENT '更新时间',
15PRIMARY KEY (`id`)
16) ENGINE=InnoDB AUTO_INCREMENT=1006 DEFAULT CHARSET=utf8 COMMENT='楼盘表'; 17
18--初始数据
19INSERT INTO `tb_estate` (`id`, `name`, `province`, `city`, `area`, `address`,
`year`, `type`, `property_cost`, `property_company`, `developers`, `created`,
`updated`) VALUES ('1001', '中远两湾城', '上海市', '上海市', '普陀区', '远景路97弄',
'2001', '塔楼/板楼', '1.5', '上海中远物业管理发展有限公司', '上海万业企业股份有限公司', '2018-
11-06 23:00:20', '2018-11-06 23:00:23');
20INSERT INTO `tb_estate` (`id`, `name`, `province`, `city`, `area`, `address`,
`year`, `type`, `property_cost`, `property_company`, `developers`, `created`,
`updated`) VALUES ('1002', '上海康城', '上海市', '上海市', '闵行区', '莘松路958弄',
'2001', '塔楼/板楼', '1.5', '盛孚物业', '闵行房地产', '2018-11-06 23:02:30', '2018-11-27
23:02:33')
21INSERT INTO `tb_estate` (`id`, `name`, `province`, `city`, `area`, `address`,
`year`, `type`, `property_cost`, `property_company`, `developers`, `created`,
`updated`) VALUES ('1003', '保利西子湾', '上海市', '上海市', '松江区', '广富林路1188弄',
'2008', '塔楼/板楼', '1.75', '上海保利物业管理', '上海城乾房地产开发有限公司', '2018-11-06
23:04:22', '2018-11-06 23:04:25');
22INSERT INTO `tb_estate` (`id`, `name`, `province`, `city`, `area`, `address`,
`year`, `type`, `property_cost`, `property_company`, `developers`, `created`,
`updated`) VALUES ('1004', '万科城市花园', '上海市', '上海市', '松江区', '广富林路1188弄',
'2002', '塔楼/板楼', '1.5', '上海保利物业管理', '上海城乾房地产开发有限公司', '2018-11-13
16:43:40', '2018-11-13 16:43:42');
23INSERT INTO `tb_estate` (`id`, `name`, `province`, `city`, `area`, `address`,
`year`, `type`, `property_cost`, `property_company`, `developers`, `created`,
`updated`) VALUES ('1005', '上海阳城', '上海市', '上海市', '闵行区', '罗锦路888弄',
'2002', '塔楼/板楼', '1.5', '上海莲阳物业管理有限公司', '上海莲城房地产开发有限公司', '2018-
11-06 23:23:52', '2018-11-06 23:23:55');
tb_house_resources(房源表):
1CREATE TABLE `tb_house_resources` (
2`id` bigint(20) NOT NULL AUTO_INCREMENT,
3`title` varchar(100) DEFAULT NULL COMMENT '房源标题',
4`estate_id` bigint(20) DEFAULT NULL COMMENT '楼盘id',
5`building_num` varchar(5) DEFAULT NULL COMMENT '楼号(栋)',
6`building_unit` varchar(5) DEFAULT NULL COMMENT '单元号',
7`building_floor_num` varchar(5) DEFAULT NULL COMMENT '门牌号',
8`rent` int(10) DEFAULT NULL COMMENT '租金',
9`rent_method` tinyint(1) DEFAULT NULL COMMENT '租赁方式,1-整租,2-合租',
10`payment_method` tinyint(1) DEFAULT NULL COMMENT '支付方式,1-付一押一,2-付三押一,3-
付六押一,4-年付押一,5-其它',
11`house_type` varchar(255) DEFAULT NULL COMMENT '户型,如:2室1厅1卫',
12`covered_area` varchar(10) DEFAULT NULL COMMENT '建筑面积',
13`use_area` varchar(10) DEFAULT NULL COMMENT '使用面积',
14`floor` varchar(10) DEFAULT NULL COMMENT '楼层,如:8/26',
15`orientation` varchar(2) DEFAULT NULL COMMENT '朝向:东、南、西、北',
16`decoration` tinyint(1) DEFAULT NULL COMMENT '装修,1-精装,2-简装,3-毛坯',
17`facilities` varchar(50) DEFAULT NULL COMMENT '配套设施, 如:1,2,3',
18`pic` varchar(200) DEFAULT NULL COMMENT '图片,最多5张',
19`house_desc` varchar(200) DEFAULT NULL COMMENT '描述',
20`contact` varchar(10) DEFAULT NULL COMMENT '联系人',
21`mobile` varchar(11) DEFAULT NULL COMMENT '手机号',
22 `time` tinyint(1) DEFAULT NULL COMMENT '看房时间,1-上午,2-中午,3-下午,4-晚上,5-全天',
23`property_cost` varchar(10) DEFAULT NULL COMMENT '物业费',
24`created` datetime DEFAULT NULL,
25`updated` datetime DEFAULT NULL,
26PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='房源表';
4.2、创建itcast-haoke-manage-dubbo-server-house-resources工程
itcast-haoke-manage-dubbo-server-house-resources-dubbo-interface
对外提供的sdk包
只提供pojo实体以及接口,不提供实现类
itcast-haoke-manage-dubbo-server-house-resources-dubbo-service
具体实现
pom.xml文件:
4.3、创建子工程
4.3.1、itcast-haoke-manage-dubbo-server-house-resources-dubbo-interface
pom.xml:
4.3.2、itcast-haoke-manage-dubbo-server-house-resources-dubbo-service
4.4、编写BasePojo文件
编写BasePojo,所有的pojo类都要继承该类,在该类中定义了created、updated字段,表明在每一个表中都需要 有这2个字段。
4.5、使用MybatisPlus的AutoGenerator插件生成代码文件
4.5.1、创建itcast-haoke-manage-dubbo-server-generator工程
pom.xml文件:
4.5.2、编写CodeGenerator
代码参考官方提供代码实现。
4.5.3、运行代码
生成的结果如下:
可以看到,自动生成了controller、entity、mapper、service等内容。其实,一般只需要entity就可以了,也就是pojo类。
生成的类是这样的:
@EqualsAndHashCode(callSuper = true)
这个是自动生成equals和hashCode方法,我们一般不需要,所以将该注解去掉
@Accessors(chain = true)
这个是表示,生成的set方法将采用链式编程方式,建议保留。
4.5.4、将整理到pojo文件并且拷贝到工程
将整理的pojo文件拷贝到itcast-haoke-manage-dubbo-server-house-resources-dubbo-interface工程中。
4.6、定义新增房源的dubbo服务
在itcast-haoke-manage-dubbo-server-house-resources-dubbo-interface工程。
4.7、实现新增房源服务
4.7.1、编写application.properties配置文件
4.7.2、编写HouseResourcesMapper接口
编写MybatisPlus配置类:
4.7.3、编写service
这里编写的Service是Spring的service,不是dubbo服务,因为需要控制事务以及一些逻辑。
先定义接口:
编写BaseService实现:
具体实现类:
4.7.4、实现dubbo服务
4.8、编写启动类
4.9、进行测试
可以看到,已经有服务注册到了注册中心。
5、实现RESTful接口
itcast-haoke-manage-api-server工程是,为前端系统提供接口服务,是dubbo服务的消费方。
5.1、添加依赖
因为是dubbo的服务方,需要添加dubbo提供方提供的接口、pojo的依赖。
5.2、编写service
HouseResourcesService用于调用dubbo服务。
5.3、编写controller
5.4、编写启动类
5.5、编写application.properties配置文件
5.6、运行启动服务
运行即可启动tomcat服务,进行测试:
结果:
测试数据:
下面,可以整合前端进行开发了。
6、整合前端系统
6.1、增加房源标题
之前的前端页面实现中,缺少了标题一项,现补上。
效果:
6.2、增加model
form.js文件:
haoke.js,用于请求服务并且处理业务逻辑。
6.4、修改表单提交地址
AddResource.js:
6.5、通过反向代理解决跨域问题
由于我们前端系统和后台服务系统的端口不同,会导致跨域问题,我们通过umi提供的反向代理功能解决这个问 题。
配置地址:https://umijs.org/zh/config/#proxy 在config.js中进行配置proxy:
配置代理后,以/haoke开头的请求,就会被代理。代理效果是这样的:
请 求 :http://localhost:8000/haoke/house/resources 实际:http://127.0.0.1:18080/house/resources
6.6、测试