服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - Mybatis中输入输出映射与动态Sql图文详解

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

2021-07-15 10:29风沙迷了眼 Java教程

这篇文章主要给大家介绍了关于Mybatis中输入输出映射与动态Sql的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

一、输入映射

我们通过配置parametertype的值来指定输入参数的类型,这些类型可以是简单数据类型、pojo、hashmap等数据类型

1、简单类型

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

2、pojo包装类型

①这是单表查询的时候传入的pojo包装类型,即可以直接传入实体类,但是当多表查询的时候,就需要自定义pojo类型

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

②我们使用自定义pojo类型来具体的了解一下

先设计 包装类型如下,其中userpojo是除了user本身之外的添加的其他跟user相关的属性的包装类,uservo是用于视图层面的包装类型,同样也是作为mapper配置文件的输入类型

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

其中user文件同上一篇mybatis简单入门中的user,包括数据表部分也一样。这里给出userpojo和uservo文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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文件

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

然后在usermapper接口文件中添加

?
1
2
//测试包装类型的查询
 public list<userpojo> finduserlist(uservo uservo) throws exception;

使用junit测试刚刚做的配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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);
 }

最后结果如下

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

二、输出映射

1、resulttype

①在使用resulttype进行映射的时候,只有查询出来的列名和包装类型中的属性名一致的时候,才会映射成功

②当使用简单类型作为输出映射的时候,我们需要保证sql查询的结果只有一行一列,这样就可以使用简单类型

如下所示示例

?
1
2
3
select count(*) from t_user
 
select username from t_user where id = 2

2、resultmap  

查询出来的列名和包装类型的属性名不一致的时候,可以使用resultmap来进行相应的映射(具体在使用中来说就是:定义resultmap中和属性的映射关系,然后将输出结果设置为resultmap的类型)  

下面我们使用一个例子来进行具体的测试

①首先编写mapper配置文件,其中需要加上resultmap的配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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接口中添加方法

?
1
2
//测试resultmap
public user finduserbyid_resultmap(int id) throws exception;

③ 测试方法

?
1
2
3
4
5
6
7
8
9
@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的方式跟直接查询的结果是一致的

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

三、动态sql

1、if判断

我们在上面使用包装类查询的用例的时候,考虑到可能出现userpojo会是null的情况,以及其相应的属性也可能是null的情况,这样的话,如果我们直接在sql中进行拼接而不做判断的话,可能会出现一些错误,所以我们使用if来进行动态的拼接。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<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>

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

2.sql片段

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

?
1
2
3
4
5
6
7
8
9
10
11
<!--定义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片段引入拼接即可

?
1
2
3
4
5
6
<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拼接

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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中

?
1
2
3
4
5
6
<select id="finduserbyids" parametertype="uservo" resulttype="userpojo">
select * from t_user
<where>
 <include refid="query_ids"></include>
</where>
</select>

测试结果如下

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

总结

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

原文链接:https://www.cnblogs.com/fsmly/p/10335456.html

延伸 · 阅读

精彩推荐