映射器
-
映射器是MyBatis最复杂和重要的组件。
- 映射器可以由一个接口加上对应的XML文件组成,也可以由一个接口加上一个有对应注解的java类组成。
- 映射器中可以配置参数,增删改查的各类SQL语句,存储过程,缓存,级联等等。
- 映射器可以通过简易的映射规则将数据库数据映射到指定POJO对象或者其他对象,可以大幅度的消除JDBC操作的底层代码。
常见的映射器配置元素和说明
元素 | 说明 |
---|---|
<select> | 查询语句,对应SQL语句中的select |
<insert> | 插入语句,对应SQL语句中的insert |
<update> | 更新语句,对应SQL语句中的update |
<delete> | 删除语句,对应SQL语句中的delete |
<sql> | 可以定义一部分SQL语句在其他的位置使用,达到重用的目的 |
<resultMap> | 秒速数据库结果集加载到对象的对应规则 |
<cache> | 缓存设置 |
各元素配置的属性(常见的)
属性 | 说明 |
---|---|
id | 和Mapper的命名空间组合起来的唯一标识id,不唯一将抛出异常 |
parameterType | 指定简单的参数类型传递给SQL |
resultType | 指定SQL执行后的结果集的映射规则 |
flushCache | 在调用SQL后是否需要MyBatis清空之前查询的缓存 |
timeout | 超时参数,单位为秒 |
fetchSize | 获取记录的总条数定义 |
给出元素实现的例子
- 要求:统计用户表t_user中同姓的用户数量
<!-- XXXMapper.xml文件中的代码 -->
<select id="countUserBySurname" parameterType="string" resultType="int">
select count(*) sum
from t_user
where name like concat(#{surname},'%')
</select>
//对应于 XXXMapper.java接口中的代码
public Integer countUserBySurname(String surname);
- 要求:根据用户的名称和基本信息模糊查询(传入多个值)
<!-- XXXMapper.xml文件中内容-->
<select id="findUserByNameAndInfo" parameterType="map" resultType="user">
select id,name,info
from t_user
where name like concat('%',#{name}'%')
and info like concat('%',#{info},"%")
</select>
//XXXMapper.java接口中定义代码
public List<User> findUserByNameAndInfo(Map<String,Object> userMap);
**PS:**其中需要注意 name 和 info 应该是Map的键而不是值
如果需要定义一个示例 应该是这样:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","xxx");
map.put("info","xxx");
List<User> users = userMapper.findUserByNameAndInfo(map);
但是使用Map注解传递多个参数可读性差的缘故也可以使用注解的方式传递多个参数 注解@Param 来自 org.apache.ibatis.annotations.Param
例如:(将上诉Map的形参变化一下)
public List<User> findUserByNameAndInfo(
@Param("name") String name,
@Param("info") String info);
- 向用户表中插入一条数据
PS:insert返回的是影响了数据表中记录条数的一个整数
<!-- XXXMapper.xml文件中的代码 -->
<insert id="insertUser" parameterType="user">
insert into t_user(name,info)
values(#{name},#{info})
</insert>
//XXXMapper.java接口中的代码
public Integer insertUser(User user);
如果想要得到插入数据之后该条数据在表中的主键则需要定义为:
<insert id="insertUser" parameterType="user"
useGeneratedKeys="true" keyProperty="id">
...
- 更新和删除某一条数据
和insert语句操作得到的返回值一样,更新和删除返回的也是数据表中受到影响的记录条数,是一个整数。
<update id="updateUser" parameterType="user:">
update t_user
set name="#{name},info = #{info}
where id=#{id}
</update>
<delete id="deleteUser" parameterType="long">
delete from t_user
where id="#{id}
</delete>
- sql元素定义的重用
主要是为了少写一些代码,尤其和当数据表字段很多时会方便一些
<sql id="test">
id,name,info
</sql>
<!-- 引用的方式 -->
...
select <include refid="test"/>
from ...