一、集合

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

更多推荐