一、集合

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);
}

更多推荐