MyBatis 知识点梳理
简单地梳理下MyBatis相关的知识点,主要想让自己重新捡起以前学的框架,如果能给广大程序猿朋友有所帮助那就更好了。有疏漏的地方也欢迎大家评论指出。闲言少叙,进入正题。。。。。。。
MyBatis知识梳理
简介(百度,随便看看)
- MyBatis最早源自Apache基金会的一个开源项目iBatis,2010年这个项目有Apache software foundation迁移到了google code,并且改名为MyBatis。
- MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
- MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
- MyBatis使用简单地XML或注解做配置和定义映射关系,将Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。
MyBatis体系结构中的几个关键部分
- 加载配置 —— 可以是XML配置文件方式,也可以是Java代码的注释。MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句、结果映射配置) ,并将其存储在内存中
- SQL解析 —— 当API接口层接收到调用请求时,会收到传入SQL的ID和传入对象(Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
- SQL执行 —— 将得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
- 结果映射 —— 将结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
MyBatis的配置文件
- SqlMapConfig.xml(1个):主配置文件,用于指定数据库连接参数和框架参数
<?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>
<!-- 全局别名,之后映射文件引用可以使用PersonEntity代替com.maven.mybatis.entity.PersonEntity-->
<typeAliases>
<typeAlias type="com.maven.mybatis.entity.PersonEntity" alias="PersonEntity"/>
</typeAliases> <environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- 指定映射定义文件 -->
<mappers>
<mapper resource="com/maven/mybatis/mapper/PersonEntityMapper.xml"/>
</mappers> </configuration> - SqlMap.xml(n个):映射定义文件,用于定义SQL语句和映射信息
!!注:namespace有重要作用,不要重复,调用此文件定义增删改查操作是需要指定namespace;
<?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.maven.mybatis.mapper.PersonEntityMapper">
<select id="queryAll" resultType="PersonEntity">
select * from t_person
</select> <insert id="insert" parameterType="PersonEntity">
insert into t_person(id, name) values(#{id}, #{name})
</insert> </mapper>
MyBatis框架主要API简介
- SqlSessionFactoryBuilder:该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例
- SqlSessionFactory:每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。
- SqlSession:该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句。
MyBatis基本应用
- 搭建MyBatis技术环境
- 为工程添加MyBatis开发包和数据库驱动包
- 在src下添加MyBatis配置文件SqlMapConfig.xml
- 修改SqlMapConfig.xml,指定数据库连接参数
- 利用MyBatis API编程,获取SqlSession实例
- 获取SqlSession对象
String conf = "SqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource); //创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
//通过SessionFactoryBuilder对象获取SqlSessionFactory
SqlSessionFactory sf = sfb.build(in); //创建Session
SqlSession session = sf.openSession(); - 实现CRUD操作
- 添加操作
SqlMap.xml定义<!--parameterType因为前面定义过Alias所以不需要写包名,否则要写全包名加类名-->
<insert id="insert" parameterType="PersonEntity">
insert into t_person(id, name) values(#{id}, #{name})
</insert>id属性:用于表示映射文件的sql,可以理解为MappedStatement的id
#{}:标识一个占位符
parameterType:指定输入参数的类型
#{name}:其中name表示输入的参数,参数名为name;如果输入参数为简单类型,#{}中参数可以任意。
Java代码
//NAMESPACE为SqlMapper.xml文件根标签的namespace属性
SqlSession session = sf.openSession(); //第一个参数:指映射文件的id值:namespace.id
//第二个参数:指映射文件中匹配parameterType类型的实参
session.insert(NAMESPACE + ".insert", person); session.commit();
session.close(); - 添加后返回主键
- mysql自增主键返回,mysql每次在调用完一个INSERT语句时会自动生成一个自增主键,可以通过函数LAST_INSERT_ID()获取到插入记录的自增主键。
<insert id="insert" parameterType="PersonEntity">
<!--查询后将自增主键返回到实体对象-->
<selectKey keyProperty="id" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO t_person(name) VALUES(#{name})
</insert>keyProperty属性:配置返回user对象的属性名
order属性:配置相对于insert语句执行前或执行后
resultType:指定结果类型 - 非自增主键返回,使用UUID()函数。在INSERT语句之前执行UUID函数,再将结果插入到INSERT语句中作为主键(主键必须是字符串类型,长度至少是35位)
<insert id="insert" parameterType="PersonEntity">
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT REPLACE(UUID(),'-','')
</selectKey>
INSERT INTO t_person(id, name) VALUES(#{id},#{name})
</insert> - Oracle中自增主键返回
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT 序列名.nextVal()
</selectKey>
- mysql自增主键返回,mysql每次在调用完一个INSERT语句时会自动生成一个自增主键,可以通过函数LAST_INSERT_ID()获取到插入记录的自增主键。
- 更新操作
SqlMap.xml定义<update id="update" parameterType="PersonEntity">
update t_person set name=#{name} where id=#{id}
</update >Java代码
SqlSession session = sf.openSession();
session.update(NAMESPACE + ".update", person); session.commit();
session.close(); 删除操作
SqlMap.xml定义
<delete id="delete" parameterType="int">
delete from t_person where id=#{id}
</select>Java代码
SqlSession session = sf.openSession();
session.delete(NAMESPACE + ".delete", 100); session.commit();
session.close();- 查询操作
SqlMap.xml定义<!--查询单行记录-->
<select id="queryById" parameterType="int" resultType="PersonEntity">
select * from t_person
</select> <!--查询多行记录-->
<select id="queryAll" resultType="PersonEntity">
select * from t_person
</select> <!--查询返回Map类型查询结果-->
<select id="queryPerson" parameterType="int" resultType="java.util.HashMap">
select id, name from t_person where id=#{id}
</select>resultType:指定sql输出结果映射的java对象类型,select指定resultType表示单条记录映射程度额Java对象。
${}:表示拼接sql字符串,如select * from t_person where name like '%${value}%'
${value}:接受输入参数的内容;如果传入的类型是简单类型,只能使用valueJava代码
SqlSession session = sf.openSession();
/*
//查询单行记录
PersonEntity person = (PersonEntity)session.selectOne(NAMESPACE + ".queryById", 100); //返回Map查询结果
Map map = (Map)session.selectOne("queryPerson", 100);
*/
//查询多行记录
List<PersonEntity> personList = session.selectList(NAMESPACE + ".queryAll"); session.commit();
session.close();
- 添加操作
- MyBatis实现分页查询 —— 在使用SqlSession的selectList()方法时,指定一个RowBounds分页器参数,即可查询指定范围的记录。提示:MyBatis分页是基于内存分页,原理是查询出所有记录,然后基于jdbc的absolute()和next()方法定位获取部分记录,因此在遇到大量数据情况下,不推荐使用MyBatis自带分页功能。需要开发者指定分页查询的SQL语句或对MyBatis进行扩展使用。
- RowBounds(offset, limit)
- offset指定抓取记录的起始行,从0开始
- limit指定抓取记录的数量 - 使用方法:sqlSession.selectList(SQL的ID, 参数, RowBounds对象);
- RowBounds(offset, limit)
- Mapper映射器:是开发者创造绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得。
SqlSession session = sqlSessionFactory.openSession();
PersonMapper mapper = session.getMapper(PersonEntity.class); session.close();PersonMapper接口定义:
public interface PersonMapper{
public List<PersonEntity> queryAll();
public PersonEntity queryById(int id);
public void insert(Person person);
public void update(Person person);
public void delete(int id);
//!提示:Mapper接口中的方法名要和SqlMap.xml中的SQL的id保持一致
}遵循如下规范,MyBatis会自动给我们创建实现该接口的代理对象
- 在mapper.xml的namespace属性值必须是mapper接口的全路径
- mapper接口中的方法名必须和mapper.xml文件中的id值相同
- mapper接口中的输入参数类型必须和mapper.xml中statement中的parameterType类型相同
- mapper接口中的方法的返回值类型和mapper.xml中statement中的resultType的类型相同 - ResultMap映射定义
在SqlMap.xml定义<select>操作时,如果查询结果字段名和Java POJO属于不一致时,需要使用<resultMap>元素显示指定映射关系,例如<select id="queryAll1" resultMap="personMap">
select id, name from t_person
</select> <resultMap id="personMap" type="PersonEntity">
<result property="no" column="id" />
<result property="username" column="name" />
</resultMap>
- SqlMapConfig.xml核心配置文件介绍
- properties属性
- 这个属性标签可以用来引用外部的properties的文件
- MyBatis会按一定顺序来加载属性:1)优先读取properties标签体内定义的属性。2)然后读取properties标签中的resource或url属性,并且会覆盖已读取的同名属性。3)最后读取parameterType传递的属性,它会覆盖已读取的同名属性。<!-- 引用外部propertes文件替代硬编码的jdbc配置 -->
<properties resource="db.properties"></properties>
<!-- 因为将来要和spring进行整合,这部分用不上了 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc的事务,由mybatis管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池配置,由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> - settings(全局配置参数):在myBatis框架在运行时可以调整一些运行参数
- properties属性
设置参数 |
描述 |
有效值 |
默认值 |
cacheEnabled |
该配置影响的所有映射器中配置的缓存的全局开关。 |
true | false |
true |
lazyLoadingEnabled |
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 |
true | false |
false |
aggressiveLazyLoading |
当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。 |
true | false |
true |
multipleResultSetsEnabled |
是否允许单一语句返回多结果集(需要兼容驱动)。 |
true | false |
true |
useColumnLabel |
使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 |
true | false |
true |
useGeneratedKeys |
允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 |
true | false |
False |
autoMappingBehavior |
指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 |
NONE, PARTIAL, FULL |
PARTIAL |
autoMappingUnknownColumnBehavior |
Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target. NONE: Do nothing WARNING: Output warning log (The log level of 'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' must be set to WARN) FAILING: Fail mapping (Throw SqlSessionException) |
NONE, WARNING, FAILING |
NONE |
defaultExecutorType |
配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 |
SIMPLE REUSE BATCH |
SIMPLE |
defaultStatementTimeout |
设置超时时间,它决定驱动等待数据库响应的秒数。 |
Any positive integer |
Not Set (null) |
defaultFetchSize |
Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. |
Any positive integer |
Not Set (null) |
safeRowBoundsEnabled |
允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false. |
true | false |
False |
safeResultHandlerEnabled |
允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false. |
true | false |
True |
mapUnderscoreToCamelCase |
是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 |
true | false |
False |
localCacheScope |
MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 |
SESSION | STATEMENT |
SESSION |
jdbcTypeForNull |
当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 |
JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER |
OTHER |
lazyLoadTriggerMethods |
指定哪个对象的方法触发一次延迟加载。 |
A method name list separated by commas |
equals,clone,hashCode,toString |
defaultScriptingLanguage |
指定动态 SQL 生成的默认语言。 |
A type alias or fully qualified class name. |
org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls |
指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。 |
true | false |
false |
logPrefix |
指定 MyBatis 增加到日志名称的前缀。 |
Any String |
Not set |
logImpl |
指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 |
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING |
Not set |
proxyFactory |
指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 |
CGLIB | JAVASSIST |
JAVASSIST (MyBatis 3.3 or above) |
vfsImpl |
Specifies VFS implementations |
Fully qualified class names of custom VFS implementation separated by commas. |
Not set |
useActualParamName |
Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) |
- typeAliases(类型别名)
- 在映射文件中,会定义很多的statement,需要parameterType指定大量的类型,这些类型的全路径太长,这个时候为了开发方便,可以为这些类型取一个别名(单个修改)<!-- 指定类的别名 -->
<typeAliases>
<typeAlias alias="User" type="cn.konrad.mapper.User"/>
</typeAliases>
-------------------------------------------------------------------
<select id="findUserById" parameterType="int" resultType="User">
SELECT * FROM t_user WHERE id=#{id}
</select>- 批量修改(给一个包取名,定义之后,映射文件中大小写均可,它会自动地到该包下找类)
<!-- 指定包的别名 -->
<typeAliases>
<package name="cn.konrad.mapper"/>
</typeAliases>
----------------------------------------------------
<select id="findUserById" parameterType="int" resultType="User">
SELECT * FROM t_user WHERE uid=#{uid}
</select>- 对于普通的 Java 类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载 的名字,要注意原生类型的特殊处理。
别名
映射的类型
_byte
byte
_long
long
_short
short
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short
Short
int
Integer
integer
Integer
double
Double
float
Float
boolean
Boolean
date
Date
decimal
BigDecimal
bigdecimal
BigDecimal
object
Object
map
Map
hashmap
HashMap
list
List
arraylist
ArrayList
collection
Collection
iterator
Iterator
- typeAliases(类型别名)
- typeHandler(类型处理器):在mybatis通过类型处理器来完成jdbc类型对Java类型的装换
类型处理器 |
Java 类型 |
JDBC 类型 |
BooleanTypeHandler |
java.lang.Boolean, boolean |
数据库兼容的 BOOLEAN |
ByteTypeHandler |
java.lang.Byte, byte |
数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler |
java.lang.Short, short |
数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler |
java.lang.Integer, int |
数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler |
java.lang.Long, long |
数据库兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler |
java.lang.Float, float |
数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler |
java.lang.Double, double |
数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler |
java.math.BigDecimal |
数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler |
java.lang.String |
CHAR, VARCHAR |
ClobReaderTypeHandler |
java.io.Reader |
- |
ClobTypeHandler |
java.lang.String |
CLOB, LONGVARCHAR |
NStringTypeHandler |
java.lang.String |
NVARCHAR, NCHAR |
NClobTypeHandler |
java.lang.String |
NCLOB |
BlobInputStreamTypeHandler |
java.io.InputStream |
- |
ByteArrayTypeHandler |
byte[] |
数据库兼容的字节流类型 |
BlobTypeHandler |
byte[] |
BLOB, LONGVARBINARY |
DateTypeHandler |
java.util.Date |
TIMESTAMP |
DateOnlyTypeHandler |
java.util.Date |
DATE |
TimeOnlyTypeHandler |
java.util.Date |
TIME |
SqlTimestampTypeHandler |
java.sql.Timestamp |
TIMESTAMP |
SqlDateTypeHandler |
java.sql.Date |
DATE |
SqlTimeTypeHandler |
java.sql.Time |
TIME |
ObjectTypeHandler |
Any |
OTHER 或未指定类型 |
EnumTypeHandler |
Enumeration Type |
VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler |
Enumeration Type |
任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。 |
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- transactionManager(事务管理器)
- dataSource(数据源)
- mappers(映射器)
- <mapper resource="" /> 相对于类路径,如<mapper resource="cn/konrad/mybatis/UserMapper.xml"/>
- <mapper url="" /> 使用绝对路径(完全限定路径),如<mapper url="file:///
D:\workSpace\mybatis\bin\cn\konrad\mapper\UserMapper.xml"/>
- <mapper class="" /> 使用mapper接口路径,此方法要求mapper接口与映射文件名称相同且存放在完全相同的目录下,如<mapper class="cn.konrad.mapper.UserMapper"/>
- MyBatis动态SQL:对SQL进行判断、拼接、组装
- if判断
<!-- if判断 -->
<select id="findUsersByCriteria" parameterType="User"
resultType="User">
SELECT * FROM t_user
<!-- 这个where标签会自动的删除第一个AND -->
<where>
<if test="name!=null and name!=''">
AND name like '%${name}%'
</if>
<if test="age!=null and age!=''">
AND age=#{age}
</if>
</where>
</select> - Sql片段:当我们通过条件查询用户所有信息,和通过条件查询所有用户的数量
<!-- 定义sql片段
id属性:表示sql片段的唯一标识
一定要基于单标操作定义sql片段,这样这个sql片段的可重用性才高
在sql片段中不要包括where条件
-->
<sql id="query_user_where">
<if test="name!=null and name!=''">
AND name like '%${name}%'
</if>
<if test="age!=null and age!=''">
AND age=#{age}
</if>
</sql> <!--引用sql片段-->
<where>
<!-- refid用来引用sql片段的id值,如果该sql片段不在本配置文件中需要加namespace的值 -->
<include refid="query_user_where"></include>
</where> - foreach:向sql传递数组或list时,用foreach构建SQL
<delete id="deleteBatch">
delete from user where id in
<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>- collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为数组,所以值为array
- item:表示在迭代过程中每次迭代到的位置(下标)- index:
- open:前缀
- close:后缀
- separator:分隔符,表示迭代时每个元素之间以什么分隔
- if判断
- 一对一映射
- resultType实现较为简单,对于多表映射中只要增加其他勒种属性即可完成映射。但是会新增一个子类,如果对查询结果没有要求可以用它。
- resultMap实现较为复杂,需要自定义resultMap。但是不需要新增子类,用我们传统的对象模型即可完成映射,并且支持延迟加载的功能,而resultType不支持。
<resultMap type="cn.chinasofti.entity.Orders" id="resultMapOrder">
<!-- 配置Order主类信息 -->
<id column="id" property="id"/>
<result column="note" property="note"/>
<result column="createdate" property="createdate"/> <association property="user" javaType="User">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<result column="birthday" property="birthday"/>
</association>
</resultMap> <select id="findOrderUserWithResultMap" resultMap="resultMapOrder">
SELECT 语句
</select>- association属性:配置关联的表
- javaType属性:代表映射表中的实体对象的真实类型
- 一对多映射
<resultMap type="User" id="resultMapUser">
<!-- 配置User信息 -->
<id column="_uid" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/> <!-- 配置Orders集合信息 -->
<collection property="orders" ofType="Orders">
<id column="_oid" property="id"/>
<result column="createdate" property="createdate"/>
<result column="note" property="note"/>
</collection>
</resultMap> <select id="findUserOrders" resultMap="resultMapUser">
SELECT 语句
</select>- ofType属性:申明的是集合中元素的类型
!注意:当两个表的主键列名相同时,在配置的时候一定要为其配置一个别名,否者该类查询出的集合中只有一条数据 - 多对多映射(与一对多类似,在映射的两个映射文件中添加collection集合配置)
- 延迟加载:默认是没有开启延迟加载的,需要在核心配置文件中配置
<!-- 开启延迟加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings> - 一级缓存:默认开启,是基于SqlSession范围的缓存
- 二级缓存:默认不支持二级缓存,是基于Mapper范围的缓存
暂时就先写到这,后续有补充的继续修正。欢迎各位猴子(猿)们指正补充!
MyBatis 知识点梳理的更多相关文章
- Javascript重要知识点梳理
Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...
- Memcache知识点梳理
Memcache知识点梳理 Memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...
- Mybatis知识点总结
---恢复内容开始--- Mybatis知识点总结 1.#{}和${}的区别是什么? 答:#{}的使用场景:在表的sql映射文件中如下使用: <mapper namespace="co ...
- [独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(九)数据库常用对象之package
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(八)常见Exception
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table、View
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
随机推荐
- Redis + Redis-sentinel + keepalived部署过程
1 Redis缓存服务 Redis是一个key-value存储系统.与memcached一样,为了保证效率,数据都是缓存在内存中的.区别的是redis支持周期性的把更新的数据写入磁盘或者把修改操作 ...
- leetcode-137-Single Number II-第二种解法
题目描述: 详细的题目描述见上一篇博客<leetcode-137-Single Number II-第一种解法>,这里简单说一下. 有一个数组,所有元素都出现了三次,除了一个元素只出现了一 ...
- SQL总结----存储过程
概念 存储过程(Stored Procedure):已预编译为一个可执行过程的一个或多个SQL语句. 创建存储过程语法 CREATE proc | procedure procedure_name [ ...
- 海思3519A 移植 Qt 5.5.1
源码下载 网址:qt-everywhere-opensource-src-5.5.1.tar.gz 配置生成MakeFile 文件 解压源码包,在源码包路径下生成配置 MakeFile : ./con ...
- python脚本中appium的自启动自关闭
前提:已安装appium命令行版本 将appium的启动及其关闭直接写在脚本中,运行起来会方便很多 创建startAppiumServer.bat 和 stopAppiumServer.bat文件,然 ...
- Git服务器搭建笔记
前言:最近公司要使用git服务器对Android4.4的源码进行版本控制,所以花了些时间在Ubuntu14.04上搭建了git服务器,正好前段时间也学习了下git的使用哈哈 ------------- ...
- SCTP
流控制传输协议是为了替代UDP.TCP实现七号信令传输的. HS DPA high speed download packet access. HS UPA ... 通信人 Orthogonal f ...
- web及时通信传输的几种方法
有哪些: 轮询.长轮询.iframe流.websocket 轮询:http的请求有一个很明显的缺点,就是只能有客户端发起,不能由服务端主动推送,所以轮询就是定时向服务器发送请求,去获取数据 优点:传输 ...
- Centos 7搭建Gitlab服务器(一),搭配文章(二)一起使用,效果更好
一. 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 1.安装ss ...
- U盘拷贝大文件提示文件过大无法拷贝解决方案
工具: 计算机 windows操作系统 U盘 原因:由于U盘的格式问题导致的,当期的磁盘格式是FAT32类型的,无拷贝过大的文件 方法:接下来修改U盘类型,且不格式化U盘 1.键盘win+R快捷键弹出 ...