花样提问

Mybatis系列:

1.resultType和parmeterType可以传递哪些类型的参数:

  • resultType: 输出参数类型
    1. 简单数据类型(基本数据类型和String类型)
    2. pojo对象类型
    3. pojo对象列表类型
  • parameterType: 输入参数类型
    1. 简单数据类型(基本数据类型和String类型)
    2. pojo对象类型
    3. 封装类

2. #{}与${}的区别:

  • #{}: 占位符
    1. 如果传入的参数是简单数据类型时,其中param可以随意起名
    2. 如果传入的参数是pojo封装类对象,其中的param只能是对象中的属性名
  • ${}: 字符串的拼接
    1. 如果传入的参数是简单数据类型时,其中param必须是value
    2. 如果传入的参数是pojo封装类对象,其中的param只能是对象中的属性名
    3. 对比占位符方式,存在SQL注入的问题

3.Mapper代理开发模式要求:

  1. 接口的名称与映射配置文件的名称必须一致
  2. 接口的类路径与映射配置文件的目录结构要一致
  3. 映射配置文件中的namespace必须是对应接口的全限定类名
  4. 接口中的方法名与映射配置文件中的statement对象的id一致
  5. 接口中的参数与映射配置文件中的statement对象中parameterType类型一致
  6. 接口中方法的返回值类型与映射配置文件中的statement对象中的resultType类型一致

4.resultMap与resultType区别:

  • resultMap: 自定义封装结果类型
    • 当封装的属性与查询的字段不能够对应时,我们需要自定义resultMap来指定对象的属性与查询字段一一对应
  • resultType: 输出参数类型
    • 当封装的属性与查询的字段一一对应时, 我们选择直接使用resultType来接受结果集

5.resultMap的参数说明:

<mapper namespace="com.itheima.mapper.AccountMapper">
    <resultMap id="唯一标识" type="封装的结果类型">
        <!-- 主键属性 -->
        <id property="封装对象的属性名" column="查询的列名"></id>
        <!-- 普通属性 -->
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
    </resultMap>

6.Mybatis核心配置文件说明:

<configuration>
    <!-- 引入外部配置文件 -->
    <properties resource="jdbcConfig.properties"/>
    <!-- 开启缓存 -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!-- 配置别名 -->
    <typeAliases>
        <!-- 方式一: 单个设置别名 -->
        <!--<typeAlias type="com.itheima.domain.Account" alias="user"/>-->
        <!-- 方式二: 批量设置别名,指定到包,当前包下的所有类默认是以类名作为别名,而且不区分大小写 (常用) -->
        <package name="com.itheima.domain"/>
    </typeAliases>
    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置mysql的环境 -->
        <environment id="mysql">
            <!-- 配置事物的类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}" />
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 指定dao接口所在位置 -->
    <mappers>
        <package name="com.itheima.dao"/>
    </mappers>
</configuration>

7.Mybatis条件查询注意事项:

  1. 当传入参数是对象时,直接使用对象的属性做判断条件
  2. 当传入参数是简单数据类型时,使用value作为判断条件
  3. 当传入参数是List集合时,parameterType使用list来接收参数,使用list作为判断条件,遍历时使用list作为集合遍历
  4. 当传入参数是数组时,parameterType使用list来接收参数,使用array作为判断条件,遍历时使用array作为数组遍历
<!-- 条件查询
        where标签: 等同where 1 = 1恒等式和第一个条件的逻辑关键词(and or)
        if 标签: 用于判断
        属性:
            test:是必须的   判断的结果true或者false
        1.当传入参数是对象时,直接使用对象的属性做判断条件
        2.当传入参数是简单数据类型时,使用value作为判断条件
        3.当传入参数是List集合时,parameterType使用list来接收参数,使用list作为判断条件,遍历时使用list作为集合遍历
        4.当传入参数是数组时,parameterType使用list来接收参数,使用array作为判断条件,遍历时使用array作为数组遍历
     -->
    <select id="findById" parameterType="list" resultType="user">
        select * from user
        <where>
            <if test="list != null and list.size() > 0">
                <foreach collection="list" open="and id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

8.延迟加载和立即加载:

  • 概念:
    • 延迟加载: 需要时加载,不需要时不加载,按需加载(懒加载)
    • 立即加载: 需不需要都一次性加载
  • 全局延迟加载配置方式:
<!--在核心配置文件中开启全局延迟加载-->
 <settings>
        <!--配置mybatis日志显示-->
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <!--配置全局延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
</settings>
  • 局部延迟加载配置方式:
<!--
    在需要采取延迟加载的地方设置fetchType属性(不需要开启全局延迟加载,如果开启全局延迟加载,fetchType会覆盖全局)
        lazy:延迟加载
        eager:立即加载
-->
<association property="user" javaType="user" column="user_id" select="com.itheima.mapper.UserMapper.findById" fetchType="lazy"/>

