框架的搭建

  • 1.创建一个多模块的项目
  • 引入tk.mybatis,(他是通用的mapper,封装了单表的增删改查,可以不用在xml中写sql了)使其简化开发
  • 通用mapper的条件查询
  • 总结:
  • 各模块的功能解释


idea创建项目慢的问题

win10 idea 调试伪分布式hadoop idea创建分布式项目_xml

Name : archetypeCatalog
value: internal

  • 关于项目模块的划分可参考:

1.创建一个多模块的项目

1.新建一个空项目

win10 idea 调试伪分布式hadoop idea创建分布式项目_spring_02

  1. 添加一个模块









    同理再为java项目添加b模块

    最终效果

    然后修改pom.xml将其改造成springboot项目
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.21.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>org.dim</groupId>
  <artifactId>demo</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>demo</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>


</project>

win10 idea 调试伪分布式hadoop idea创建分布式项目_spring_03


apllication.properties.xml

# 服务端口
server.port=8080

# jdbc
spring.datasource.password=root
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/online_shopping?characterEncoding=UTF-8

# mybtais配置
# 读取资源路径下的mapper文件夹下的所有*Mapper.xml文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
#数据库中下划线转java驼峰
mybatis.configuration.map-underscore-to-camel-case=truejava

win10 idea 调试伪分布式hadoop idea创建分布式项目_java_04


添加依赖,使其支持@MapperScan(basePackages = “org.dim.onlineshoppinguser.mapper”)

<dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis-spring</artifactId>
           <version>2.0.0</version>
       </dependency>
       <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
           <version>1.1.1</version>
       </dependency>
       <!-- 通用mapper,封装了单表的增删改查 -->
       <dependency>
           <groupId>tk.mybatis</groupId>
           <artifactId>mapper-spring-boot-starter</artifactId>
           <version>2.1.3</version>
           <exclusions>
               <exclusion>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-jdbc</artifactId>
               </exclusion>
           </exclusions>
       </dependency>

引入tk.mybatis,(他是通用的mapper,封装了单表的增删改查,可以不用在xml中写sql了)使其简化开发

1.添加依赖

<!-- 通用mapper,封装了单表的增删改查 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2.替换扫描类---->很重要,很重要,很重要(如果spring boot用的是2.0以上的版本,那么tk.mapper也需要用2.0以上的版本)

import org.mybatis.spring.annotation.MapperScan;--------》换成

import tk.mybatis.spring.annotation.MapperScan;

win10 idea 调试伪分布式hadoop idea创建分布式项目_java_05


不加或加错了,就会报错:

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
	at tk.mybatis.spring.mapper.SpringBootBindUtil$SpringBoot2Bind.bind(SpringBootBindUtil.java:129) ~[mapper-spring-boot-autoconfigure-1.2.3.jar:na]
	Caused by: java.lang.reflect.InvocationTargetException: null
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
	at tk.mybatis.spring.mapper.SpringBootBindUtil$SpringBoot2Bind.bind(SpringBootBindUtil.java:127) ~[mapper-spring-boot-autoconfigure-1.2.3.jar:na]
	... 21 common frames omitted
Caused by: java.util.NoSuchElementException: No value bound
	at org.springframework.boot.context.properties.bind.BindResult.get(BindResult.java:56) ~[spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	... 26 common frames omitted
	```
```java
public interface UserMapper extends Mapper<UserMember> {
    //List<UserMember> selectUserMember();
}
  • 为pojo添加主键注解。
public class UserMember {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

3.调用用通用mapper的接口

@Override
    public List<UserMember> getUserMember() {
        //return userMapper.selectUserMember();
        return userMapper.selectAll();
    }

通用mapper的条件查询

  • 如果前端不传参数的话,就是查询所有
@Override
    public List<UmsMemberReceiveAddress> getUmsMemberReceiveAddress(String id) {
       UmsMemberReceiveAddress umsMemberReceiveAddress=new UmsMemberReceiveAddress();
       umsMemberReceiveAddress.setMemberId(id);
        return umsMemberReceiveAddressMapper.select(umsMemberReceiveAddress);
//------------------------------------------------------------------------        
        //使用selectExample查询
        //example通常和update更新(删除)一起用,因为查询有select()方法
        //泛型,
      //   Example example=new Example(UmsMemberReceiveAddress.class);
      //             正则,            过滤条件
    //    example.createCriteria().andEqualTo(id);  这样写查询所有
    //因为是泛型,所以这个地方应该传入的是类的属性,而非column名字
    // example.createCriteria().andEqualTo("memberId",id);
     //   return umsMemberReceiveAddressMapper.selectByExample(example);
    }
  • 如果想查看通用mapper生成的sql语句,可以将日志级别改成debug,info是能不打印的信息就不打印
# 日志级别
logging.level.root=info

总结:

上面步骤只是完成了一个模块的查询操作。这是传统的开发方式使用的架构(controller—service—dao—bean都是放在一个package)。但由于我们要搭建的是分布式,所以我们需要把服务拆分开来。每个功能/每层 把它做成一个模块

各模块的功能解释

win10 idea 调试伪分布式hadoop idea创建分布式项目_java_06

有四个通用的模块

  1. parent-----整个项目的父模块,大多模块都会依赖它,项目主要的jar都配置在该模块的pom.xml中(redis,zookkeeper,dubbo,mybatis等jar包依赖),parent的父依赖是spring-boot-starter-parent。。。。。。其他模块的父依赖都是parent
  2. api ------就是用来放置服务接口的,service接口和bean放在这里(因为接口里会用到bean类,所以放在一起比较好)
  3. common-util ----项目的工具类放在这里,提升代码的复用性。(http工具,文件上传,日志处理,日期处理,json转换等工具)
  4. web-util 视图层的框架,如thymeleaf

user的2个拆分模块
5. user-web 这里面放入controller层的东西
6. user-service 这里面放入service.impl的东西和mapper的接口

win10 idea 调试伪分布式hadoop idea创建分布式项目_xml_07


因为我是将服务进行了拆分,所以我需要dubbo来进行远程服务的调用。如果dubbo为启动,会报错如下:

win10 idea 调试伪分布式hadoop idea创建分布式项目_spring_08