多平台统一管理软件接口,如何实现多平台统一管理软件接口
273
2023-01-13
Mybatis中输入输出映射与动态Sql图文详解
一、输入映射
我们通过配置parameterType的值来指定输入参数的类型,这些类型可以是简单数据类型、POJO、HashMap等数据类型
1、简单类型
2、POJO包装类型
①这是单表查询的时候传入的POJO包装类型,即可以直接传入实体类,但是当多表查询的时候,就需要自定义POJO类型
②我们使用自定义POJO类型来具体的了解一下
先设计 包装类型如下,其中UserPOJO是除了User本身之外的添加的其他跟User相关的属性的包装类,UserVo是用于视图层面的包装类型,同样也是作为Mapper配置文件的输入类型
其中User文件同上一篇Mybatis简单入门中的User,包括数据表部分也一样。这里给出UserPoJO和UserVo文件
package cn.mybatis.po;
public class UserPoJo extends User{
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
}
UserPOJO
package cn.mybatis.po;
public class UserVo {
private UserPoJo userPddjsObHPoJo;
public UserPoJo getUserPoJo() {
return userPoJo;
}
public void setUserPoJo(UserPoJo userPoJo) {
this.userPoJo = userPoJo;
}
}
UserVo
然后我们配置UserMapper.xml文件
然后在UserMapper接口文件中添加
//测试包装类型的查询
public List
使用Junit测试刚刚做的配置
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserPoJo userPoJo = new UserPoJo();
UserVo userVo = new UserVo();
userPoJo.setSex("男");
userPoJo.setUsername("u");
userVo.setUserPoJo(userPoJo);
List
System.out.println(userPoJoList);
}
最后结果如下
二、输出映射
1、resultType
①在使用resultType进行映射的时候,只有查询出来的列名和包装类型中的属性名一致的时候,才会映射成功
②当使用简单类型作为输出映射的时候,我们需要保证Sql查询的结果只有一行一列,这样就可以使用简单类型
如下所示示例
SELECT COUNT(*) FROM t_user
SELECT username FROM t_user WHERE id = 2
2、resultMap
查询出来的列名和包装类型的属性名不一致的时候,可以使用resultMap来进行相应的映射(具体在使用中来说就是:定义resultMap中和属性的映射关系,然后将输出结果设置为resultMap的类型)
下面我们使用一个例子来进行具体的测试
①首先编写mapper配置文件,其中需要加上resultMap的配置
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
SELECT id _id, username _username, PASSWORD _password, address _address, sex _sex FROM t_user WHERE id = #{id}
②然后在Mapper接口中添加方法
//测试resultMap
public User findUserById_resultMap(int id) throws Exception;
③ 测试方法
@Test
public void testFindUserById_resultMap() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById_resultMap(2);
System.out.println(user);
}
④可以发现,使用resultMap的方式跟直接查询的结果是一致的
三、动态Sql
1、if判断
我们在上面使用包装类查询的用例的时候,考虑到可能出现userPoJo会是null的情况,以及其相应的属性也可能是null的情况,这样的话,如果我们直接在Sql中进行拼接而不做判断的话,可能会出现一些错误,所以我们使用if来进行动态的拼接。
SELECT * FROM t_user
AND sex = #{userPoJo.sex}
AND username LIKE '%${userPoJo.username}%'
2.Sql片段
上面的例子中,我们可以将if判断抽取出来作为一个Sql片段,这样做的好处是,可能再进行别的单表查询User信息的时候可以重复使用这些Sql。
AND sex = #{userPoJo.sex}
AND username LIKE '%${userPoJo.username}%'
然后在别的Sql中将上面的Sql片段引入拼接即可
SELECT * FROM t_user
3.foreach
当我们需要一种同样的查询方式只是参数不同的时候:SELECT * FROM t_user WHERE 1=1 AND (id = 1 OR id =2 OR id = 3),可以使用foreach来记性sql拼接
id=#{item_id}
然后将上面的Sql片段加入响应的statment中
SELECT * FROM t_user
测试结果如下
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~