• Mybatis的核心组成部分-SQL映射文件揭秘


    Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单,我上篇文章语句讲了Mybatis的搭建以及核心配置的讲解,接下来咱们就一起来看看Mybatis另一个重要的元素-SQL映射文件
    首先先介绍一下SQL映射文件的几个顶级元素配置

    顶级元素配置

    • Mapper:映射文件的根元素节点,只有一个属性namespace(命名空间),其作用如下
      • 用于区分不同的mapper,全局唯一
      • 绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,就可以不用写该接口的实现类,Mybatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL语句。因此namespace的命名必须要跟接口名同名
    • cache:配置给定命名空间引用缓存。
    • cache-ref:从其他命名空间引用缓存配置
    • resultMap:用来描述数据库结果集和对象的对象关系(键值对)
    • sql:可以重用的sql块,也可以被其他语句引用。
    • insert:映射插入的语句
    • update:映射更新的语句
    • delete:映射删除的语句
    • 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之类的我在这就不做介绍了,感兴趣的童鞋可以去查查(我觉得阔以),ok,以上就是本章所介绍的,感谢大家的观赏!

  • 相关阅读:
    基于策略模式简单实现element表单校验
    跨域
    原型模式
    单例模式
    vue-router进阶篇
    vue-router
    h5深度剖析
    js同步异步,任务队列
    JavaScript中事件委托(事件代理)详解
    网络请求get和post的区别
  • 原文地址:https://www.cnblogs.com/MagicLoser/p/9927822.html
Copyright © 2020-2023  润新知