您的位置:首页 > 移动开发

Mapper XML 文件

2018-07-22 21:41 204 查看

Mapper XML 文件

SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

cache
– 给定命名空间的缓存配置。

cache-ref
– 其他命名空间缓存配置的引用。

resultMap
– 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

sql
– 可被其他语句引用的可重用语句块。

insert
– 映射插入语句

update
– 映射更新语句

delete
– 映射删除语句

select
– 映射查询语句

insert List

int insertMonitorInfoList(List<MonitorInfo> list);

<insert id="insertMonitorInfoList">
insert into dbo.montior (id,did, pages_sec, ava_bytes,
buffer_cache_ratio,current_connections,cpu_ratio,disk_ratio)
values
<foreach item="item" collection="list" separator=",">
(#{item.id},#{item.dbId}, #{item.pagesPerSeconds}, #{item.avaliableBytes},
#{item.bufferCacheRatio},#{item.connectionsNums},#{item.cpuRatio},#{item.diskRation})
</foreach>
</insert>

foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

返回主键

keyColumn ,设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置

keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

<sql id="insert_monitor_auto">
(did, pages_sec, ava_bytes,buffer_cache_ratio, current_connections, 		cpu_ratio, disk_ratio)
</sql>
<insert id="insertMonitorInfoByIncreamnt" keyProperty="id" 	      		    useGeneratedKeys="true">
INSERT INTO monitor
<include refid="insert_monitor_auto"/>
VALUES
(#{dbId}, #{pagesPerSeconds}, #{avaliableBytes},
#{bufferCacheRatio}, #{connectionsNums}, #{cpuRatio}, #{diskRation})
</insert>

批量插入且返回主键

<insert id="insertMonitorsList" keyProperty="id" useGeneratedKeys="true">
INSERT INTO monitor
<include refid="insert_monitor_auto"/>
VALUES
<foreach collection="list" item="item" index="index" separator=",">
<include refid="monitor_insert_list"/>
</foreach>
</insert>
<sql id="monitor_insert_list">
(#{item.dbId}, #{item.pagesPerSeconds}, #{item.avaliableBytes}, #		{item.bufferCacheRatio}, #{item.connectionsNums}, #{item.cpuRatio}, #	 {item.diskRation})
</sql>

choose 多条件互斥查询

<select id="queryMonitorsByChoose" resultMap="MonitorMap">
SELECT * FROM monitor
<where>
<choose>
<when test="id != null">
id=#{id}
</when>
<when test="dbid != null">
did=#{dbid}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>

id in list

主要是用open,separator,close三个拼接而成!(按照sql优化来说,in这种用法不建议用,换成exist)

<select id="queryMonitorByIdInList" resultMap="MonitorMap">
SELECT * FROM monitor
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

update set的使用,多属性更新,有则跟新,没有则不跟新

注意每个属性的默认值,不是每个属性的默认值都是null的,如我的属性的默认就没有null,不建议通过map来传参.我的入参是
void updateFields(MonitorInfo monitorInfo);


注意set标签下if标签不是最后一个注意加各
,
号.

<update id="updateFields">
UPDATE monitor
<set>
<if test="dbId!=0">
did=#{dbId},
</if>
<if test="cpuRatio!=0.0">
cpu_ratio=#{cpuRatio},
</if>
<if test="diskRation!=0.0">
disk_ratio=#{diskRation},
</if>
<if test="connectionsNums!=0">
current_connections=#{connectionsNums},
</if>
<if test="avaliableBytes!=0.0">
ava_bytes=#{avaliableBytes},
</if>
<if test="pagesPerSeconds!=0">
pages_sec=#{pagesPerSeconds},
</if>
<if test="bufferCacheRatio!=0.0">
buffer_cache_ratio=#{bufferCacheRatio}
</if>
</set>
WHERE
id=#{id}
</update>

复杂查询:

注意
<id column="login_name" property="loginName"/>
很关键,这个是可以根据此来划分唯一一条记录的依据.

<resultMap id="allInfo" type="UserConnection">
<id column="login_name" property="loginName"/>
<association property="session" resultMap="sessionMap"/>
<association property="schedule"  resultMap="scheduleMap"/>
<collection property="workers"   resultMap="workerMap"/>
</resultMap>
<resultMap id="sessionMap" type="session">
<id column="session_id" property="sessionId"/>
<result column="schedule_id" property="scheduleId"/>
<result column="context" property="context"/>
<result column="db_name" property="dbName"/>
<result column="login_name" property="loginName"/>
</resultMap>
<resultMap id="scheduleMap" type="schedule">
<id column="schedule_id" property="scheduleId"/>
<result column="worker_count" property="workerCount"/>
<result column="schedule_adress" property="scheduledAdress"/>
</resultMap>
<resultMap id="workerMap" type="worker">
<id column="id" property="workerId"/>
<result column="schedule_id" property="scheduleId"/>
<result column="command" property="command"/>
</resultMap>

<select id="queryAllInfoAccordingUser" resultMap="allInfo">
SELECT
login_name,
session.*,
worker_count,
schedule_adress,
worker.id,
worker.command
FROM worker
LEFT JOIN schedule  ON schedule.schedule_id = worker.schedule_id
LEFT JOIN session ON session.schedule_id = schedule.schedule_id
</select>

merge into再mysql中式比较简单的replace. replace最好用在一个索引上,肉有多个索引,会都判断,也就式三个索引都判断,只要由一个相同就update,没有则insert.

<insert id="mergeScheduleList">
REPLACE INTO schedule (schedule_id,worker_count,schedule_adress) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.scheduleId},#{item.workerCount},#{item.scheduledAdress})
</foreach>
</insert>

mybatis的缓存和redis的缓存区别:

mybatis的缓存:分为一级缓存和二级缓存,一级缓存的作用范围为session,所以当session commit或close后,缓存就会被清空 ,二级缓存的作用范围为sqlsessionfactory,映射语句文件中的所有select语句都会被缓存,所有CRUD的操作都会刷新缓存,缓存会存储1024个对象,缓存容易造成脏毒数据,影响真实数据的准确性,实际开发业务中会放弃二级缓存。这个还是要访问数据库。

redis的缓存:可控制的后端缓存服务,通常用来缓存后端数据,当程序第二次访问数据库的时候,命中redis,大大减少数据库的负担,减少访问数据库的链接时间,实际开发过程中都会采用这种缓存方式,达到访问速度和效率的解决方案。这个不访问数据库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息