框架的搭建
- 1.创建一个多模块的项目
- 引入tk.mybatis,(他是通用的mapper,封装了单表的增删改查,可以不用在xml中写sql了)使其简化开发
- 通用mapper的条件查询
- 总结:
- 各模块的功能解释
idea创建项目慢的问题
Name : archetypeCatalog
value: internal
- 关于项目模块的划分可参考:
1.创建一个多模块的项目
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>
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
添加依赖,使其支持@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;
不加或加错了,就会报错:
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)。但由于我们要搭建的是分布式,所以我们需要把服务拆分开来。每个功能/每层 把它做成一个模块
各模块的功能解释
有四个通用的模块
- parent-----整个项目的父模块,大多模块都会依赖它,项目主要的jar都配置在该模块的pom.xml中(redis,zookkeeper,dubbo,mybatis等jar包依赖),parent的父依赖是spring-boot-starter-parent。。。。。。其他模块的父依赖都是parent
- api ------就是用来放置服务接口的,service接口和bean放在这里(因为接口里会用到bean类,所以放在一起比较好)
- common-util ----项目的工具类放在这里,提升代码的复用性。(http工具,文件上传,日志处理,日期处理,json转换等工具)
- web-util 视图层的框架,如thymeleaf
user的2个拆分模块
5. user-web 这里面放入controller层的东西
6. user-service 这里面放入service.impl的东西和mapper的接口
因为我是将服务进行了拆分,所以我需要dubbo来进行远程服务的调用。如果dubbo为启动,会报错如下: