上篇文章:MyBatis知识盘点【叁】_mybatis-config.xml配置说明
select元素
id:唯一主键
parameterType:参数类型,可指定bean
resultType:返回结果集类型
resultMap:自定义映射规则和resultType 2选1
flushCache:调用sql后,让mybatis清空之前的一级和二级缓存,默认false
useCahe:使用二级缓存保存结果,默认true
timeout:超时时间,默认是驱动jar包里的时间
fetchSize:获取记录总条数管理,默认是驱动jar包里的
statementType:使用哪个statement,枚举STATEMENT、PREPARED、CallableStatement。默认PREPARED
resultOrdered:仅适用于嵌套结果集select语句。如果是true,就认为是包含了嵌套结果集或分组。默认false
insert元素
id:唯一主键
parameterType:参数类型,可指定bean
flushCache:调用sql后,让mybatis清空之前的一级和二级缓存,默认false
useCahe:使用二级缓存保存结果,默认true
timeout:超时时间,默认是驱动jar包里的时间
keyProperty:设置哪个列为主键,联合主键都好分隔。不能和keyColumn连用
keyColumn:知名第几列为主键,参数只接受int,不能和keyProperty连用。
useGeneratedKeys:让MyBatis使用JDBC的getGeneratedKeys方法去除由数据库内部生成的主键。默认false。
在Order里设置id的成员变量
<
insert
id
=
"appPay"
parameterType
=
"com.hzdracom.core.bean.Order"
useGeneratedKeys="true"
keyProperty="id"
>
<selectKey
keyProperty="id" resultType="int" order="BEFORE"
>
select if(
MAX
(id) is null,1,id+2) newId from
user_order
</
selectKey>
insert into user_order(
orderId,
user_orderId,
upm_orderId,
app_key,
app_group_id,
app_business_id,
srouce
,
pay_srouce,
pay_type,
parter_id,
order_type,
platform,
user_id,
user_info,
payment_account,
status,
product_id,
product_name,
content_id,
content_name,
name,
description,
show_url,
price,
num
,
total,
phone,
redirect_uri,
remark,
type,
createtime
,
upm_payorderkey,
upm_user_key,
pay_time,
is_unified_product,
days,
starttime
,
endtime
)
values(#{orderId},#{user_orderId},#{upm_orderId},#{app_key},#{app_group_id},#{app_business_id},#{
srouce
},#{pay_srouce},#{pay_type},#{partnerId},
#{order_type},#{platform},#{user_id},#{user_info},#{payment_account},0,#{product_id},#{product_name},#{content_id},#{content_name},#{name},
#{description},#{show_url},#{price},#{
num
},#{total},#{phone},#{redirect_uri},#{remark},1,#{
createtime
},#{upm_payorderkey},#{upm_user_key},#{pay_time},
#{isUnifiedProduct},#{days},NOW(),DATE_ADD(NOW(),INTERVAL IFNULL(#{days},0) DAY))
</
insert
>
update、delete元素
返回影响行数
#和$的区别
#{}:会按类型进行转换
${}:不做任何处理
sql元素
sql模糊查询时,可用concat('%',#{参数},'%')拼装条件。
<
sql
id
=
"user_column"
>
user_id,phone,nickname,app_group_id,app_business_id
</
sql
>
<
select
id
=
"loginUserId"
resultType
=
"userInfo"
>
SELECT
<
include
refid
=
"user_column"
/>
FROM user_info u WHERE u.user_id = #{userId}
</
select
>
结果集resultMap
<resultMap>
<constructor><!-- 如果对应的javabean没有无参的构造方法,那么可在此配置参数构造 -->
<idArg/>
<arg/>
</
constructor>
<id = "A"/> <!-- 主键 -->
<result/> <!--
<result column="user_orderId" property="user_orderId" jdbcType="VARCHAR" /> -->
<association
property="级联bean名称,定义在自身bean的成员对象" column="级联主键id,传参给后面sql" select="对应bean的mapper中的接口"/
> <!-- 一对一级联 -->
<collection
property="级联bean名称,定义在自身bean的成员对象list" column="级联主键id,传参给后面sql" select="对应bean的mapper中的接口"
/>
<!-- 一对多 -->
<discriminator javaType="变量的java类型" column="对应bean中的成员变量">
<!-- 鉴别器,根据不用情况映射不用结果集 -->
<case value="某值" resultType="
A1
"/>
<case value="某值" resultType="
A2
"/>
</
discriminator>
</
resultMap>
<resultMap id="A1" type="" extends = "A">
<resultMap id="A2" type="" extends = "A">
级联功能目前只支持查询
关系超过三层时尽量不用,复杂度会很高。
缓存cache
当是同一个sqlSession执行同一个sql的时候,如果缓存开启,第二次查询的时候则会返回缓存中的记录,而不会发送sql到数据库。但是不同sqlSession则不会,因为它们之间是相互隔离的。
一级缓存:缓存在sqlSession层面,不共享;
二级缓存:缓存在SQLSessionFactory层面,可共享,要求返回的pojo必须是可序列化的。默认不开启。想开启,在映射xml中配置<cache/>即可。如此配置,意味着:
select会缓存
insert、update和delete会刷新缓存
缓存通过LRU最近最少使用原则回收
回收策略:
LRU,最近最少使用
FIFO,先进先出
SOFT,软引用
WEAK,弱引用