lombok
什么是lombok
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
在网上小猿也看到了一些lombok负面评价,但这部影响我们的学习。
安装lombok插件
安装后重启即可
lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
当引入lombok依赖后,lombok可在Bean上使用:
@Data :自动提供getter和setter、hashCode、equals、toString等方法
@Getter:自动提供getter方法
@Setter:自动提供setter方法
@Slf4j:自动在bean中提供log变量,其实用的是slf4j的日志功能。
一般在项目中使用@Data的情况比较多。
Spring Boot整合-SpringMVC端口和静态资源
修改tomcat端口
server:
port: 9090
修改静态资源的位置
Spring Boot整合-SpringMVC拦截器
编写拦截器
@Slf4j
public class MVCInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.debug("before interceptor............");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("in interceptor controller............");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.debug("after interceptor............");
}
}
编写MVC配置类
@Configuration
public class MVCConfig implements WebMvcConfigurer {
//注册MVCInterceptor
@Bean
public MVCInterceptor mvcInterceptor(){
return new MVCInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(mvcInterceptor()).addPathPatterns("/*");
}
}
在MVC配置需要注册拦截器并添加到拦截器链,这样就可成功实现自定义拦截器了
SpringBoot整合-事务和连接池
前面几个案例中我们也有关springboot整合druid数据库连接池的积累,但是我们假设想用默springboot默认的数据库连接池hikari,则只需要添加下面的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
然后配置yml文件数据库项
spring:
profiles:
active: def,app
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
SpringBoot整合-Mybatis
spring官方没有提供整合mybatis的启动器。
添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
配置yml文件
mybatis:
type-aliases-package: com.feitian.springboot.domain
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
主要指定数据库字段映射以及日志的执行方式
添加Mapper或者MapperScan注解
Spring Boot整合-通用Mapper
通用Mapper:可以实现自动拼接sql语句;所有的mapper都不需要编写任何方法也就是不用编写sql语句。可以提高开发效率。
添加启动器依赖;
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
修改UserMapper继承Mapper
修改启动引导类Application
需要修改Mapper扫描注解,改为通用mapper的MapperScan
修改User实体类添加jpa注解
@Data
@Table(name = "tb_user")
public class User {
@Id
//主键回填
@KeySql(useGeneratedKeys = true)
private Long id;
private String userName;
private String password;
private String name;
private Integer age;
private Integer sex;
private Date birthday;
private Date created;
private Date updated;
private String note;
}
修改UserService
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User findById(Long id){
User user = userDao.selectByPrimaryKey(id);
return user;
}
@Transactional
public void addUser(User user){
userDao.insertSelective(user);
/*int i = 1/0;*/
System.out.println("add"+user);
}
}
Spring Boot整合-Junit
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void findById() {
User user = userService.findById((long) 10);
System.out.println(user);
}
@Test
public void addUser() {
User user = new User();
user.setId((long) 14);
user.setAge(7);
user.setBirthday(new Date());
user.setCreated(new Date());
user.setUpdated(new Date());
user.setUserName("dengjunhui");
user.setPassword("1234");
user.setSex(1);
user.setNote("please show me the code");
user.setName("lucy");
userService.addUser(user);
}
}
但是测试的时候小猿遇到一个非常奇怪的问题,执行单个方法时,另外一个方法也会一起执行,按道理来说测试那个方法就应该执行那个方法,如果有猿友知晓,请告诉小猿一声。
Spring Boot整合-Redis
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test(){
//string 字符串
//redisTemplate.opsForValue().set("str", "heima");
redisTemplate.boundValueOps("str").set("heima");
System.out.println("str = " + redisTemplate.opsForValue().get("str"));
//hash 散列
redisTemplate.boundHashOps("h_key").put("name", "heima");
redisTemplate.boundHashOps("h_key").put("age", 13);
//获取所有域
Set set = redisTemplate.boundHashOps("h_key").keys();
System.out.println(" hash散列的所有域:" + set);
//获取所有值
List list = redisTemplate.boundHashOps("h_key").values();
System.out.println(" hash散列的所有域的值:" + list);
//list 列表
redisTemplate.boundListOps("l_key").leftPush("c");
redisTemplate.boundListOps("l_key").leftPush("b");
redisTemplate.boundListOps("l_key").leftPush("a");
//获取全部元素
list = redisTemplate.boundListOps("l_key").range(0, -1);
System.out.println(" list列表中的所有元素:" + list);
// set 集合
redisTemplate.boundSetOps("s_key").add("a", "b", "c");
set = redisTemplate.boundSetOps("s_key").members();
System.out.println(" set集合中的所有元素:" + set);
// sorted set 有序集合
redisTemplate.boundZSetOps("z_key").add("a", 30);
redisTemplate.boundZSetOps("z_key").add("b", 20);
redisTemplate.boundZSetOps("z_key").add("c", 10);
set = redisTemplate.boundZSetOps("z_key").range(0, -1);
System.out.println(" zset有序集合中的所有元素:" + set);
}
}
Spring Boot项目部署
植入插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
打包
到目前为止springboot的基础知识储备已经完成。