MyBatis中映射器Mapper概述
MyBatis真正强大之处在于它的映射器。因为它异常强大并且编写相对简单,不仅比传统编写SQL语句做的更好并且能节省将近95%的代码量
XML中顶级元素汇总
- cache: 给定命名空间的缓存配置
- cache-ref: 其他给定命名空间缓存配置的引用
- resultMap: 最复杂也是最强大的元素,用来描述如何从数据库结果集中加载对象
- sql: 可以被其他语句引用的重复语句块
- insert: 映射插入语句
- update: 映射更新语句
- delete: 映射删除语句
- select: 映射查询语句
select
查询语句是MyBatis中使用最多的元素之一。一个简单的查询元素是非常简单的,看如下示例:
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
这个语句的ID为selectPerson ,并且接受一个int类型的参数,返回一个HashMap类型的对象。其中键名为列名,值为结果行中的对应值。
当然,select元素中有很多属性可以允许我们配置,用以决定每条语句的作用细节:
具体的相关其他属性可以查阅官网:
Mapper XML 文件
insert,update和delete
数据变更语句insert,update和delete的实现都非常接近:
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<update
id="updateAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
具体的相关其他属性可以查阅官网:
Mapper XML 文件
sql
这个元素可以被用来定义可重复的SQL代码段,可以包含在其他语句中。考虑下面这个例子:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
它可以被包含在其他语句中,比如:
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1
cross join some_table t2
</select>
参数 Parameters
一般来说,元素的parameterType会被设置为int或者String之类的原生类或者简单的数据结构。但是当传入一个复杂的对象时,行为就会变得有些不同。比如:
<insert id="insertUser" parameterType="User">
insert into users (id, username, password)
values (#{id}, #{username}, #{password})
</insert>
如果User类型的参数对象被传入到语句中,id、username、password属性就会被查找并且传入预处理语句的参数中。
resultMap
resultMap元素是MyBatis中最重要最强大的元素,它可以让我们从90%的JDBCResultSets数据提取代码中解放出来,并在一些条件下允许我们做一些JDBC所不支持的事情。
ResultMap的设计思想是:简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述他们的关系就行了。
一个简单的映射语句如下,它没有明确resultMap,知识简单的将所有的列映射到HashMap的键上,这由resultType指定:
<select id="selectUsers" resultType="map">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
虽然如此在大部分情况下都够用了,但是HashMap不是一个很好的模型,开发人员可能更加倾向于使用JavaBean或者POJO作为模型。MyBatis对两者都支持。
我们假定现在已经拥有一个名叫User的JavaBean,它定义了id、username以及hashedPassword属性。
这样的一个JavaBean可以被映射到ResultSet,就像映射到HashMap中一样简单:
<select id="selectUsers" resultType="com.someapp.model.User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
如果列名和属性名并不能完全吻合的话,我们也可以使用自行定义的外部ResultMap:
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>
之后只要在需要使用它的元素中对它进行引用就好了:
<select id="selectUsers" resultMap="userResultMap">
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>
MyBatis中映射器Mapper概述的更多相关文章
- Mybatis中映射器实现方式总结
一种是通过XML文件方式(由一个java接口和一个XML文件构成) RoleMapper rm = session.getMapper(RoleMapper.class); List<Role& ...
- SQL映射器Mapper接口(MyBatis)
SQL映射器Mapper接口 MyBatis基于代理机制,可以让我们无需再写Dao的实现.直接把以前的dao接口定义成符合规则的Mapper. 注意事项: 1.接口必须以Mapper结尾,名字是Dom ...
- (八)mybatis之映射器
映射器 映射器是由Java接口和XML文件(或注解)共同组成的,作用如下: ① 定义参数类型. ② 描述缓存. ③ 描述SQL语句. ④ 定义查询结果和POJO的映射关系. 以下用两种 ...
- 深入浅出mybatis之映射器
目录 概述 XML映射器 定义xml映射器 配置xml映射器 使用xml映射器 接口映射器 定义接口映射器 配置接口映射器 使用接口映射器 总结与对比 概述 映射器是MyBatis中最核心的组件之一, ...
- 第六章 mybatis注入映射器
为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:Map ...
- (十一)mybatis之映射器(select)
映射器 映射器的主要元素有八种: 元素名称 描述 select 查询语句,可自定义参数 insert 插入语句,执行后返回插入的条数 update 更新语句,执行后返回更新的条数 delete 删除语 ...
- mybatis中映射文件和实体类的关联性
mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~ ...
- mybatis学习——映射器(mappers)
在定义 SQL 映射语句之前,我们需要告诉 MyBatis 到哪里去找到这些语句. 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射 ...
- Mybatis 中在xxx.mapper书写模糊查询
1.在mybatis中,书写sql,有时候会有一些不细心,如: <!-- 首页商品 关键字搜索--> <select id="getGoodsByLikeTitle&quo ...
随机推荐
- 【腾讯Bugly干货分享】舞动的表情包——浅析GIF格式图片的存储和压缩
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/v0pffOhjFWnVbU2lXjuEmw 导语 G ...
- Spring依赖注入(DI)详解
一.依赖简介 一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean).即使是最简单的应用程序也只有几个对象一起工作来呈现最终用户看作是一个连贯的应用程序.如何从定义许多独立 ...
- 吴恩达机器学习笔记47-K均值算法的优化目标、随机初始化与聚类数量的选择(Optimization Objective & Random Initialization & Choosing the Number of Clusters of K-Means Algorithm)
一.K均值算法的优化目标 K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为: 其中
- CSS实现div高度自适应
1.有时候,我们希望容器有一个固定高度,但当其中的内容多的时候,又希望高度能够自适应,也即容器在纵向能被撑开,且如果有背景,也能够自适应.在一般情况下,使用min-height即可解决.但是广大网民的 ...
- Error running 'Unnamed': Address localhost:1099 is already in use
当使用idea运行项目时,出现‘Error running 'Unnamed': Address localhost:1099 is already in use’. 解决方案: 1.打开任务管理器 ...
- KNN算法基本实例
KNN算法是机器学习领域中一个最基本的经典算法.它属于无监督学习领域的算法并且在模式识别,数据挖掘和特征提取领域有着广泛的应用. 给定一些预处理数据,通过一个属性把这些分类坐标分成不同的组.这就是KN ...
- Robot Framework - 一些练习
01 - 安装Robot Framework TA环境 根据系统请选择对应的版本包来安装,下面是以Win7-64bit系统为例,来说明如何搭建一个可以运行练习三test case的RF TA环境. 1 ...
- Xamarin.Android 上中下布局
xml代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- deque源码1(deque概述、deque中的控制器)
deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...
- 改变input的值不会触发change事件的解决思路
通常来说,如果我们自己通过 value 改变了 input 元素的值,我们肯定是知道的,但是在某些场景下,页面上有别的逻辑在改变 input 的 value 值,我们可能希望能在这个值发生变化的时候收 ...