Mybatis核心组成部分之SQL映射文件揭秘详解
前言
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:映射查询语句
<!--根据用户名称查询用户列表(模糊查询)--> <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来实现,那代码就得换一下方式了
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文件
public interface usermapper { public list<user> getuserlist(map<string,string> usermap); }
从上面大家可以看到我用来一个集合来接受返回的结果集,并且传递的参数是一个user对象
下面再来编写usermapper.xml文件的主体内容
<!--查询用户列表(参数:对象入参)--> <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集合。
接下来就可以去测试了。
@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了
<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
<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
<update id="modify" parametertype="user"> update smbms_user set usercode=#{usercode} where id=#{uid} </update>
delete
<delete id="del" parametertype="user"> delete from smbms_user where id=#{id} </delete>
从上面的操作中可以看出其实这三种操作都差不多,其中的属性也都见过哈!那么小编在这就不多做介绍了,上面我所说的都是sql映射文件最基础的一些东西,后面还有动态sql之类的我在这就不做介绍了,感兴趣的童鞋可以去查查(我觉得阔以)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。