import java.util.Date;
public class User {
// id
private Long id;
// 用户名
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
private Date birthday;
// 创建时间
private Date created;
// 更新时间
private Date updated;
public Long getId() {
return id;
}
public void setId(Long 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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Date getUpdated() {
return updated;
}
public void setUpdated(Date updated) {
this.updated = updated;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
// 备注
private String note;
}
我们编写pojo时,经常需要编写构造函数和getter、setter方法,属性多的时候,就非常浪费时间,使用lombok插件可以解决这个问题:
- 在IDEA中安装lombok插件
在IDEA中安装lombok插件,不安装插件在IDEA中使用lombok的注解虽然编译能通过,但是源码会报错。所以为了让IDEA更好的辨别lombok注解则才安装插件。
- 添加lombok对应的依赖到项目
pom.xml
需要在maven
工程中的pom.xml
文件引入依赖:
org.projectlombok
lombok
- 改造实体类使用lombok注解
然后可以在Bean上使用:
① @Data :自动提供getter和setter、hashCode、equals、toString等方法e
② @Getter:自动提供getter方法
③ @Setter:自动提供setter方法
④ @Slf4j:自动在bean中提供log变量,其实用的是slf4j的日志功能。
例如;在javabean上加@Data,那么就可以省去getter和setter等方法的编写,lombok插件会自动生成。
虽然默认配置已经可以使用SpringMVC了,不过我们有时候需要进行自定义配置。
可以在application.yml
文件中配置日志级别控制:
logging:
level:
com.itheima: debug
org.springframework: info
5.2.1 修改端口
查看SpringBoot的全局属性可知,端口通过以下方式配置:
修改 application.yml
配置文件,添加如下配置:
映射端口
server:
port: 80
重启服务后测试:
5.2.2 访问静态资源
现在,我们的项目是一个jar工程,那么就没有webapp,我们的静态资源该放哪里呢?
回顾我们在上面看的源码,有一个叫做ResourceProperties的类,里面就定义了静态资源的默认查找路径:
默认的静态资源路径为:
-
classpath:/META-INF/resources/
-
classpath:/resources/
-
classpath:/static/
-
classpath:/public
只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理。
我们习惯会把静态资源放在classpath:/static/
目录下。我们创建目录 static
,并且从 资料文件夹中
复制itcast.gif
和test.js
如下:重启项目后测试:
注意:如果访问图片时候没有显示;可以先将项目先clean再启动,或者创建 public、resources 文件夹,然后图片放置到public或resources中。
5.2.3 添加拦截器
拦截器也是我们经常需要使用的,在SpringBoot中该如何配置呢?
拦截器不是一个普通属性,而是一个类,所以就要用到java配置方式了。在SpringBoot官方文档中有这么一段说明:
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration(interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc . If you wish to provide custom instances of RequestMappingHandlerMapping , RequestMappingHandlerAdapter , or ExceptionHandlerExceptionResolver , you can declare a WebMvcRegistrationsAdapter instance to provide such components.
If you want to take complete control of Spring MVC, you can add your own @Configuration annotated
with
@EnableWebMvc
.
总结:通过实现WebMvcConfigurer
并添加@Configuration
注解来实现自定义部分SpringMvc配置。
- 创建
heima-springboot\src\main\java\com\itheima\interceptor\MyInterceptor.java
拦截器,内容如下:
package com.itheima.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
log.debug(“这是MyInterceptor拦截器的preHandle方法”);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
log.debug(“这是MyInterceptor拦截器的postHandle方法”);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex) throws Exception {
log.debug(“这是MyInterceptor拦截器的afterCompletion方法”);
}
}
- 定义配置类
heima-springboot\src\main\java\com\itheima\config\MvcConfig.java
,用于注册拦截
器,内容如下:
package com.itheima.config;
import com.itheima.interceptor.MyInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfig implements WebMvcConfigurer {
/**
-
将拦截器注册到spring ioc容器
-
@return myInterceptor
*/
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
/**
-
重写该方法;往拦截器链添加自定义拦截器
-
@param registry 拦截器链
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//通过registry添加myInterceptor拦截器,并设置拦截器路径为 /*
registry.addInterceptor(myInterceptor()).addPathPatterns(“/*”);
}
}
-
结构如下:
-
接下来访问http://localhost/hello 并查看日志:
spring中的jdbc连接和事务是配置中的重要一环,在SpringBoot中该如何处理呢?
答案是不需要处理,我们只要找到SpringBoot提供的启动器即可,在pom.xml
文件中添加如下依赖:
org.springframework.boot
spring-boot-starter-jdbc
当然,不要忘了数据库驱动,SpringBoot并不知道我们用的什么数据库,这里我们选择MySQL;同样的在pom.xml
文件中添加如下依赖:
mysql
mysql-connector-java
8.0.22
至于事务,SpringBoot中通过注解来控制。就是我们熟知的@Transactional
使用的时候设置在对应的类或方法上即可。
创建heima-springboot\src\main\java\com\itheima\service\UserService.java
业务类如下:
package com.itheima.service;
import com.itheima.pojo.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
// 根据id查询
public User queryById(Long id) {
//根据id查询
return new User();
}
// 保存用户
@Transactional
public void saveUser(User user) {
System.out.println(“新增用户…”);
}
}
其实,在刚才引入jdbc启动器的时候,SpringBoot已经自动帮我们引入了一个连接池:HikariCP应该是目前速度最快的连接池了,我们看看它与c3p0的对比:
因此,我们只需要指定连接池参数即可;打开application.yml
添加修改配置如下:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_test
username: root
password: root
【注意】
把 JdbcConfig 类中的druid的配置删除或注释;
在配置完hikari数据库连接池后的
application.yml
文件如下:
启动项目,访问 http://localhost/hello ;查看后台输出,一样可以在HelloController中获取到datasource。
5.5.1 MyBatis
- SpringBoot官方并没有提供Mybatis的启动器,不过Mybatis官网自己实现了。在项目的pom.xml 文件中加入如下依赖:
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.1
- 配置
application.yml
,常用配置如下:
mybatis配置
mybatis:
实体类别名包路径
type-aliases-package: com.itheima.pojo
映射文件路径
mapper-locations: classpath:mappers/*.xml
configuration:
控制台输出执行sql
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 配置Mapper扫描
需要注意,这里没有配置mapper
接口扫描包,因此我们需要给每一个Mapper接口添加@Mapper 注解,才能被识别。
@Mapper
public interface UserMapper {
}
或者,我们也可以不加注解,而是在启动类上添加扫描包注解(推荐):
package com.itheima;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
-
spring boot 工程都有一个启动引导类,这是工程的入口类
-
并在引导类上添加@SpringBootApplication
*/
@SpringBootApplication
@MapperScan(“com.itheima.mapper”)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
以下代码示例中,我们将采用@MapperScan扫描方式进行。
5.5.2 通用mapper
通用mapper:可以实现自动拼接sql语句;所有的mapper都不需要编写任何方法也就是不用编写sql语句。
- 通用Mapper的作者也为自己的插件编写了启动器,我们直接引入即可。在项目的
pom.xml
文件中加入如下依赖:
tk.mybatis
mapper-spring-boot-starter
2.1.5
注意:一旦引入了通用Mapper的启动器,会覆盖Mybatis官方启动器的功能,因此需要移除对官方Mybatis启动器的依赖。
- 编写UserMapper
无需任何配置就可以使用了。如果有特殊需要,可以到通用mapper官网查看
编写heima-springboot\src\main\java\com\itheima\mapper\UserMapper.java
如下:
package com.itheima.mapper;
import com.itheima.pojo.User;
import tk.mybatis.mapper.common.Mapper;
public interface UserMapper extends Mapper {
}
-
把启动类上的@MapperScan注解修改为
通用mapper中自带的
:引用tk开头的 -
在User实体类上加JPA注解
修改heima-springboot\src\main\java\com\itheima\pojo\User.jav
如下:
如果数据库字段名称和实体名称差别很大,需要用Column注解指定字段对应。
package com.itheima.pojo;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Data
@Table(name = “tb_user”)
public class User {
@Id
// 主键回填
@KeySql(useGeneratedKeys = true)
private Long id;
// 如果数据库字段名称和实体名称差别很大,需要用Column注解指定
// @Column(name = “abc”)
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
的代码进行简单改造
package com.itheima.service;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
// 根据id查询
public User queryById(Long id) {
//根据id查询
//return new User();
return userMapper.selectByPrimaryKey(id);
}
// 保存用户
@Transactional
public void saveUser(User user) {
System.out.println("新增用户… ");
//选择性新增;如果属性为空则该属性不会出现在insert语句上
userMapper.insertSelective(user);
}
}
将HelloController
进行简单改造:
package com.itheima.controller;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
@RestController
public class HelloController {
@Autowired
private DataSource dataSource;
@Value(“${itcast.url}”)
private String itcastUrl;
@Value(“${itheima.url}”)
private String itheimaUrl;
@Autowired
private UserService userService;
/**
-
根据用户id查询用户
-
@param id 用户id
-
@return 用户
*/
@GetMapping(“/user/{id}”)
public User queryById(@PathVariable Long id){
return userService.queryById(id);
}
@GetMapping(“hello”)
public String hello(){
System.out.println(" itcastUrl = " + itcastUrl);
System.out.println(" itheimaUrl = " + itheimaUrl);
System.out.println(" DataSource = " + dataSource);
return “Hello, Spring Boot!”;
}
}
我们启动项目,查看:
Ctrl+shift+t快速给一个类添加测试类
- 在springboot项目中如果要使用Junit进行单元测试,则需要添加如下的依赖:
org.springframework.boot
spring-boot-starter-test
- 在测试包下编写测试类
在测试类上面必须要添加 @SpringBootTest
注解。
编写测试类heima-springboot\src\test\java\com\itheima\service\UserServiceTest.java
package com.itheima.service;
import com.itheima.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Date;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void queryById() {
User user = userService.queryById(8L);
System.out.println(user);
}
@Test
public void saveUser() {
User user = new User();
user.setId(13L);
user.setAge(18);
user.setUsername(“kai”);
user.setPassword(“123”);
user.setBirthday(new Date());
userService.saveUser(user);
}
}
测试代码结构如:
在Spring Boot项目中,如果要编写测试类,则必须要在类上面添加@SpringBootTest
redis五种数据类型:string、list、set、hash、sort set
- 在
pom.xml
文件中添加如下依赖;
org.springframework.boot
spring-boot-starter-data-redis
- 配置
application.yml
文件;
spring:
redis:
host: localhost
port: 6379
- 编写
src\test\java\com\itheima\redis\RedisTest.java
测试代码;
package com.itheima.redis;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Set;
@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”, “黑马”);
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);
//set集合
redisTemplate.boundSetOps(“set_key”).add(“a”, “b”, “c”);
set = redisTemplate.boundSetOps(“set_key”).members();
System.out.println(“集合的元素:” + 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(“有序集合的元素:” + set);
}
}
- 运行上述代码测试
==============================================================================
- 添加项目的
pom.xml
插件;在pom.xml要显式的加入插件spring-boot-maven-plugin,否则无法产生 jar 清单
文件,导致打出来的 jar 无法使用命令运行;
org.springframework.boot
spring-boot-maven-plugin
- 使用maven的命令package打包;
之后在项目下的target
目录中将有如下jar包:
【注意】在查看打出的 jar 的时候,将发现 jar 包里面包含 jar 包;这样的包称为 fatJar(肥包)
运行打出来的包;使用命令:java –jar 包全名
或者写一个 bat 文件,里面包含 java –jar 包全名;这样就可以双击启动应用。
如执行上述打出来的jar的命令为:
java -jar heima-springboot-1 1.0-SNAPSHOT.jar
测试则可使用浏览器访问:http://localhost/user/8
======================================================================
在应用spring boot工程的时候;一般情况下都需要创建启动引导类Application.java和application.yml配置文件,而且内容都是一样的;为了便捷可以安装一个IDEA的插件 JBLSpringBootAppGen
在项目上右击之后可以自动生成启动引导类Application.java和application.yml配置文件。
在IDEA中任意一个maven项目或src目录上 右击,选择JBLSpringBootAppGen
即可。
在如下的界面中输入 启动引导类的名称并根据需要勾选是否要生成application.yml配置文件。
点击 OK
之后,在项目中将发现如下内容:
============================================================================
-
Spring Boot是一个搭建基于spring工程的脚手架
-
简化配置、依赖管理
-
特点:快速搭建、内嵌应用服务器、自动配置、无代码生成、也没有xml配置
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
dGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0thaVNhckg=,size_16,color_FFFFFF,t_70)
点击 OK
之后,在项目中将发现如下内容:
============================================================================
-
Spring Boot是一个搭建基于spring工程的脚手架
-
简化配置、依赖管理
-
特点:快速搭建、内嵌应用服务器、自动配置、无代码生成、也没有xml配置
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-MqHhkU5f-1712736846995)]
[外链图片转存中…(img-ogxZ0L6k-1712736846995)]
[外链图片转存中…(img-OGXvso3l-1712736846996)]
[外链图片转存中…(img-PeQdlvPb-1712736846998)]
[外链图片转存中…(img-JtkbaZem-1712736846998)]
[外链图片转存中…(img-Wx7H7cQ6-1712736846998)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-q4phTbZf-1712736846999)]
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
[外链图片转存中…(img-NJLxUIu3-1712736846999)]
上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
[外链图片转存中…(img-ESEGSjkT-1712736846999)]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-EDby0v7z-1712736846999)]