前言
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