spring boot + dubbo + zookeeper + mybatis 初级项目搭建

spring boot + dubbo + zookeeper + mybatis 初级项目搭建

准备资料 :
  1. zookeeper , 可以从https://zookeeper.apache.org/releases.html#download 下载
  2. dubbo-admin-2.6.0 : 用于监控分布式的可视化界面
开发工具
  1. IntelliJ IDEA : 可以直接创建spring boot 项目, 不用手动导入spring boot 依赖

1. springboot + dubbo + zookeeper 三者结合搭建分布式服务

1. 新建父项目, 用于 引入公用的 依赖

dubbo + zookeeper

 <!--dubbo + zookeeper-->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>

2. 在父类项目下新建 Module dubbo-bean, 用于 存放公用的数据对象

3. 在父类项目下新建 Module dubbo-api, 用于 存放公用的接口

在 pom 文件中导入 dubbo-bean 依赖

4. 在父类项目下新建 Module dubbo-server, 作为服务的 提供者(spring boot 项目)

在 pom 文件中导入 dubbo-bean , dubbo-api 依赖
在 properties 文件中配置 dubbo 服务提供者的一些信息

## 同一台机器避免端口冲突
server.port=8088
## Dubbo 服务提供者配置
#--服务名称
spring.dubbo.application.name=provider
#-- 注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#-- dubbo 协议
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#--声明需要暴露的服务接口(实现类, 会自动寻找上层接口)
spring.dubbo.scan=club.springboot.dubbo.dubboserver.service

5. 在父类项目下新建 Module dubbo-client, 作为服务的 消费者(spring boot + web)

在 pom 文件中导入 dubbo-bean , dubbo-api 依赖
在properties 文件中 配置doubbo 消费者 的信息

## 同一台机器避免端口冲突
server.port=8889
# application name
spring.dubbo.application.name=consumer
# zookeeper 注册中心
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
# 扫描注解的位置(注入注解的位置)(不建议直接把 服务注入 controller 层)
spring.dubbo.scan=club.springboot.dubbo.dubboclient.controller

6. 最终的项目结构

这里写图片描述

2. 添加mybatis(dubbo-server)(使用注解)

1. 在 dubbo-server中添加依赖

pom.xml

 <!--jdbc-->
 <dependency>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jdbc</artifactId>
 </dependency>
 <!-- mybatis -->
 <dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>1.3.2</version>
 </dependency>
 <!-- 数据库连接驱动 -->
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <scope>runtime</scope>
 </dependency>
 <!--alibaba druid 数据库连接池-->
 <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid-spring-boot-starter</artifactId>
     <version>1.1.10</version>
 </dependency>

2 在 properties 文件中配置连接属性


spring.datasource.name=local
spring.datasource.url=jdbc:mysql://localhost:3306/myblog
spring.datasource.username=root
spring.datasource.password=123654
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#druid 数据源配置
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.filters=stat
spring.datasource.druid.max-active=20
spring.datasource.druid.initial-size=1
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.test-while-idle=true
#数据库连接测试时使用
spring.datasource.druid.validation-query=select 'x'
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20

# mybaits 配置
#实体类路径
mybatis.type-aliases-package=club.springboot.dubbo.po

#mapper文件映射位置(映射文件 和 @mapper 注解只能存在一个, 因为我们使用注解方式, 所以 这里暂时先注掉)
#mybatis.mapper-locations=classpath:mapping/*.xml

### 以下配置凭需求自定义设置

## 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存 默认为true
mybatis.configuration.cache-enabled=true

## 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认是false
mybatis.configuration.lazy-loading-enabled=true

## 是否允许单一语句返回多结果集(需要兼容驱动)默认为true
mybatis.configuration.multiple-result-sets-enabled=true

## 使用列标签代替列名。不同的驱动在这方面会有不同的表现 默认为 true
mybatis.configuration.use-column-label=true

## 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键. 默认为 false
mybatis.configuration.use-generated-keys=false

## 指定 MyBatis 应如何自动映射列到字段或属性。
## NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。
## 默认为 PARTIAL
mybatis.configuration.auto-mapping-behavior=partial

## 指定发现自动映射目标未知列(或者未知属性类型)的行为。
## NONE=不做任何反应
## WARNING=输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN)
## FAILING=映射失败 (抛出 SqlSessionException)
## 默认为 NONE
mybatis.configuration.auto-mapping-unknown-column-behavior=warning

## 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新
## 默认为 SIMPLE
mybatis.configuration.default-executor-type=simple

