SSM学习路线带答案(持续更新2020.5.11)

自学路线,也是复习路线,昨天学习到的知识是你的,再过3天就未必还是你的,温故而知新。

目录

如何构建第一个spring程序?

spring核心框架包功能

Spring IOC和DI是什么?

DI依赖注入的时机

Bean的生命周期

依赖注入的3种方式

ioc初始化过程

如何构建第一个springMvc程序?

SpringMvc流程


如何构建第一个Mybatis程序?

Mybatis原理

Mybatis一级缓存

Mybatis验证一级缓存

Mybatis配置顺序

Mybatis打印语句、Mybatis数据库驼峰映射pojo

Mybatis二级缓存



如何构建第一个spring程序?

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>

applicationContext.xml  放在resource下

<?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"
       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">

       <bean id="myBean" class="com.demo.MyBean">
        <property name="id" value="11"></property>
        <property name="name" value="test11"></property>
    </bean>
</beans>

Bean

package com.demo;

public class MyBean {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

 

Test

@RunWith(SpringJUnit4ClassRunner.class)//speing整合junits
@ContextConfiguration(locations = "classpath:applicationContext.xml")//加载配置文件
public class Test {
    @Resource
    private MyBean myBean;
    @org.junit.Test
    public void test(){
        System.out.println(myBean);
    }
}

也可以不用注解

import com.demo.MyBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Test {
  
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        MyBean bean=applicationContext.getBean(MyBean.class);
          System.out.println(bean);
    }
}

恭喜第一个spring程序成功:

MyBean{id=11, name='test11'}

spring核心框架包功能

Spring core :spring核心框架包,提供IOC容器,对bean进行管理。

Spring Context:提供上下文。

Spring web :提供web开发的上下文信息。

spring-jdbc:提供数据库支持。

Spring IOC和DI是什么?

IOC(Inversion of Control)权限控制反转,是一种设计模式,一种思想,获取对象的过程交给IOC容器(传统是new)。而DI(Dependency Injection)依赖注入相当于是IOC的一种具体的实现方式。

DI原理是反射,xml配置与bean依赖关系动态创建对象,因此叫依赖注入。

IOC\AOP原理

ioc:先利用反射生成实例,然后调用时主动注入。 aop:动态代理

DI依赖注入的时机

在ioc初始化过程后,依赖注入的过程是用户第一次向IOC容器索要bean时才触发。

如果配置了延迟加载 lazy-init=true,会在第一次getBean的时候才初始化bean,如果没配,默认false,会在spring容器启动的时候直接初始化(singleton bean)。

Bean的生命周期

实例化Bean:Ioc容器通过获取BeanDefinition对象中的信息进行实例化,实例化对象被包装在BeanWrapper对象中
设置对象属性(DI):通过BeanWrapper提供的设置属性的接口完成属性依赖注入;
注入Aware接口(BeanFactoryAware, 可以用这个方式来获取其它 Bean,ApplicationContextAware):Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean
BeanPostProcessor:自定义的处理(分前置处理和后置处理)
InitializingBean和init-method:执行我们自己定义的初始化方法
使用
destroy:bean的销毁
 

依赖注入的3种方式

 

 

ioc初始化过程

Resource 定位。我们一般用外部资源来描述 Bean 对象,所以在初始化 IOC 容器的第一步就是需要定位这个外部资源。
BeanDefinition 的载入和解析。装载就是 BeanDefinition 的载入。BeanDefinitionReader 读取、解析 Resource 资源,也就是将用户定义的 Bean 表示成 IOC 容器的内部数据结构:BeanDefinition。在 IOC 容器内部维护着一个 BeanDefinition Map 的数据结构,在配置文件中每一个都对应着一个BeanDefinition对象。
BeanDefinition 注册。向IOC容器注册在第二步解析好的 BeanDefinition,这个过程是通过 BeanDefinitionRegistery 接口来实现的。在 IOC 容器内部其实是将第二个过程解析得到的 BeanDefinition 注入到一个 HashMap 容器中,IOC 容器就是通过这个 HashMap 来维护这些 BeanDefinition 的。在这里需要注意的一点是这个过程并没有完成依赖注入,依赖注册是发生在应用第一次调用 getBean() 向容器索要 Bean 时。当然我们可以通过设置预处理,即对某个 Bean 设置 lazyinit 属性,那么这个 Bean 的依赖注入就会在容器初始化的时候完成。

 

