@Controller与@RestController的区别
一.知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用
1. // 一般用于接口 或 前后端分离
1.如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp,html页面,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是return 里的内容。
// 一般用于后台页面
2.如果需要返回到指定页面,则需要用@Controller配合视图解析器InternalResourceViewResolver才行。如果需要返回JSON,XML或自定义mediaType内容到页面上,则需要在对于对应的方法上@ResponseBody注解。
例如:
- 使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加@ResponseBody注解
- @RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
总结:返回页面用@Controller,要想返回数据就用@RestController,这个注解对于返回数据比较方便,因为它会自动将对象实体转换为JSON格式。
二.@Autowired 注入Service服务对象
三.@RequestBody 主要用于接收前端传递给后端的json字符串中的数据(请求体中的数据)
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用Get方式提交数据,而是用POST方式进行提交。
例如
$.ajax({
Type:“post”,
url:encodeURI(http地址)
processData:true,
contentType:”application/json;charset=UTF-8”,//数据类型
data:JSON.stringify(vm.condition)
success:function(msg){
},
error:function(jqXHR,testStatus,errorThrown){
}
});
在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
附:@RequestBody最多只能有一个,而@RequestParam()可以有多个。
RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。
注:如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值),如果没有xxx名的话,那么请求会出错,报400
四.@repository用来注解接口,作用是:将接口交给spring管理(在spring中开启对@repository注解的扫描),当哪些地方需要用这个实现类作为依赖时,就可以注入了。
Repository是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。Repository模式主要是封装数据查询和存储逻辑;
五.@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。比如图一中,跳转到登录页面的路径就是localhost:8080/xxx-war/user/toLogin
六.@Component 相当于实例化类的对象。
Service,Controller,Repository分别标记类是Service层类,Controller层类,数据存储层的类,spring扫描注解配置时,会标记这些类要生成bean。
七.MyBatis中的@Mapper注解及配套注解使用详解,从mybatis3.4.0开始加入了@Mapper注解,目的就是为了不再写mapper映射文件
添加了@Mapper注解之后这个接口在编译时会生成相应的实现类
Application.properties文件和application.yml的区别:yml文件的好处就是天然的树状结构,实质和properties差不多;值得注意的是,原有的key,例如spring.jpa.properties.hibernate.dialect,按“.”分割,都变成树状的配置。key后面的冒号,后面一定要跟一个空格, 把原有的application.properties删掉。然后一定要执行一下 maven -X clean install
#application.yml
server:
port: 8086
spring:
datasource:
name: test
url: jdbc:mysql://192.168.1.112:3306/test
username: root
password: xxx
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'//空闲的时候进行检测需要发送验证语句
testWhileIdle: true
#开启空闲时监测,并设置检测时用的sql语句。指明连接是否被空闲连接回收器(如果有)进行检验
testOnBorrow: true
#指明是否从池中取出连接前进行检验,如果失败,则去除连接并尝试去除另一个;设置为true后如果要生
#效,validationQuery参数必须设置为非空字符串
testOnReturn: false
#指明是否归还到池中前进行检验
poolPreparedStatements: true
#开启池的prepared statement 池功能
maxOpenPreparedStatements: 20
#statement池能够同时分配的打开的statements的最大数量, 如果设置为0表示不限制
#application.properties
server.port=8085
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.url=jdbc:mysql://aliyuncs.com:3306/home?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=***
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mybatis.mapper-locations=classpath*:com/wanyu/fams/mapping/*Mapper.xml
#mybatis.type-aliases-package=com.wanyu.fams.model
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.druid.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.druid.datasource.driverClassName=com.mysql.jdbc.Driver
spring.druid.datasource.url=jdbc:mysql://localhost:3306/spring_boot?characterEncoding=utf-8
spring.druid.datasource.username=root
spring.druid.datasource.password=xxx
- springboot 默认资源根目录为static下 路径一定要写对不然出来一堆404还不知道为啥
- 使用thymeleaf模板引擎的时候
步骤1.引入jar包 (当引入这个jar包的时候 默认的静态根目录变成了templates)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
步骤二:application.yml只需要加(开发时禁用缓存)
spring:
thymeleaf:
cache: false
content-type:text/html
mode:LEGACYHTML5
application.properties添加如下配置:(这个不配置也可以的,如果不配置,会到resources/templates下去找同名的模板或者页面)
# 定位模板的目录
spring.mvc.view.prefix=classpath:/templates/
# 给返回的页面添加后缀名
spring.mvc.view.suffix=.html
3.Springboot的热部署
# 实现页面热部署,页面修改后立即生效。配置了true后在修改java文件后也支持热启动,不过属于项目重启(会清空session中的值)
#devtools内嵌了一个liveReload server,当资源发生改变时,浏览器刷新
spring.thymeleaf.cache: false
spring.devtools.restart.enabled: true
spring.devtools.restart.additional-paths: src/main/java (监控类的变化以此重启动)
#classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude: src/main/resources/**
spring boot 如何优雅的使用mybatis-spring-boot-starter
ORM框架的本质时简化编程中操作库的编码
一个是hibernate,发展到顶端的就是spring data jpa这种模式,基本上根据方法名就可以生成对应的sql
一个是可以灵活调试sql的mybatis;mybatis初期使用需要配置文件、实体类、dao层 映射关联,初期开发了 generator可以根据表结果自动生成实体类、配置文件和dao层代码;后期大量优化可以使用注解,自动管理dao层和配置文件。
Mybatis-spring-boot-starter就是springboot+mybatis可以完全注解不用配置文件,也可以简单配置上手。
- 在pom.xml中添加maven文件
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.1.1</version>
- </dependency>
- application.properties添加配置(取决于引入的数据库的驱动),springboot会自动加载spring.datasource.*相关配置,数据源就会自动引入sqlSessionFactory中,sqlSessionFactory会自动引入到mapper中。
- 在启动类上添加对mapper包扫描@MapperScan(“com.neo.mapper”)或
- 直接在每个Mapper类上面添加注解@Mapper
mybatis.type-aliases-package=com.neo.entity
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root
- 开发mapper
public interface UserMapper {
@Select("SELECT * FROM users")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name")
})
List<UserEntity> getAll();
@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name")
})
UserEntity getOne(Long id);
@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})")
void insert(UserEntity user);
@Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}")
void update(UserEntity user);
@Delete("DELETE FROM users WHERE id =#{id}")
void delete(Long id);
}
- @Select 是查询类的注解,所有的查询均使用这个
- @Result 修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。
- @Insert 插入数据库使用,直接传入实体类会自动解析属性到对应的值
- @Update 负责修改,也可以直接传入对象
- @delete 负责删除
注意,使用#符号和$符号的不同:
// This example creates a prepared statement, something like select * from teacher where name = ?;
@Select("Select * from teacher where name = #{name}")
Teacher selectTeachForGivenName(@Param("name") String name);
// This example creates n inlined statement, something like select * from teacher where name = 'someName';
@Select("Select * from teacher where name = '${name}'")
Teacher selectTeachForGivenName(@Param("name") String name);
JPA极简模式(待补充)
其他注解(待补充):
@Override:标示当前的方法定义将覆盖超类中的方法他告诉我们同时也告诉编译器我们的这些方法肯定覆盖了类**里面的方法,如果注释掉类**里面的方法 那么就会报错,它需要全部覆盖某个接口的方法。
2、@Deprecated:它标记就表明这个方法已经过时了,在实际中,我们不想用到一个方法,但是这方法的借口正在使用,那我们就可以用它注解
3、SuppressWarnings:忽略编译器警告信息