【Java框架】知识点汇总Day1:Spring+Spring MVC+MyBatis(含集合基础)(持续更新)
一、集合
1.1 Collection接口
Collection是集合框架中最基础的父接口,可以存储无序、不唯一的对象。
Iterable专门用来迭代,把集合中的元素全部取出来
Collection 中所有元素可以通过Iterator进行迭代(List、Set)
- Collection常用方法
| 方法 | 描述 |
| int size() | 获取集合长度 |
| boolean isEmpty() | 判断集合是否为空 |
| boolean contains(Object o) | 判断集合中是否包含某个元素 |
| Iterator<E> iterator() | 实例化Iterator接口,遍历集合 |
| Object[] toArray() | 将集合转换为一个Object类型的对象数组 |
| boolean add(E e) | 向集合中添加元素 |
| boolean remove(Object o) | 从集合中移除元素 |
| boolean containsAll(Collection c) | 判断集合中是否存在某个集合的所有元素 |
| boolean addAll(Collection c) | 向集合中添加某个集合的所有元素 |
| boolean removeAll(Collection c) | 从集合中移除满足条件的另一个集合 |
| void clear() | 清空集合 |
| boolean equals(Object o) | 比较两个集合是否相等 |
| int hashCode() |
获取集合对象的散列值 |
1.2 Collection的子接口
使用其子接口
- List:存放有序、不唯一的元素
- Set:存放无序、唯一的元素
- Queue:队列接口
1.3 List接口
List接口在继承Collection接口的基础上进行了扩展,常用的扩展方法
| 方法 | 描述 |
| E get(int index) | 通过下标获取集合中指定位置的元素 |
| E set(int index,E element) | 替换集合中指定位置的元素 |
| void add(int index,E element) | 向集合中的指定位置添加元素 |
| E remove(int index) | 通过下标删除集合中指定位置的元素 |
| int indexOf(Object o) | 查找某个对象在集合中的下标 |
| int lastIndexOf(Object o) | 从后向前查找某个对象在集合中的下标 |
| ListIterator<E> listIterator() | 实例化ListIterator接口 |
| List<E> subList(int fromIndex,int toIndex) | 获取集合中的子集合 |
1.4 List接口的实现类
ArrayList实现了长度可变的数组
优点:查找快,因为元素都是连续的,可以快速求出下标从而取出元素
缺点:增删慢,因为元素都是连续的,添加一个元素,就必须先将后续的元素依次后移一位,再把新元素加入,删除同理。
import java.util.ArrayList;
public class Test5 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("Hello");
list.add("World");
list.add("Love");
list.add("You");
System.out.println(list);
}
}

调用的是toString方法,源码如下:
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
LinkedList 采用链表的形式来存储数据,和ArrayList恰好相反
优点:增删快
缺点:查询慢
地址指向,元素不连续。
import java.util.ArrayList;
import java.util.LinkedList;
public class Test5 {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("Hello"); //向集合中添加元素
list.add("World");
list.add("Java");
System.out.println(list);
list.offer("JavaSE"); //向集合中添加元素,向后添加
list.offer("JavaEE");
System.out.println(list);
list.push("JavaME"); //向集合中添加元素,从0开始添加
System.out.println(list);
list.addFirst("JavaEE2");//从前开始添加元素
System.out.println(list);
System.out.println(list.peekFirst());//获取集合中第一个元素
System.out.println(list.peekLast());//获取集合中最后一个元素
System.out.println(list);
System.out.println(list.pollFirst()); //获取集合中第一个元素并删掉
System.out.println(list.pollLast());//获取集合中最后一个元素并删掉
System.out.println(list);
}
}

