参考资料
一、MyBatis SQL映射文件——输入输出
学习目标:
- 掌握通过SQL映射文件进行增删改查
- 掌握参数的使用
- 掌握resultMap
1.1 SQL映射的XML文件 *Mapper.xml
SQL 映射 XML文件 的顶级标签(有前后顺序)
标签名 | 属性 / 描述 |
---|---|
mapper | 最外层标签,属性 namespace,用于指定Mapper接口类的引用位置,比如com.uni.UserMapper |
cache | 配置给定命名空间的缓存 |
cache-ref | 从其他命名空间引用缓存配置 |
resultMap | 用来描述数据库结果集和对象的对应关系 |
sql | 可以重用的SQL块,也可以被其他语句引用 |
insert | 映射插入语句 |
update | 映射更新语句 |
delete | 映射删除语句 |
select | 映射查询语句 |
1.2 mapper 标签
属性:namespace 表示命名空间
- namespace和子标签(select、insert、update等)的id 联合保证唯一,区别不同的mapper
- 绑定DAO接口
- namespace的命名必须跟某个接口同名
- 接口中的方法与映射文件中SQL语句id一一对应
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.uni.User">
<select id= "queryAllUser" ...>
...
</select>
</mapper>
1.3 select 标签
- select 是MyBatis中最常用的元素之一
- select 语句有很多属性可以详细配置每一条语句
属性 | 描述 |
---|---|
id | 命名空间中唯一的标识符,接口中的方法与映射文件中SQL语句一 一对应 |
parameterType | 传入SQL语句的参数类型 |
resultType | SQL语句返回值类型的完整类名或者别名 |
1.4 XML中获取传入的参数
查询单个用户通常是需要指定id的,比如在mysql中是这样的:
select * from user where id = 1;
所以在接口中可以这样定义方法:
UserMapper.java
public interface UserMapper{
User queryUserById(int id);
}
而在XML中如何获取到这个传入的参数呢?
这里可以通过#{}
获取这个参数,若只有一个参数,parameterType
参数可以省略不写,#{}里的内容可任意填,不过只能取一个)
#{}
不能用于字符串拼接
UserMapper.xml
<!-- 根据ID查询用户 -->
<select id="queryUserById" resultType="com.uni.pojo.User">
select * from smbms_user where id = #{id}
</select>
测试:
@Test
public void testQueryUserById(){
SqlSession sqlSession = MyBatisUtil.getSession();
User user = sqlSession.getMapper(UserMapper.class).queryUserById(1);
System.out.println(user);
sqlSession.close();
}
1.4.1 多参案例(一)模糊查询
现使用 smbms_user
表的username用户名和sex性别两个字段来进行模糊查询,使用到的sql语句:
select * from smbms_user where userName like CONCAT('%超%') and sex = '男';
这句话能查询带超字且性别为男的所有用户,现使用MyBatis实现,要点有:
- parameterType可不写
- 使用#{param1} 表示第一个参数
原理:
- 自动封装成Map类型的数据,key: param1 … paramN,或者参数的索引, value: 传入的参数值
- 自定义名称 @Param注解
方式一:使用param按顺序取参
UserMapper.java
List<User> queryUserLikeNameAndGender(String name, int gender);
UserMapper.xml
<!-- 根据名称和性别进行模糊查询 -->
<select id="queryUserLikeNameAndGender" resultType="com.uni.pojo.User">
select * from smbms_user where userName like CONCAT('%', #{param1}, '%') AND gender = #{param2}
</select>
方式二:使用@Param注解取参
UserMapper.java
List<User> queryUserLikeNameAndGender(@Param("userName") String name, @Param("gender") int gender);
UserMapper.xml
<select id="queryUserLikeNameAndG