项目说明
- 用SpringBoot重新搭建以前的SSM项目。
- 通用Mapper的使用
数据库准备
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名称',
`birthday` datetime(0) NULL DEFAULT NULL COMMENT '生日',
`sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
`address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 57 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (41, 'the loneliest', '2018-02-27 17:47:08', '男', '北京');
INSERT INTO `user` VALUES (42, '王中王', '2018-03-02 15:09:37', '女', '湖北武汉');
INSERT INTO `user` VALUES (45, '马小玲', '2018-03-04 12:04:06', '男', '北京金燕龙');
INSERT INTO `user` VALUES (46, '王大爷', '2018-03-07 17:37:26', '男', '');
INSERT INTO `user` VALUES (48, '小猪佩奇', '2018-03-08 11:44:00', '女', '北京修正');
INSERT INTO `user` VALUES (53, '赵老头', '2020-01-29 12:53:16', '男', '广州市三星区毛遂路19号');
INSERT INTO `user` VALUES (54, '老六', '2020-01-29 12:51:46', '男', '德阳市高新区步行路02号');
INSERT INTO `user` VALUES (56, '老六', '2020-02-22 21:28:55', '女', '湖南长沙');
新建maven工程
- 新建maven工程,名称为SpringBoot_SSM,不要有父工程。
- 注意:不要勾选
Create from archetype
pom.xml
<?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>
<groupId>com.cncs</groupId>
<artifactId>SpringBoot_SSM</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
整合SpringMVC
在SpringBoot全局属性配置文件中application.yaml
修改相关属性。
修改端口
server:
port: 9090
servlet:
path: "*.do"
设置访问拦截规则
server:
servlet:
path: "*.do"
设置日志记录级别
日志级别有5种:INFO,WARN,ERROR,DEBUG,TRACE
logging:
level:
com.cncs: debug
org.springframework: debug
访问静态资源
静态资源默认读取路径:
从图中可以看见默认读取的目录有:/META-INF/resources/
,/resources/
, /static/
, /public/
也就是说只要在/resources/
目录下新建这其中任何一个目录,再将静态资源放入其中即可。不过,现在流行前后的分离,这种方法不再经常使用。
配置拦截器
在使用springmvc.xml配置拦截器的方法是:
<mvc:interceptors>
<!-- 配置第一个拦截器-->
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.cncs.interceptor.MyInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
在SpringBoot中该如何配置拦截器?通过实现WebMvcConfigurer
并添加@Configuration
注解来实现自定义部分SpringMVC配置。
(1)定义一个拦截器MyInterceptor
public class MyInterceptor implements HandlerInterceptor {
private final Logger log= LoggerFactory.getLogger(MyInterceptor.class);//使用日志记录
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.debug("preHandle is running...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("postHandle is running...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.debug("afterCompletion is running...");
}
}
(2)定义一个配置类MvcConfig,注册拦截器
-
使用@Configuration注解标识它是一个配置类
-
重写
addInterceptors()
方法注册拦截器,类似于xml中配置一个拦截器 -
为拦截器添加拦截规则
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
执行结果
其中包含的内容:日期 时间 日志级别 进程号 线程号 记录的类 日志输出内容
PS1:要配置其它组件,只要重写相关的方法即可,也是类似的过程,如下图。
整合连接池
(1)在pom.xml中引入jdbc启动器
<!--jdbc的启动器,默认使用HikariCP连接池-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--不要忘记数据库驱动,因为springboot不知道我们使用的什么数据库,这里选择mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
(2)在SpringBoot中会自动引入一个连接池HikariCP,它的速度非常快。
(3)在application.yaml中配置连接信息
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///test
username: root
password: 123456
更多连接池可以从OSCHINA查看:点击TP
整合MyBatis
不使用通用Mapper
(1)在pom.xml中引入mybatis的启动器,因为SpringBoot官方没有给mybatis写启动器,所以mybatis自己写了一个启动器,第三方自己写的启动器的命名方式都是这种格式。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
(2)配置MyBatis
mybatis:
# mybatis pojo包别名扫描
type-aliases-package: com.cncs.pojo
# 使用驼峰命名方式
configuration:
map-underscore-to-camel-case: true
# mapper.xml文件位置,如果没有映射文件,请注释掉
# mapper-locations: mappers/*.xml
(3)定义一个UserMapper,需要注意,这里没有配置mapper接口扫描包,因此我们需要给每一个Mapper接口添加@Mapper
注解,才能被识别。
@Mapper
public interface UserMapper{
}
(4)为Spring Boot 启动类添加扫描包,一定要注意注解@MapperScan 引入的包
@SpringBootApplication
@MapperScan("com.cncs.mapper")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
通用Mapper
概念
通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。
极其方便的使用MyBatis单表的增删改查。
支持单表操作,不支持通用的多表联合查询。
github地址:点击传送
SpringBoot集成
(1)在pom.xml中引入通用Mapper的启动类(作者为自己的插件编写了启动器)
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
(2)重新配置MyBatis,这里通用Mapper已经配置好了其他配置,默认使用驼峰命名方式。
mybatis:
# mybatis pojo包别名扫描
type-aliases-package: com.cncs.pojo
(3)修改UserMapper,删除@Mapper注解
- 继承一个tk的Mapper
public interface UserMapper extends Mapper<User> {
}
定义User实体类
这里需要对原先的User类添加一些注解。
@Data
@Table(name = "user") //表名
public class User implements Serializable {
@Id
//@KeySql(useGeneratedKeys = true) //主键回显,标识主键自增
@GeneratedValue(generator = "JDBC")
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
@Transient//瞬时的,不会被持久化到数据库
private String note; //备注
}
注解说明
- 表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如**
UserInfo
默认对应的表名为user_info
**。 - 表名可以使用**
@Table(name = "tableName")
**进行指定,对不符合第一条默认规则的可以通过这种方式指定表名. - 字段默认和**
@Column
**一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式. - 可以使用**
@Column(name = "fieldName")
**指定不符合第3条规则的字段名 - 使用**
@Transient
**注解可以忽略字段,添加该注解的字段不会作为表字段使用. - 建议一定是有一个**
@Id
**注解作为主键的字段,可以有多个@Id
注解的字段作为联合主键. - 如果是MySQL的自增字段,加上**
@GeneratedValue(generator = "JDBC")
**即可,还可返回自增长的主键。
(4)测试通用Mapper
(4.1)引入test启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
(4.2)在UserMapper接口右键创建测试类
(4.3)编写UserMapperTest测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testQuery(){
User user = userMapper.selectByPrimaryKey(41);
System.out.println(user);
}
}
(5)删除多余的启动类,因为通用mapper已经帮助我们引入了相关启动器。
整合事务
在引入jdbc启动类时,就已经配置好了事务,只需要使用@Transactional
注解即可。
IUserService
public interface IUserService {
User queryById(Integer id);
void insertUser(User user);
}
UserServiceImpl
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public User queryById(Integer id) {
return userMapper.selectByPrimaryKey(id);
}
@Override
@Transactional //开启事务支持
public void insertUser(User user) {
userMapper.insert(user);
}
}
测试
编写UserController
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
//@GetMapping("/hello.do")
@RequestMapping(value = "{id}")
public User hello(@PathVariable(name = "id")Integer id){
//System.out.println("hello is running...");
//log.warn("hello is running...");
User user = userService.queryById(id);
//return "hello SpringBoot !";
return user;
}
}
浏览器输入http://localhost:9090/user/45
页面随之显示
通用Mapper问题
***PS1:使用通用Mapper查询遇到问题?***点击传送
Over
项目完整目录结构
application.yaml全部配置
server:
port: 9090
servlet:
path: /
logging:
level:
com.cncs: debug
# org.springframework: debug
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///test
username: root
password: 123456
mybatis:
# configuration:
# map-underscore-to-camel-case: true
type-aliases-package: com.cncs.pojo
参考博客