二、Spring
2.1 AOP
Aspect Oriented Programming 面向切面编程
Object Oriented Programming 面向对象编程
将程序中所有参与模块都抽象成对象,然后通过对象之间的相互调用完成特定的功能。
AOP是对OOP的一种补充,是在另外一个维度上抽象出对象,具体是指程序运行时动态将非业务代码切入到业务代码中,实现了业务代码和非业务代码的解耦合。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.31</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.31</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.31</version>
</dependency>
package com.myspring.aop;
public interface Cal {
public int add(int num1, int num2);
public int sub(int num1,int num2);
public int mul(int num1,int num2);
public int div(int num1,int num2);
}
package com.myspring.aop;
import org.springframework.stereotype.Component;
@Component
public class CalImpl implements Cal{
@Override
public int add(int num1, int num2) {
// System.out.println("add的参数是" + num1 + "," + num2); //非业务代码
int result = num1 + num2;//业务代码
// System.out.println("add方法的结果是" + result); //非业务代码
return result;
}
@Override
public int sub(int num1, int num2) {
int result = num1 - num2;
return result;
}
@Override
public int mul(int num1, int num2) {
int result = num1 * num2;
return result;
}
@Override
public int div(int num1, int num2) {
int result = num1 / num2;
return result;
}
}
package com.myspring.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Objects;
@Component
@Aspect
@EnableAspectJAutoProxy //生成动态代理
public class LoggerAspect {
/**
* 参数日志
*/
// @Before("execution(public int com.myspring.aop.CalImpl.add(..))") //此时只对add方法生效
@Before("execution(public int com.myspring.aop.CalImpl.*(..))") //此时CalImpl中所有方法皆可输出
public void before(JoinPoint joinPoint){
String name = joinPoint.getSignature().getName();
String args = Arrays.toString(joinPoint.getArgs());
System.out.println(name + "的参数是" + args);
}
/**
* 结果日志
*/
@AfterReturning(value = "execution(public int com.myspring.aop.CalImpl.*(..))",returning = "result")
public void afterReturn(JoinPoint joinPoint, Object result){
String name = joinPoint.getSignature().getName();
System.out.println(name + "方法的结果是" + result);
}
}
package com.myspring.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// Cal cal = new CalImpl();
// System.out.println(cal.add(10, 1));
ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.myspring.aop");
Cal cal = (Cal) applicationContext.getBean("calImpl");
System.out.println(cal.add(1, 1));
System.out.println(cal.sub(5, 2));
System.out.println(cal.mul(3, 8));
System.out.println(cal.div(10, 2));
}
}
AOP基于IoC,将业务对象和切面对象分别注入到IoC中,同时业务对象只写业务代码,切面对象只写非业务代码,从而在代码层面实现业务代码和非业务代码的解耦合效果,通过IoC再将业务代码和非业务代码整合到一起即可,开发时解耦,运行时合并。
如何整合?
通过代理对象,将业务对象注入到IoC中,将切面对象也注入到IoC中,由IoC负责根据业务对象和切面对象创建出一个动态的代理对象,分别去完成业务代码和非业务代码的执行。
- 业务对象和切面对象必须注入到IoC中
- 切面对象需要添加切面注解以及动态代理注解 @Aspect @EnableAspectJAutoProxy
三、Spring MVC
Spring MVC是Spring全家桶的一款产品,对Java Web开发流程进行了封装,不需要再通过Servlet的方式来完成代码的开发,无论是代码量还是参数的接收,返回值等等各方面都做了优化。
Spring MVC是基于Spring框架的,基于IoC容器
Servlet:创建一个Servlet,接收客户端请求,完成相关的业务操作。
3.1 Spring MVC的使用
1.引入Spring MVC的依赖
<!--引入spring mvc的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.31</version>
</dependency>
2.web.xml文件中配置springmvc
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--Spring MVC的前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.创建springmvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 启用注解驱动,必须要有。Spring MVC 的 @RequestMapping 注解。
需要 <mvc:annotation-driven/> 来启用注解驱动的处理器映射和适配器。
没有它,Spring 根本不认识你的 @Controller 和 @RequestMapping-->
<mvc:annotation-driven />
<!-- 扫包 -->
<context:component-scan base-package="com.myspring.controller"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
4.创建控制器
package com.myspring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/index")
public String index(){
System.out.println("index......");
return "index";
}
}
3.2 Spring MVC传参数
Spring MVC会自动对request中的参数进行解析,类型转换。开发者只需要在方法定义处声明需要的参数类型格式,Spring MVC会自动对参数进行解析和转换。
3.3 Spring MVC 返回
- 视图
定义方法返回值类型为String,返回视图名称,同时结合视图解析器,将真正的视图资源返回给调用者。
- JSON数据
需要在方法定义处添加@RequestBody,方法中直接返回数据即可。
返回试图是前后端不分离的单体架构,返回JSON数据前后端分离的架构。
3.4 单体架构
- 返回视图
- 将业务数据同时带到前端
package com.myspring.controller;
import com.myspring.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/index")
public String index(Model model){
User user = new User();
user.setId(1);
user.setName("李四");
model.addAttribute("name","张三");
// model.addAttribute("user","User"); //String 没有 id/name 属性
model.addAttribute("user",user); //正常访问 ${user.id} 和 ${user.name}
return "index";
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%><!--可以把视图上的{name}转换成对应的值“张三”-->
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>${name}</h1>
<h2>${user.id}</h2>
<h2>${user.name}</h2>
</body>
</html>

四、MyBatis
MyBatis是ORM框架
4.1 pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
4.2 config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置项 -->
<settings>
<!--打印SQL-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!--MySQL 8.0 要用 com.mysql.cj.jdbc.Driver,不是 com.mysql.jdbc.Driver-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/car_rental_separate"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/myspring/mapper/NewsMapper.xml"></mapper>
</mappers>
</configuration>
4.3 创建实体类
package com.myspring.entity;
import lombok.Data;
import java.util.Date;
@Data
public class News {
private int id;
private String title;
private Date createtime;
private String opername;
private String content;
}
4.4 创建Mapper接口
package com.myspring.mapper;
import com.myspring.entity.News;
public interface NewsMapper {
public int add(News news);
}
4.5 接口对应的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.myspring.mapper.NewsMapper">
<!-- 你的映射语句 -->
<insert id="add" parameterType="com.myspring.entity.News">
insert into sys_news(title,content,createtime,opername) values (#{title},#{content},#{createtime},#{opername})
</insert>
</mapper>
4.6 使用
package com.myspring;
import com.myspring.entity.News;
import com.myspring.mapper.NewsMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.Date;
public class Test1 {
public static void main(String[] args) {
InputStream resourceAsStream = Test1.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取Mapper的代理对象
NewsMapper mapper = sqlSession.getMapper(NewsMapper.class);
News news = new News();
news.setTitle("测试");
news.setCreatetime(new Date());
news.setOpername("admin");
news.setContent("测试测试测试");
int add = mapper.add(news);
System.out.println(add);
sqlSession.commit();//提交到数据库
}
}
也可以将SQL直接添加到业务方法上
package com.myspring.mapper;
import com.myspring.entity.News;
import org.apache.ibatis.annotations.Insert;
public interface NewsMapper {
@Insert({"insert into sys_news(title,content,createtime,opername) values (#{title},#{content},#{createtime},#{opername})"})
public int add(News news);
}
更多推荐

所有评论(0)