如何构建第一个springMvc程序?

SpringMvc流程

(1):用户请求发送给DispatcherServlet,DispatcherServlet调用HandlerMapping处理器映射器;

(2):HandlerMapping根据xml或注解找到对应的处理器,生成处理器对象返回给DispatcherServlet;

(3):DispatcherServlet会调用相应的HandlerAdapter;

(4):HandlerAdapter经过适配调用具体的处理器去处理请求,生成ModelAndView返回给DispatcherServlet

(5):DispatcherServlet将ModelAndView传给ViewReslover解析生成View返回给DispatcherServlet;

(6):DispatcherServlet根据View进行渲染视图;

->DispatcherServlet->HandlerMapping->Handler ->DispatcherServlet->HandlerAdapter处理handler->ModelAndView ->DispatcherServlet->ModelAndView->ViewReslover->View ->DispatcherServlet->返回给客户

如何构建第一个Mybatis程序?

 

 mybatis-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>
        <!-- 打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 自动驼峰 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@//127.0.0.1/orcl"/>
                <property name="username" value="scott"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/DeptMapper.xml"/>
    </mappers>

</configuration>

 

public interface DeptMapper {

    Dept selectByPrimaryKey(Integer deptno);

}

 

<?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.dao.mapper.DeptMapper">
  <resultMap id="BaseResultMap" type="com.domain.Dept">
    <!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
    -->
    <id column="DEPTNO" jdbcType="DECIMAL" property="deptno" />
    <result column="DNAME" jdbcType="VARCHAR" property="dname" />
    <result column="LOC" jdbcType="VARCHAR" property="loc" />
  </resultMap>

  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    <!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
    -->
    select 
    <include refid="Base_Column_List" />
    from SCOTT.DEPT
    where DEPTNO = #{deptno,jdbcType=DECIMAL}
  </select>



</mapper>
public class MybatisTest {
	public static void main(String[] args) throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession  session = sqlSessionFactory.openSession();
		DeptMapper mapper = session.getMapper(DeptMapper.class);
		Dept dept = mapper.selectByPrimaryKey(10);
		System.out.println(dept);
	}
}

Mybatis原理

SqlSessionFactoryBuilder创建SqlSessionFactory,工厂模式创建SqlSession,再通过动态代理为接口生成代理对象,将mapper/xml里sql执行结果映射成pojo。 

Mybatis一级缓存

默认开启一级缓存,无法关闭。一级缓存是sqlsession级别的缓存,其实原理就是map上下文。生命周期:出现commit操作(增删改)的适合,一级缓存清空

Mybatis验证一级缓存



import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.cache.impl.PerpetualCache;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.snake.mybatis_demo.dao.mapper.DeptMapper;
import com.snake.mybatis_demo.dao.pojo.Dept;

public class MybatisTest {

	public static void main(String[] args) throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession  session = sqlSessionFactory.openSession();
		DeptMapper mapper = session.getMapper(DeptMapper.class);
		Dept dept = mapper.selectByPrimaryKey(10);
		System.out.println(dept);

		DeptMapper mapper1 = session.getMapper(DeptMapper.class);
		Dept dept1 = mapper.selectByPrimaryKey(10);
		System.out.println(dept1);
	}
}

 结果显示 查询语句只打印了一次

 

Mybatis配置顺序

只要知道Mybatis配置是由顺序的就行,不用死记硬背,鼠标移上去会提示。

Mybatis打印语句、Mybatis数据库驼峰映射pojo

<?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>
        <!-- 打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 自动驼峰 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

Mybatis二级缓存

二级缓存跨Sqlsession,是mapper级别的缓存,多个sqlsession操作同一个mapper,共用二级缓存。原理:底层还是HashMap

同样地,只有select才会缓存,增删改则刷新缓存。

如何实现:

<setting name="cacheEnabled" value="true"/>    <!-- 二级缓存开启 -->

开启二级缓存还必须POJO对象要实现Serializable接口,否则会抛出异常。 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值