好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

一、输入映射

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

1、简单类型

2、pojo包装类型

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

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

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

其中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文件

然后在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);

  }

最后结果如下

二、输出映射

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的方式跟直接查询的结果是一致的

三、动态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>

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>

测试结果如下

总结

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

原文链接:https://HdhCmsTestcnblogs测试数据/fsmly/p/10335456.html

查看更多关于Mybatis中输入输出映射与动态Sql图文详解的详细内容...

  阅读:14次