Mybatis系列:
1.resultType和parmeterType可以传递哪些类型的参数:
resultType: 输出参数类型
- 简单数据类型(基本数据类型和String类型)
- pojo对象类型
- pojo对象列表类型
parameterType: 输入参数类型
- 简单数据类型(基本数据类型和String类型)
- pojo对象类型
- 封装类
2. #{}与${}的区别:
#{}: 占位符
- 如果传入的参数是简单数据类型时,其中param可以随意起名
- 如果传入的参数是pojo封装类对象,其中的param只能是对象中的属性名
${}: 字符串的拼接
- 如果传入的参数是简单数据类型时,其中param必须是
value
- 如果传入的参数是pojo封装类对象,其中的param只能是对象中的属性名
- 对比占位符方式,存在
SQL注入的问题
3.Mapper代理开发模式要求:
- 接口的
名称与映射配置文件的名称必须一致
- 接口的
类路径与映射配置文件的目录结构要一致
- 映射配置文件中的
namespace必须是对应接口的全限定类名
- 接口中的
方法名与映射配置文件中的statement对象的id一致
- 接口中的
参数与映射配置文件中的statement对象中parameterType类型一致
- 接口中方法的
返回值类型与映射配置文件中的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条件查询注意事项:
- 当传入参数是
对象时,直接使用对象的属性做判断条件
- 当传入参数是
简单数据类型时,使用value作为判断条件
- 当传入参数是
List集合时,parameterType使用list来接收参数,使用list作为判断条件,遍历时使用list作为集合遍历
- 当传入参数是
数组时,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对象中
- 清除一级缓存的方法:
- close()
- clearCache()
- 执行更新操作
- 二级缓存:
- 位置: 存在SqlSessionFactory对象中,同一个SqlSessionFactory对象创建的SqlSession对象共享其缓存
- 清除二级缓存的方法:
- useCache属性(false: 当前select查询禁用二级缓存)
- flushCache: 刷新二级缓存
- 执行更新操作
- 开启方式:
- 在核心配置文件中开启(默认是开启的)
- 在需要使用二级缓存的映射文件中使用
<cache/>开启缓存支持
Spring框架:
1.耦合与解耦:
- 耦合: 程序间的依赖关系
- 解耦:
- 实际开发中:
- 解偶的思路:
- 使用反射来创建对象,而避免使用new关键字。
- 通过读取配置文件来获取要创建的对象全限定类名
2.BeanFactory和ApplicationContext区别:
- BeanFactory是Spring容器中的顶层接口, ApplicationContext是它的子接口
- 区别: 创建对象的时间点不一样
BeanFactory:采用延迟加载的方式, 使用多例
ApplicationContext: 采用立即加载的方式, 使用单例-------常用接口
3.ApplicationContext接口的实现类:
ClassPathXmlApplicationContext: 从类的根路径下加载配置文件-------------推荐使用
FileSystemXmlApplicationContext: 从磁盘路径上加载配置文件,配置文件可以存在磁盘的任意位置
AnnotationConfigApplicationContext: 当使用注解配置容器对象时,需要使用此类来创建Spring容器,用来读取注解
4.创建Bean的三种方式:
- 默认构造函数创建
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
- 普通工厂方法创建(使用某个类中的方法创建对象,并存入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: 指定实例工厂中创建对象的方法
- 静态工厂方法创建(使用某个类中的静态方法创建对象,并存入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: 指定对象的作用范围
singleton: 默认值, 单例的
prototype: 多例的
request: Web项目中,Spring创建一个Bean的对象,将对象存入到request域中
session: Web项目中,Spring创建一个Bean的对象,将对象存入到session域中
global session: 全局session对象,应用在Portlet(基于Java的Web组件)环境, 如果没有Portlet环境那么global session相当于session
init-method: 指定类中的初始化方法名称
destory-method: 指定类中销毁方法名称
6.Bean的作用范围和生命周期:
- 单例对象:
scope="signleton"
- 一个应用只有一个对象的实例, 它的作用范围就是整个引用.
- 生命周期:
- 出生: 当应用加载, 创建容器时, 对象就被创建了
- 活着: 只要容器在, 对象一直活着
- 死亡: 当应用卸载, 销毁容器时, 对象就被销毁了
- 多例对象:
scope="prototype"
- 每次访问对象时, 都会重新创建对象实例
- 生命周期:
- 出生: 当使用对象时, 创建新的对象实例
- 活着: 只要对象在使用中, 就一直活着
- 死亡: 当对象长时间不用时, 被java的垃圾回收器回收了
6.DI的依赖注入:
- 注入值得类型:
- 简单数据类型(基本数据类型和String)
- Pojo对象类型
- 复杂数据类型(数组, List, Set, Map, Properties)
- 注意: 同一类型注入值时标签通用
- List类型: 数据, List, Set
- Map类型: Map, Properties
- 注入值得方式:
- setter方法(set方法)注值
- 构造函数注值:
type: 参数类型
index: 参数位置(从0开始)
name: 参数名(常用)
value: 普通数据复制直接使用value赋值
ref: 对象类型注值使用ref引用IOC容器中已有Bean对象