文章目录
1. 输入参数映射
1.1 Java简单类型 (基本类型、String)
<!-- 根据id查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
<!-- 根据名称模糊查询用户信息 -->
<select id="selectUserByName" parameterType="string" resultType="user">
select * from user where username like '%${value}%'
</select>
- 通过sql标签的parameterType属性直接引用类型的别名
- 在sql语句中的引用方式:
- #{参数名}:具有类型编译功能;当参数类型为java简单类型时,参数名任意取;
- ${参数名}:不具备类型编译功能;要求参数名必须为value;只适用于模糊查询
引用列名排序的情况
1.2 PO类
<!—传递pojo对象综合查询用户信息 -->
<select id="findUserByUser" parameterType="user" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
直接在sql标签的parameterType属性直接引用类型的别名或类型的全限定名都可
在sql语句中,直接通过 #{PO类属性名} 的方式引用。
1.3 传递pojo包装对象
- 定义包装对象将查询条件(pojo)以类组合的方式包装起来。
public class QueryVo {
private User user;
//自定义用户扩展类
private UserCustom userCustom;
}
- mapper.xml映射文件
1.4 集合
集合类型包括:map 数组 set list
举例:条件查询(条件封装到Map集合中)
步骤1:添加查询接口
步骤2:添加映射sql
步骤3:测试
1.5 小结:
- mybatis中SQL接受的参数分为:java简单类型、Po类、集合类型(List、数组、Map)
无论传哪种参数给mybatis,框架都会将参数放在一个Map中:
传入简单类型:变量名作为key,变量值作为value 此时生成的map只有一个元素。
传入对象: 对象的属性名作为key,属性值作为value,
如:
Users: name=”tom” pwd=”123” sex=”1”
Map: key=”name” value=”tom”
key=”pwd” value=”123”
key=”sex” value=”1”
传入List: "list"作为key,这个List是value (这类参数可以迭代,利用标签实现循环)
传入数组: "array"作为key,数组作为value(同上)
传入Map: 键值不变。
2. 输出参数映射
2.1 resultType
2.1.1 Java简单类型
-
<!-- 获取用户列表总数 --> <select id="findUserCount" parameterType="user" resultType="int"> select count(1) from user </select>
-
Po类
-
public int findUserCount(User user) throws Exception;
-
调用
Public void testFindUserCount() throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获取mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setUsername("管理员"); //传递Hashmap对象查询用户列表 int count = userMapper.findUserCount(user); //关闭session session.close(); }
2.1.2 Java
-
框架封装记录到Po类对象时,是按照 字段名=属性名的方式进行值的封装
-
如果属性名在记录中没有相应的字段名,则该属性值为null
-
如果Po类对象中的所有属性跟字段名都不匹配,则该对象为null
-
Mapper.xml
<!-- 根据id查询用户信息 --> <select id="findUserById" parameterType="int" resultType="user"> select * from user where id = #{id} </select>
-
Mapper接口
public User findUserById(int id) throws Exception;
-
测试
public void testFindUserById() throws Exception { //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //通过mapper接口调用statement User user = userMapper.findUserById(1); System.out.println(user); //关闭session session.close(); }
2.1.3 集合
当接口方法返回类型为集合时,resultType属性必须指定的是集合元素的类型
2.1.4 resultType总结
-
输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。
-
返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
-
返回pojo列表表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List对象作为方法返回值。
2.2 resultMap
-
适用情况:
- 当返回结果集字段名跟封装类对象的属性名不一致
- 当封装类对象是一个嵌套类形式的时
-
举例:情况1
Student类
Student_Teacher接口
Student_Teacher映射文件
-
举例:情况2
关于映射Map的继承