9.Mybatis的缓存:

  • 一级缓存(默认开启):
    • 位置: 存在SqlSession对象中
    • 清除一级缓存的方法:
      1. close()
      2. clearCache()
      3. 执行更新操作
  • 二级缓存:
    • 位置: 存在SqlSessionFactory对象中,同一个SqlSessionFactory对象创建的SqlSession对象共享其缓存
    • 清除二级缓存的方法:
      1. useCache属性(false: 当前select查询禁用二级缓存)
      2. flushCache: 刷新二级缓存
      3. 执行更新操作
    • 开启方式:
      1. 在核心配置文件中开启(默认是开启的)
      2. 在需要使用二级缓存的映射文件中使用<cache/>开启缓存支持

Spring框架:

1.耦合与解耦:

  • 耦合: 程序间的依赖关系
    • 包括:
      • 类之间的依赖
      • 方法之间的依赖
  • 解耦:
    • 降低程序间的依赖关系
    • 减少程序间的耦合
  • 实际开发中:
    • 应该做到: 编译器不依赖, 运行时才依赖
  • 解偶的思路:
    1. 使用反射来创建对象,而避免使用new关键字。
    2. 通过读取配置文件来获取要创建的对象全限定类名

2.BeanFactory和ApplicationContext区别:

  • BeanFactory是Spring容器中的顶层接口, ApplicationContext是它的子接口
  • 区别: 创建对象的时间点不一样
    • BeanFactory:采用延迟加载的方式, 使用多例
    • ApplicationContext: 采用立即加载的方式, 使用单例-------常用接口

3.ApplicationContext接口的实现类:

  1. ClassPathXmlApplicationContext: 从类的根路径下加载配置文件-------------推荐使用
  2. FileSystemXmlApplicationContext: 从磁盘路径上加载配置文件,配置文件可以存在磁盘的任意位置
  3. AnnotationConfigApplicationContext: 当使用注解配置容器对象时,需要使用此类来创建Spring容器,用来读取注解

4.创建Bean的三种方式:

  1. 默认构造函数创建
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
  2. 普通工厂方法创建(使用某个类中的方法创建对象,并存入Spring容器)
    <bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>
    <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
    • 原理: 先把工厂的创建交给spring来管理, 然后再使用工厂的bean来调用里面的方法
    • factory-bean: 用来指定实例工厂bean的id
    • factory-method: 指定实例工厂中创建对象的方法
  3. 静态工厂方法创建(使用某个类中的静态方法创建对象,并存入Spring容器)
    <bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="getAccountService"></bean>
    • 原理: 使用staticFactory类中的静态方法创建对象,并存入spring容器
    • id: 指定bean的id,用于从容器中获取
    • class: 指定静态工厂的全限定类名
    • factory-method: 指定生产对象的静态方法

5.Bean标签详解:

  • 作用:
    • 用于配置对象让spring来创建的, 默认情况下调用的是类中的无参构造函数, 如果没有无参构造函数则不能创建成功.
  • 属性:
    • id: 给对象在容器中提供一个唯一标识, 用于获取对象
    • class: 类的全限定类名, 用于反射创建对象, 默认情况下调用无参构造函数
    • scope: 指定对象的作用范围
      1. singleton: 默认值, 单例的
      2. prototype: 多例的
      3. request: Web项目中,Spring创建一个Bean的对象,将对象存入到request域中
      4. session: Web项目中,Spring创建一个Bean的对象,将对象存入到session域中
      5. global session: 全局session对象,应用在Portlet(基于Java的Web组件)环境, 如果没有Portlet环境那么global session相当于session
    • init-method: 指定类中的初始化方法名称
    • destory-method: 指定类中销毁方法名称

6.Bean的作用范围和生命周期:

  • 单例对象: scope="signleton"
    • 一个应用只有一个对象的实例, 它的作用范围就是整个引用.
    • 生命周期:
      • 出生: 当应用加载, 创建容器时, 对象就被创建了
      • 活着: 只要容器在, 对象一直活着
      • 死亡: 当应用卸载, 销毁容器时, 对象就被销毁了
  • 多例对象:scope="prototype"
    • 每次访问对象时, 都会重新创建对象实例
    • 生命周期:
      • 出生: 当使用对象时, 创建新的对象实例
      • 活着: 只要对象在使用中, 就一直活着
      • 死亡: 当对象长时间不用时, 被java的垃圾回收器回收了

6.DI的依赖注入:

  • 注入值得类型:
    1. 简单数据类型(基本数据类型和String)
    2. Pojo对象类型
    3. 复杂数据类型(数组, List, Set, Map, Properties)
      • 注意: 同一类型注入值时标签通用
        • List类型: 数据, List, Set
        • Map类型: Map, Properties
  • 注入值得方式:
    1. setter方法(set方法)注值
    2. 构造函数注值:
      • type: 参数类型
      • index: 参数位置(从0开始)
      • name: 参数名(常用)
      • value: 普通数据复制直接使用value赋值
      • ref: 对象类型注值使用ref引用IOC容器中已有Bean对象




posted @ 2019-03-15 08:12  Crazy丶Harsh  阅读(174)  评论(0)    收藏  举报