## 设置超时时间,它决定驱动等待数据库响应的秒数
mybatis.configuration.default-statement-timeout=25

## 为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。
mybatis.configuration.default-fetch-size=100

## 允许再嵌套语句中使用分页, 如果允许使用false
mybatis.configuration.safe-row-bounds-enabled=false

## 是否开启驼峰命名规则, 即从 a_cloumn => aCloumn 默认为false
mybatis.configuration.map-underscore-to-camel-case=true

## MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。
## 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。
## 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。
mybatis.configuration.local-cache-scope=session

## 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。
## 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。
mybatis.configuration.jdbc-type-for-null=other

## 指定哪个对象的方法触发一次延迟加载
mybatis.configuration.lazy-load-trigger-methods=equals,clone,hashcode,toString

## 指定动态 SQL 生成的默认语言
#    mybatis.configuration.default-scripting-language=org.apache.ibatis.scripting.xmltags.XMLLanguageDriver

## 指定 Enum 使用的默认 TypeHandler 。 (从3.4.5开始)
#    mybatis.configuration.default-enum-type-handler=org.apache.ibatis.type.ArrayTypeHandler

## 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,
## 这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的
## 默认为 false
#    mybatis.configuration.call-setters-on-nulls=false

## 当返回行所有的列都是空的时候, MyBatis 默认返回null, 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始)
## 默认是false
#    mybatis.configuration.return-instance-for-empty-row=false

##logPrefix 制定 MyBatis 添加到日志里的前缀
mybatis.configuration.log-prefix=MyBatis-log  %yy-%MM-%dd %hh:%mm:%ss

## 指定 MyBatis 所用日志的具体实现,未指定时将自动查找 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
##创建具有延迟加载能力的对象用的代理工具 CGLIB | JAVASSIST
## 默认 JAVASSIST
#    mybatis.configuration.proxy-factory:

##允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始)
#    mybatis.configuration.use-actual-param-name=true

## 指定一个提供Configuration实例的类。 这个被返回的Configuration实例用来加载被反序列化对象的懒加载属性值。
## 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始)
#    mybatis.configuration.configuration-factory:

3 在dubbo-bean中添加实例对象

因为我们是结合 dubbo分布式使用的, User对象在 dubbo-server 以及 dubbo-client 中都会使用, 需要进行底层的网络传输, 所以需要要对其进行 序列化.

我们在 application.properties 中配置的 mybatis.type-aliases-package 属性值就是实例对象的位置

public class User implements Serializable {
    private Long userId;
    private String userName;
    private String password;
    private String phone;
    
    // setter and getter
    ....
}

4. 编写 dao层mapper 对象

使用注解的好处就是避免了 mapper.xml 繁琐文件的配置

// 使用 Mapper 注解, 底层会自动帮忙创建实现类, 这个时候就不能使用扫描的方式, 否则就会报错
// java.lang.IllegalArgumentException: Mapped Statements collection already contains value for....
@Mapper
public interface UserMapper {

    @Select("select * from t_user where user_id = #{userId}")
    public User getById(Integer userId);

	// 多个参数的时候 @Param 这个注解必须添加
    @Select("select * from t_user where user_name = #{userName}")
    public User getByUserName(@Param("userName") String userName);

	// 当存在一对一的对象的时候可以 使用 对象.属性名 赋值, 如: @Result(property = "userIdCart.userIdNo", column = "user_id_no")
    @Results({@Result(property = "userId", column = "user_id"),
            @Result(property = "userName", column = "user_name"),
            @Result(property = "password", column = "password"),
            @Result(property = "userIdCart.userIdNo", column = "user_id_no"),
            @Result(property = "userIdCart.userIdNoToken", column = "user_id_no_token"),
            @Result(property = "userIdCart.userId", column = "iid")
    })
    @Select("select t.user_id, t.user_name, t.password, t.phone, i.user_id as iid, i.user_id_no, i.user_id_no_token from t_user as t left join t_user_id_info as i on t.user_id = i.user_id where t.user_id = #{userId}")
    public User selectUserAndUserID(Integer userId);
}

3. 测试:

1. 启动 zookeeper

2. 启动 dubbo-server

当使用 mybatis 的 mapper.xml 文件时, 启动时必须添加 @MapperScan(“mapper对象位置”), 否则无法注入 mapper 对象

@SpringBootApplication
//使用 mapper 注解可以 不用添加 MapperScan
//@MapperScan("club.springboot.dubbo.dubboserver.dao.mapper")
public class DubboServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboServerApplication.class, args);
    }
}

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值