目录
一、按照项目的用途来进行分类配置
二、配置文件的优先级
三、与mybatis框架进行整合
一、pom文件引入依赖
二、配置文件中指定mapper放置的位置
演示整合案例如下:
需要思考的问题,我们的接口如何被发现呢?
四、mybatis优化(精髓在于mapper接口的代理技术)
springboot整合通用mapper
解决字段不一致的问题:
五、项目整合lombok
一、导入依赖
二、下载lombok插件,如果idea版本高的话它是自带lombok的!
三、常用的Lombok注解
四、使用方法
一、按照项目的用途来进行分类配置
spring.profiles.active = 文件名的后缀
设置活动的配置文件
比如spring.profiles.active = test
application-dev.yml
application-test.yml
首先它一定会先加载主配置文件,那么主配置文件可以这样写:?
?
?dev:
server:
port: 8085
#指定当前服务的名称,到时候微服务项目发布的时候需要用到
spring:
application:
name: service-demo2
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/music?serverTimezone=Asia/Shanghai
username: root
password: abc123
#解决时差问题
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#配置数组
pro:
- id: 18
- name: xxx
logging:
level:
com:
lay:
demo2: debug
test:
server:
port: 8084
#指定当前服务的名称,到时候微服务项目发布的时候需要用到
spring:
application:
name: service-demo2
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/music?serverTimezone=Asia/Shanghai
username: root
password: abc123
#解决时差问题
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#配置数组
pro:
- id: 18
- name: xxx
logging:
level:
com:
lay:
demo2: debug
二、配置文件的优先级
三、与mybatis框架进行整合
- 启动器
- 需要配什么?mybatis是orm框架
- 连接池
- 映射文件放在哪里,如何找到?
- 接口又如何找到
- 项目的架构是怎么样的?
一、pom文件引入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
二、配置文件中指定mapper放置的位置
配置文件中配置文件的路径,只要是符合的都会被扫描到?
?
演示整合案例如下:
项目文件:
实体类User:
package com.lay.demo2.entity;
/**
* @author Dragon code!
* @create 2022-04-27 15:39
*/
public class User {
private Integer id;
private String userName;
private String passWord;
private String realName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
}
mapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lay.demo2.mapper.UserMapper">
<select id="findUserById" parameterType="java.lang.Integer" resultType="com.lay.demo2.entity.User">
select *
from user
where id = #{id}
</select>
</mapper>
UserMapper接口:
package com.lay.demo2.mapper;
import com.lay.demo2.entity.User;
/**
* @author Dragon code!
* @create 2022-04-27 15:42
*/
@Repository
public interface UserMapper {
User findUserById();
}
MyController控制层:
restFul风格访问控制器方法:
package com.lay.demo2.controller;
import com.lay.demo2.entity.User;
import com.lay.demo2.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Dragon code!
* @create 2022-04-26 16:29
*/
@RestController
public class MyController {
@Autowired
private UserService userService;
@RequestMapping("/lay/{id}")
public User hello(@PathVariable Integer id) {
User user = userService.findUserById(id);
return user;
}
}
需要思考的问题,我们的接口如何被发现呢?
直接在启动类的上面加上MapperScan来扫描项目中的mapper接口!
package com.lay.demo2;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author Dragon code!
* @create 2022-04-26 15:18
*/
@SpringBootApplication
//此注解相当于以前的配置文件中指定resource文件夹的位置(mapper.xml要么直接放在resource中要么指定代替的文件夹的名称)
@MapperScan("com.lay.demo2.mapper")
public class Demo2Application {
public static void main(String[] args) {
SpringApplication.run(Demo2Application.class);
}
}
基于springboot开发微服务项目就不要向以前一样写接口然后再写他的实现类了,我们直接使用service类来作为服务层。
UserService:
package com.lay.demo2.service;
import com.lay.demo2.entity.User;
import com.lay.demo2.mapper.UserMapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Dragon code!
* @create 2022-04-27 15:46
*/
@Service
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
public User findUserById(Integer id) {
return userMapper.findUserById(id);
}
}
数据库导入数据:
最终结果:
四、mybatis优化(精髓在于mapper接口的代理技术)
大多数项目中针对表的操作80%以上都是单表的操作,微服务内部的功能会很少,一个微服务往往只操作一个表,所以在一个微服务的项目中95%都是单表操作。
对mybatis的映射文件的内容,如果statement只是针对单表,写起来很简单,另外写的内容无非与表名和entity类有关。
基于以上情形,mybatis提供了两种扩展的应用方式,他们可以很方便的实现对单表的操作。
(1)mybatis-plus
(2)通用mapper(推荐使用,简单)
springboot整合通用mapper
删除mybatis的启动器
添加以下通用mapper的启动器:
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
项目结构:可以看到我们直接删除了resource下的mapper包以及里面的*mapper.xml文件
关键步骤,让mapper接口去继承通用mapper所提供的接口!
tk表示通用
查看BaseMapper
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package tk.mybatis.mapper.common;
import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.base.BaseDeleteMapper;
import tk.mybatis.mapper.common.base.BaseInsertMapper;
import tk.mybatis.mapper.common.base.BaseSelectMapper;
import tk.mybatis.mapper.common.base.BaseUpdateMapper;
@RegisterMapper
public interface BaseMapper<T> extends BaseSelectMapper<T>, BaseInsertMapper<T>, BaseUpdateMapper<T>, BaseDeleteMapper<T> {
}
再次进入其中的BaseSelectMapper接口:
@RegisterMapper
public interface BaseSelectMapper<T> extends SelectOneMapper<T>, SelectMapper<T>, SelectAllMapper<T>, SelectCountMapper<T>, SelectByPrimaryKeyMapper<T>, ExistsWithPrimaryKeyMapper<T> {
}
由此可见
BaseMapper<User> 接口还继承了其他的接口,包括了所有的增删改查的操作,每种操作都由接口提供了方法,通用mapper会把接口的方法与泛型的entity实体结合在一起,按照映射文件中statement的书写规律利用代理技术自动生成执行接口方法所对应功能的代理对象,此代理对象中就包含了需要执行的自动生成的SQL命令
不用再写映射文件,配置文件中可以不再指定映射文件的位置。
删除以下部分
但是在启动类中需要添加针对mapper接口的包的扫描的注解!
注意一定要选tk的?
注意点:mapper接口中没必要写自定义的方法了,删除自定义方法
?mapper接口中不需要写自定义的方法,需要调用方式时从被继承的接口中去选择,任何的针对单表的操作的方法都有!
解决字段不一致的问题:
?
解决方法:
在实体类里面指定列名
最终结果:成功访问
五、项目整合lombok
一、导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
二、下载lombok插件,如果idea版本高的话它是自带lombok的!
?
三、常用的Lombok注解
@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;
作用于成员变量上,生成该成员变量的getter/setter方法。
@ToString: 作用于类,覆盖默认的toString()方法
@EqualsAndHashCode: 作用于类,覆盖默认的equals和hashCode
@NoArgsConstructor:生成无参构造器;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;
@AllArgsConstructor:生成全参构造器
@Data: 作用于类上,注解集合,使用它相当于使用下列注解:
@ToString
@EqualsAndHashCode
@Getter
@Setter
@RequiredArgsConstructor
@Builder: 作用于类上,将类转变为建造者模式
@Log: 作用于类上,生成日志变量
四、使用方法
/**
* @author Dragon code!
* @create 2022-04-27 15:39
*/
@Data
public class User {
@Id
private Integer id;
@Column(name = "userName")
private String userName;
@Column(name = "passWord")
private String passWord;
@Column(name = "realName")
private String realName;
}
成功访问:
?
|