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,大大减少数据库的负担,减少访问数据库的链接时间,实际开发过程中都会采用这种缓存方式,达到访问速度和效率的解决方案。这个不访问数据库。
相关文章推荐
- mybatis框架的mapper.xml文件中sql的使用方法:
- 如何在mybatis中定义mapper.xml文件?
- MyBatis mapper.xml配置文件
- Mapper(XML)文件不识别大于号 小于号
- Mapper的XML映射文件---2.4: 类型句柄(typeHandlers)
- MyBatis Mapper.xml文件中 $和#的区别
- mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
- Mapper.xml文件中如何判断多个参数不为空和null
- Mybatis学习--Mapper XML文件
- MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询
- maven管理springmvc+mybatis运行maven install时加载不了mapper.xml文件
- MyBatis之Mapper XML 文件详解(五)-自动映射查询结果
- Mapper.xml映射文件
- mybatis-generator-maven-plug生成model、mapper、xml映射文件
- Mybatis的Mapper.xml文件中如何遍历一个对象的集合属性
- Mybatis3源码分析(三):解析mapper的xml配置文件
- 【ibatis】自定义mapper.xml文件(#与$的详解)
- Mybatis学习--Mapper.xml映射文件demo
- Mapper的XML映射文件---2.5: 对象工厂(ObjectFactory)
- 分离mybatis的mapper.java和mapper.xml文件