Mybatis核心组成部分之SQL映射文件揭秘详解

时间:2022-11-15 10:16:19

前言

mybatis真正强大的地方在于sql映射语句,这也是它的魅力所在。

相对于它强大的功能,sql映射文件的配置却非常简单,我上篇文章语句讲了mybatis的搭建以及核心配置的讲解,接下来咱们就一起来看看mybatis另一个重要的元素-sql映射文件

首先先介绍一下sql映射文件的几个*元素配置

*元素配置

1、mapper:映射文件的根元素节点,只有一个属性namespace(命名空间),其作用如下

  • 用于区分不同的mapper,全局唯一
  • 绑定dao接口,即面向接口编程。当namespace绑定某一接口之后,就可以不用写该接口的实现类,mybatis会通过接口的完整限定名查找到对应的mapper配置来执行sql语句。因此namespace的命名必须要跟接口名同名

2、cache:配置给定命名空间引用缓存。

3、cache-ref:从其他命名空间引用缓存配置

4、resultmap:用来描述数据库结果集和对象的对象关系(键值对)

5、sql:可以重用的sql块,也可以被其他语句引用。

6、insert:映射插入的语句

7、update:映射更新的语句

8、delete:映射删除的语句

9、select:映射查询的语句

接下来我就逐一的为大家介绍

select:映射查询语句

?
1
2
3
4
<!--根据用户名称查询用户列表(模糊查询)-->
<select id="getuserlistbyusername" resulttype="user" parametertype="string">
select * from user_info where username like concat('%',#{username},'%')
</select>

上面这段代码是一个id为getuserlistbyusername的映射语句,参数类型为string,返回结果的类型是user,注意参数的传递使用#{参数名},它告诉mybatis生成preparedstatement参数,对于jdbc,该参数会被标识为“?”,若采用jdbc来实现,那代码就得换一下方式了

?
1
2
3
string sql="select * from user_info where username like concat('%',?,'%')";
preparedstatement ps=conn.preparedstatement(sql);
ps.setstring(1,username);

从上面两端代码我相信大家都能看出区别,mybatis节省了大量的代码,我相信大家会喜欢上它的
接下来我来介绍一下select映射语句中的家庭成员吧!

  • id:命名空间中唯一的标识符,可以被用来引用这条语句
  • parameter:表示查询语句传递参数的类型的完全限定名或别名。它支持基础数据类型和复杂数据类型,就比如咱们上面用到的string就是一个基础数据类型,当然你会发现这的string的s是小写,其实它只是一个别名,还是代表string,只不过它属于一个内建的类型别名,那么以此类推,对于普通的java类型,也有许多的内建类型别名,并且它们对大小写不明感,介意大家去阅读以下mybatis的帮助文档。
  • resulttype:查询语句返回结果类型的完全限定名或别名,别名的使用方式与parametertype的使用方式是一致的

接下来我就用一个实例来向大家演示一下

首先我弄了一个以用户名、用户角色来查询用户列表的功能,咱们先创建usermapper.java文件

?
1
2
3
public interface usermapper {
public list<user> getuserlist(map<string,string> usermap);
}

从上面大家可以看到我用来一个集合来接受返回的结果集,并且传递的参数是一个user对象

下面再来编写usermapper.xml文件的主体内容

?
1
2
3
4
5
6
<!--查询用户列表(参数:对象入参)-->
<select id="getuserlist" resulttype="user" parametertype="map">
select u.*,r.rolename from smbms_user u,smbms_role r
where u.username like concat('%',#{username},'%')
and u.userrole=#{userrole} and u.userrole=r.id
</select>

上面便是咱们此次测试的查询映射语句了,这和我在上面说的映射语句区别不大,唯一大点的区别就在于参数类型,这的参数类型我换成了一个map集合。

接下来就可以去测试了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@test
public void getuserlist(){
sqlsession sqlsession=null;
list<user> userlist=new arraylist<user>();
try{
sqlsession=mybatisutil.createsqlsession();
map<string,string> usermap=new hashmap<string,string>();
usermap.put("uname","赵");
usermap.put("urole","3");
userlist=sqlsession.getmapper(usermapper.class).getuserlistmap(usermap);
}catch(exception e){
e.printstacktrace();
}finally{
mybatisutil,closesqlsession(sqlsession);
}
for(user user:userlist){
logger.debug("testgetuserlist usercode:"+user.getusercode()+"and username:"+user.getusername());
}
}

resultmap

接下来说说resultmap,我们为什么要用resultmap呢?

用小编的话说:当我们要使用的查询映射语句是需要关联多表的时候,那么一个实体类的字段就不够用了,比如user表中有一个部门id,而部门id又对应了部门表,我们想查询部门名称而不是查询部门id,这时候我们就要在user实体类中加入一个部门名称属性,且该属性的类型为部门实体类,

到这我们就需要使用resultmap了

?
1
2
3
4
5
6
7
8
9
<select id="getuserlist" resultmap="user" parametertype="map">
select u.*,r.rolename from smbms_user u,smbms_role r
where u.username like concat('%',#{username},'%')
and u.userrole=#{userrole} and u.userrole=r.id
</select>
 
<resultmap id="userlist" type="user">
<result property="userrole" column="rolename"/>
</resultmap>

resultmap元素用来描述如何将结果集映射到java对象,此处使用resultmap对列表展示所需的必要字段来进行*映射。接下来看看resultmap元素的属性值和子节点吧

  • id属性:唯一标识符,此id值用于select元素resultmap属性的引用
  • type属性:表示该result的映射结果类型
  • result子节点:用于标识一些简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询出来的字段对应的值赋给实体对象的哪个属性。

mybatis中对查询进行select映射的时候,返回类型可以用resulttype,也可以用resultmap,那么resulttype和resultmap到底有何关联呢?接下里小编就做一下详细的讲解

resulttype

resulttype直接表示返回类型,包括基础数据库类型和复杂数据类型

resultmap

resultmap则是对外部resultmap定义的引用,对外部resultmap的id,表示返回结果映射到哪一个resultmap上,它的应用场景一般是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便*控制映射结果。

resulttype与resultmap的关联

在mybatis的select元素中,resulttype和resultmap本质上是一样的,都是map数据结构,但需要明确的一点:resulttype属性和resultmap属性绝对不能同时存在,只能二者选其一。

接下来说说使用mybatis实现增删改的操作,其实这几个操作都大同小异(小编认为的)。

insert

?
1
2
3
4
<insert id="add" parametertype="user">
insert into `smbms`.`smbms_user`(`usercode`, `username`, `userpassword`, `gender`, `birthday`, `phone`, `address`, `userrole`, `createdby`, `creationdate`)
values (#{usercode}, #{username}, #{userpassword}, #{gender}, #{birthday}, #{phone}, #{address}, #{userrole}, #{createdby}, #{creationdate})
</insert>

update

?
1
2
3
<update id="modify" parametertype="user">
update smbms_user set usercode=#{usercode} where id=#{uid}
</update>

delete

?
1
2
3
<delete id="del" parametertype="user">
delete from smbms_user where id=#{id}
</delete>

从上面的操作中可以看出其实这三种操作都差不多,其中的属性也都见过哈!那么小编在这就不多做介绍了,上面我所说的都是sql映射文件最基础的一些东西,后面还有动态sql之类的我在这就不做介绍了,感兴趣的童鞋可以去查查(我觉得阔以)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/MagicLoser/p/9927822.html