选择题须知注解
@RequestParam用于从请求URL中获取参数并映射到方法参数中的注解。
@RequestMapping将一个请求URL指向一个类的方法的注解。用于处理请求地址映射,可以作用于类和方法上。
@ResponseBody作用于方法上,可以将整个返回结果以某种格式返回,如JSON字符串。
@ModelAttribute作用在Controller的某个方法上,此方法会首先被调用,并将方法结果作为Model的属性。
@Autowired自动按照类型注入,不关心bean的id,只要有唯一的类型匹配就可以注入成功。如果注入的bean在容器中类型不唯一时,他会把变量名作为bean的id,然后在容器中查找,找到则注入成功,如果没有一致的beanId则报错。
除注解外,还需要了解项目的文件路径、配置文件等。
用户开发源代码都在src/main/java中
Resources:static静态资源:图片,视频,音频,js,css
Templates: 模板(freemarker,thymeleaf,默认不支持jsp)
Aplication.properties :spring boot 配置文件
Spring boot 内置tomcat,无需配置tomcat,直接以java application来执行
-
声明使用spring boot
-
web
-
数据库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
-
热部署
-
定义mybatis全局配置文件位置和mapper文件位置
-
mybatis-config配置mybatis的全局参数
-
typeAliases起别名
程序填空题
Conreoller层文件
@Component【最好对应到每层中(@Controller、@Service、@Repository、@Mapper)】、@RequestMapping(“路径”)【填写路径时需要注意类名上方是否已经存在父路径】、@Autowired、@RequestParam(“xx”)【xx为前端中的name属性对应的名称】、
Mapper文件
resultType【全类名一定要写对】、parameterType、resultMap、association【id、result】、collection【id、result】、#{}、useGeneratedKeys、一些id的对应关系
拦截器
@preHandle、@postHandle、@afterCompletion、addInterceptors、HandleInterceptor
AOP
@Pointcut、@Before、@After、@Around、@AfterReturning、@AfterThrowing
简答题
IOC原理:
将组件之间的依赖关系反转,让外部容器来负责这些依赖关系,而不是由组件自己来创建和管理他们。
依赖注入的三种方法:
①使用set方式注入 ②使用构造函数 ③使用注解注入【配置文件可能出现的代码题中】
IOC加载配置文件的方法:
使用ApplicationContext工厂的接口,使用该接口可以获取到具体的Bean对象。
AOP原理:
面向切面编程,把程序中重复的代码抽取出来,在需要执行的时候使用动态代理技术在不修改源代码的基础上对已有方法进行增强。
AOP中概念:
①Joinpoint(连接点):指能被拦截到的点,在Spring中只有方法能被拦截。
②Pointcut(切点):指要对那些连接点进行拦截,即被增强的方法。
③Advice(通知):指拦截后要做的事情,即切点被拦截后执行的方法。
④Aspect(切面):切点加通知称为切面。
AOP注解的作用:
@Pointcut:定义切入点表达式,即指定在哪些方法或类上应用切面逻辑。
@Before:在目标方法执行之前执行切面逻辑。
@After:在目标方法执行之后(无论是否发生异常)执行切面逻辑。可用于执行一些收尾操作,如资源释放、事务处理等。
@Around:在目标方法执行前后执行切面逻辑,并可以控制目标方法的执行。
@AfterReturning:在目标方法成功执行后执行切面逻辑。
@AfterThrowing:在目标方法抛出异常后执行切面逻辑。
AOP的执行顺序 详看请点击:
1、程序正常执行:
① 环绕通知前
② @Before通知
③ 程序逻辑
④ @AfterReturning通知
⑤ 通知@After通知
⑥ 环绕通知后
2、程序异常:
① 环绕通知前
② @Before通知
③ @AfterThrowing异常通知
④ @After通知
拦截器执行过程,其流程描述如下:
①执行preHandle方法,该方法返回一个布尔值。如果为false,则结束所有流程;如果为true,则执行下一步;
② 执行处理器逻辑,它包含控制器的功能;
③ 执行postHandle方法;
④ 执行视图解析和视图渲染;
⑤执行afterCompletion方法。
MVC模式
MVC执行流程
ModelAndView
public ModelAndView test(User user) {
ModelAndView mv = new ModelAndView();
MappingJackson2JsonView jsonview = new MappingJackson2JsonView();
mv.setView(jsonview);
mv.addObject("user", user);
return mv;
}
Mybatis原理
ORM(对象关系映射) 数据库表字段名和实体类属性名保持一致。
Mybatis中的四个一致
映射文件名和接口文件名称一致(除扩展名)
mybatis映射文件的位置必须和dao接口的包结构相同
映射文件的名称空间namespace对应接口全类名
映射配置文件的操作配置,id的取值必须是dao接口的方法名
代码题
一、IOC三种依赖注入
1.Spring Ioc属性注入使用 set方法注入
private String bookname;
public void setBookname(String bookname) {
this.bookname = bookname;
}
<bean id="book" class="cn.itcast.property.Book">
<property name="bookname" value="数据结构"/>
</bean>
2.使用有参数构造注入
<bean id="book" class="cn.itcast.property.Book">
<constructor-arg name="bookname" value="数据结构"/>
</bean>
3.注解注入属性
public class UserServiceImpl1 implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public void saveCustom(String arg){
...
}
}
二、文件上传
1)上传文件JSP /WEB-INF/jsp/file/upload/.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<body>
<form method="post" action="/upload/multipart" enctype="multipart/form-data">
<input type="file" name="photo" value="请选择上传的文件"/>
<input type="sumbit" value="提交"/>
</form>
</body>
</html>
2)文件上传控制器
package com.springmvc.chapter0320191007.controller;
@Controller
public class FileController{
@PostMapping("/upload/multipart")
@ResponseBody
public Map<String, Object> upload(@RequestParam("photo") MultipartFile photo)
{
String path = "d:/uploaded/";//保存路径
String filename = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
// 获取上传文件的后缀suffix
String suffix = photo.getOriginalFilename().substring(photo.getOriginalFilename().lastIndexOf("."));
try {
// Spring提供了文件操作类FileCopyUtils
FileCopyUtils.copy(photo.getInputStream(), new FileOutputStream(path+filename+suffix));
} catch(IOException e) {
e.printStackTrace();
return dealResultMap(false, "上传失败");
}
return dealResultMap(true, "上传成功");
}
// 处理上传文件结果
private Map<String, Object> dealResultMap(boolean success, String msg) {
Map<String, Object> result = new HashMap<String, Object>();
result.put("success", success);
result.put("msg", msg);
return result;
}
}
三、Spring整合Mybatis
1)定义实体类
package com.cn.entity
public class User{
private Integer id;
private String userName;
private String note;
setter、getter方法
}
2)持久层
package com.cn.dao
/***import***/
@Mapper
public interface IUserDao{
public List<User> findAllUsers();
public User getUserById(Integer uid);
public Integer insertUser(User user);
...
}
3) UserMapper.xml文件
<mapper namespace="com.cn.dao.IUserDao">
<select id="getUserById" paramterType="Integer" resultType="com.cn.entity.User">
select id,user_name as userName,note from t_user where id=#{uid};
</select>
<select id="findAllUsers" resultType="com.cn.entity.User">
select id,user_name as userName,note from t_user
</select>
<insert id="insertUser" parameterType="com.cn.entity.User"
useGeneratedKeys="true" keyProperty="id">
insert into t_user(user_name, note) values(#(userName), #{note})
</insert>
</mapper>
四、Mybatis一对一,一对多
一对一
<select id="getClass" parameterType="Integer" resultMap="ClassResultMap">
select *
from class c,
teacher t
where c.teacher_id = t.t_id
and c.c_id = #{id}
</select>
<resultMap id="ClassResultMap" type="nuc.ty._20231202myatis.pojo.Classs">
<!-- id定义主键列 property:POJO属性名 column:数据库列名 -->
<id property="id" column="c_id"></id>
<!-- result定义普通列 property:POJO属性名 column:数据库列名 -->
<result property="name" column="c_name"></result>
<!-- 一对一对象列 property:属性名 column:关联列名 javaType:对象类型-->
<association property="teacher" column="teacher_id" javaType="nuc.ty._20231202myatis.pojo.Teacher">
<!-- 关联对象主键列 -->
<id property="id" column="t_id"/>
<!-- 关联对象普通列 -->
<result property="name" column="t_name"/>
</association>
</resultMap>
一对多
<mapper namespace="nuc.ty._20231202myatis.dao.IDeptDao">
<!--根据部门编号查询员工 -->
<select id="findByDeptno" parameterType="Integer" resultMap="deptMap">
select *
from dept
where deptno = #{deptno}
</select>
<resultMap type="nuc.ty._20231202myatis.pojo.Dept" id="deptMap">
<id property="deptno" column="deptno"/>
<result property="dname" column="dname"/>
<result property="location" column="loc"/>
<!-- collection:一对多关联映射
根据部门deptno先读取部门信息,然后再读取这个部门所有的用户信息。
property表示集合类型属性名称,也就是Dept实体类中定义的员工List名字
ofType表示集合中的对象的类型-->
<collection property="emps" javaType="ArrayList"
ofType="nuc.ty._20231202myatis.pojo.Emp"
column="deptno"
select="nuc.ty._20231202myatis.dao.IEmpDao.findByDeptno">
</collection>
</resultMap>
</mapper>
<mapper namespace="nuc.ty._20231202myatis.dao.IEmpDao">
<!--根据deptno查询员工-->
<select id="findByDeptno" parameterType="Integer"
resultType="nuc.ty._20231202myatis.pojo.Emp">
select * from emp
where deptno=#{deptno}
</select>
</mapper>