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

 更新时间:2018年11月11日 11:44:38   作者:DearLoser  
MyBatis真正的力量是在映射语句中,下面这篇文章主要给大家介绍了关于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之类的我在这就不做介绍了,感兴趣的童鞋可以去查查(我觉得阔以)

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

相关文章

  • Java中实现String字符串分割的3种方法

    Java中实现String字符串分割的3种方法

    这篇文章主要介绍了Java中实现String字符串分割的3种方法,文章底部介绍了JAVA 截取字符串的三种方法subString,StringUtils,split,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Kotlin内存陷阱inline使用技巧示例详解

    Kotlin内存陷阱inline使用技巧示例详解

    这篇文章主要为大家介绍了Kotlin内存陷阱inline使用技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • SpringBoot进行多表查询功能的实现

    SpringBoot进行多表查询功能的实现

    这篇文章主要介绍了SpringBoot进行多表查询功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • SpringBoot集成EasyExcel的步骤

    SpringBoot集成EasyExcel的步骤

    EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。主要解决方式:通过解压文件的方式加载,一行一行的加载,并且抛弃样式字体等不重要的数据,降低内存的占用。
    2021-06-06
  • Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)

    Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)

    这篇文章主要介绍了Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Mybatis中连接查询和嵌套查询实例代码

    Mybatis中连接查询和嵌套查询实例代码

    这篇文章主要给大家介绍了关于Mybatis中连接查询和嵌套查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java中基于maven实现zxing二维码功能

    Java中基于maven实现zxing二维码功能

    这篇文章主要介绍了Java中基于maven实现zxing二维码功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • mybatis+springboot发布postgresql数据的实现

    mybatis+springboot发布postgresql数据的实现

    本文主要介绍了mybatis+springboot发布postgresql数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Java网络编程TCP实现聊天功能

    Java网络编程TCP实现聊天功能

    这篇文章主要为大家详细介绍了Java网络编程TCP实现聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • java中this的n种使用方法

    java中this的n种使用方法

    this可能是几乎所有有一点面向对象思想的语言都会引用到的变量,this有多少种用法。下面小编给大家带来了java中this的n种使用方法,感兴趣的朋友一起看看吧
    2018-08-08

最新评论