Mybatis中输入输出映射与动态Sql图文详解

 更新时间:2019年02月11日 09:16:53   作者:风沙迷了眼  
这篇文章主要给大家介绍了关于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 userPoJo;

 public UserPoJo getUserPoJo() {
 return userPoJo;
 }

 public void setUserPoJo(UserPoJo userPoJo) {
 this.userPoJo = userPoJo;
 }
}

UserVo

然后我们配置UserMapper.xml文件

然后在UserMapper接口文件中添加

//测试包装类型的查询
 public List<UserPoJo> findUserList(UserVo userVo) throws Exception;

使用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<UserPoJo> userPoJoList = userMapper.findUserList(userVo);

 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的配置

<?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="cn.mybatis.mapper.UserMapper">

 <!--定义resultMap
 type:resultMap最终映射的Java对象类型
 id:对resultMap的标识
 -->
 <resultMap id="userResultMap" type="user">
 <!--id:标识查询结果集中的唯一标识-->
 <id column="_id" property="id"></id>
 <!--result:标识查询结果集中其他列的标识-->
 <result column="_username" property="username"></result>
 <result column="_password" property="password"></result>
 <result column="_sex" property="sex"></result>
 <result column="_address" property="address"></result>
 </resultMap>

 <select id="findUserById_resultMap" parameterType="int" resultMap="userResultMap">
 SELECT id _id, username _username, PASSWORD _password, address _address, sex _sex FROM t_user WHERE id = #{id}
 </select>
</mapper>

②然后在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 id="findUserList" parameterType="cn.mybatis.po.UserVo" resultType="cn.mybatis.po.UserPoJo">
 SELECT * FROM t_user
 <where>
  <if test="userPoJo != null">
  <if test="userPoJo.sex != null and userPoJo.sex != ''">
   AND sex = #{userPoJo.sex}
  </if>
  <if test="userPoJo.username != null and userPoJo.username != ''">
   AND username LIKE '%${userPoJo.username}%'
  </if>
  </if>
 </where>
 </select>

2.Sql片段

上面的例子中,我们可以将if判断抽取出来作为一个Sql片段,这样做的好处是,可能再进行别的单表查询User信息的时候可以重复使用这些Sql。

<!--定义Sql片段-->
 <sql id="query_user_info">
 <if test="userPoJo != null">
  <if test="userPoJo.sex != null and userPoJo.sex != ''">
  AND sex = #{userPoJo.sex}
  </if>
  <if test="userPoJo.username != null and userPoJo.username != ''">
  AND username LIKE '%${userPoJo.username}%'
  </if>
 </if>
 </sql>

然后在别的Sql中将上面的Sql片段引入拼接即可

<select id="findUserList" parameterType="cn.mybatis.po.UserVo" resultType="cn.mybatis.po.UserPoJo">
 SELECT * FROM t_user
 <where>
  <include refid="query_user_info"></include>
 </where>
 </select>

3.foreach

当我们需要一种同样的查询方式只是参数不同的时候:SELECT * FROM t_user WHERE 1=1 AND (id = 1 OR id =2 OR id = 3),可以使用foreach来记性sql拼接

<sql id="query_ids">
 <if test="ids != null">
  <!--
  SELECT * FROM t_user WHERE 1=1 AND (id = 1 OR id =2 OR id = 3)
  cilleation: 指定的是输入参数集合的属性名
  item:每次遍历的名称
  open:开始遍历时拼接串
  close:结束遍历时候拼接的串
  separator:遍历的两个对象中间需要拼接的串
  -->
  <foreach collection="ids" item="item_id" open="AND (" close=")" separator=" OR ">
  id=#{item_id}
  </foreach>
 </if>
 </sql>

然后将上面的Sql片段加入响应的statment中

 <select id="findUserByIds" parameterType="userVo" resultType="userPoJo">
 SELECT * FROM t_user
 <where>
  <include refid="query_ids"></include>
 </where>
 </select>

测试结果如下

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture

    Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture

    这篇文章主要介绍了Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • Mybatis-Spring连接mysql 8.0配置步骤出错的解决方法

    Mybatis-Spring连接mysql 8.0配置步骤出错的解决方法

    这篇文章主要为大家详细介绍了Mybatis-Spring连接mysql 8.0配置步骤出错的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • SpringBoot项目如何设置权限拦截器和过滤器

    SpringBoot项目如何设置权限拦截器和过滤器

    这篇文章主要介绍了使用lombok时如何自定义get、set方法问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Sentinel初始化启动流程详细介绍

    Sentinel初始化启动流程详细介绍

    Sentinel是一个分布式系统的流量控制组件,它可以实现限流与流控及降级等功能,提高系统的稳定性和可靠性,这篇文章主要介绍了Sentinel的初始化流程,感兴趣想要详细了解可以参考下文
    2023-05-05
  • Activiti流程文件部署过程解析

    Activiti流程文件部署过程解析

    这篇文章主要介绍了Activiti流程文件部署过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java底层AQS实现类ReentrantLock锁的构成及源码解析

    java底层AQS实现类ReentrantLock锁的构成及源码解析

    本章我们就要来学习一下第一个 AQS 的实现类:ReentrantLock,看看其底层是如何组合 AQS ,实现了自己的那些功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java 数据库连接池Druid 的介绍

    Java 数据库连接池Druid 的介绍

    这篇文章主要给大家分享的是 Java 数据库连接池Druid 的介绍,Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池,下面来看看文中的详细内容,需要的朋友也可以参考一下
    2021-11-11
  • Jackson反序列化@JsonFormat 不生效的解决方案

    Jackson反序列化@JsonFormat 不生效的解决方案

    这篇文章主要介绍了Jackson反序列化@JsonFormat 不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • MyBatis中的@SelectProvider注解源码分析

    MyBatis中的@SelectProvider注解源码分析

    这篇文章主要介绍了MyBatis中的@SelectProvider注解源码分析,@SelectProvider功能就是用来单独写一个class类与方法,用来提供一些xml或者注解中不好写的sql,今天就来说下这个注解的具体用法与源码,需要的朋友可以参考下
    2024-01-01
  • 使用注解@Recover优化丑陋的循环详解

    使用注解@Recover优化丑陋的循环详解

    我们知道在实现一个功能的时候是可以使用不同的代码来实现的,那么相应的不同实现方法的性能肯定也是有差别的,下面这篇文章主要给大家介绍了关于使用注解@Recover优化丑陋的循环的相关资料,需要的朋友可以参考下
    2022-04-04

最新评论