zoukankan      html  css  js  c++  java
  • mybatis mapper xml文件的导入方式和查询方式

    mybatis mapper xml文件的导入方式和查询方式

    mapper与SQLSession的关系

    每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的。通过SqlSessionFactory可以获得SQLSession实例,然后在其中完全包含了数据库执行SQL命令所需要的所有方法。

    SQLMapper是由一个Java接口和XML文件构成的,给出一定的SQL和映射规则。负责SQL的执行和返回结果。

    通过SQLSession获得Mapper映射器接口,然后执行SQL操作。

    mapper xml文件的导入方式

    根据文件相对地址导入

    例如:

    <mappers>
        <!-- 第一种引入方式 resource引入-->
        <mapper resource="com.weno.mapper/GirlMapper.xml"></mapper>
    </mappers>
    

    通过包导入

    如果有很多个mapper xml文件,一个一个去导入太麻烦了,这时候可以选择导入一个包,将包里面的Java接口文件全部导入。不过需要注意的点:文件名要相似:Girl.java和Girl.xml,同时文件目录结构要一样。

    <mappers>
        <!--第二种引入方式 通过包去引入-->
        <package name="com.weno.mapper"/>
    </mappers>
    

    这个是2种最常见的xml文件导入方式。

    Mybatis查询方式之参数传递

    假如此时有一个Girl数据库表:

    idnameflower
    17 xiaoai1 rose

    Girl java文件

    package com.weno.pojo;
    public class Girl {
        private int id;
        private String name;
        private String flower;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getFlower() {
            return flower;
        }
        public void setFlower(String flower) {
            this.flower = flower;
        }
    }
    

    传入一个参数

    1. java基本类型
      在映射文件中:
        <select id="queryByID" resultType="com.weno.pojo.Girl">
            select * from girl where id=#{id};
        </select>
    

    在Java文件中,映射方法:

    Girl queryByID(int id);
    

    传入多个参数

    1. java基本对象
      在映射文件中
       <select id="queryByGirl" resultType="com.weno.pojo.Girl">
            select * from girl where id=#{id};
            <!-- 会自动调用getID()函数去获取ID -->
        </select>
    

    在Java文件中,映射方法:

    Girl queryByID(Girl g);
    

    在测试文件中

        Girl g = new Girl();
        g.setId(17);
        // 可以加多个set
        Girl girl = mapper.queryByGirl(g);
    
    1. Map传递参数
      在映射文件中
     <select id="queryByGirl1" resultType="com.weno.pojo.Girl">
            select * from girl WHERE id=#{id};
        </select>
    <!-- 其中id要跟Map里面的key一样 -->
    

    在Java文件中,映射方法:

    Girl queryByGirl1(Map<String,Object> map);
    

    在测试文件中

        Map<String,Object> map= new HashMap<String, Object>();
        map.put("id",17);
        // id对应xml文件中的id
        Girl girl=mapper.queryByGirl1(map);
    
    1. @Param传递参数

    在映射文件中

     <select id="queryByGirl2" resultType="com.weno.pojo.Girl">
            select * from girl WHERE id=#{id} and flower=#{flower};
        </select>
    

    在Java文件中,映射方法:

        Girl queryByGirl2(int id,String flower);
    

    测试文件

        GirlMapper mapper = sqlSession.getMapper(GirlMapper.class);
        Girl girl=mapper.queryByGirl2(17,"rose");
    

    如果这时候运行,则会报错

    org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
    ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
    

    大概意思就是,mapper方法的参数绑定异常。

    原因:
    这个异常的产生原因是因为,当mapper接口方法有多个参数时,java不会保存行参的记录,java在运行的时候会把方法中的参数(int id,String flower)变成这样:(int arg0,String arg1),这样我们就没有办法去传递多个参数(注意,在多个参数时才会发生)

    解决方法:
    3.1 将参数映射文件中的参数改为

     <select id="queryByGirl2" resultType="com.weno.pojo.Girl">
            select * from girl WHERE id=#{0} and flower=#{1};
        </select>
    

    或者将参数改为param1和param2

    <select id="queryByGirl2" resultType="com.weno.pojo.Girl">
            select * from girl WHERE id=#{param1} and flower=#{param2};
        </select>
    

    这两个没什么区别,只不过一个是从0开始,有个是从1开始罢了。

    3.2 使用@param
    尽管上面的的方法能够解决这个问题,但是显而易见,这个不符合程序的设计理念,因为阅读代码的时候没办法马上理解内容。所以可以使用@Param解决这个问题。

    映射方法

    Girl queryByGirl3(@Param("id") int id,@Param("flower")String flower);
    

    映射文件

        <select id="queryByGirl3" resultType="com.weno.pojo.Girl">
            select * from girl WHERE id=#{id} and flower=#{flower};
        </select>
    

    这样就可以开开心心的使用我的flower了。

     


     

     

    至于使用哪一个,那就看具体情况,哪一个方便就使用哪一个了。

  • 相关阅读:
    利用相关的Aware接口
    java 值传递和引用传递。
    权限控制框架Spring Security 和Shiro 的总结
    优秀代码养成
    Servlet 基础知识
    leetcode 501. Find Mode in Binary Search Tree
    leetcode 530. Minimum Absolute Difference in BST
    leetcode 543. Diameter of Binary Tree
    leetcode 551. Student Attendance Record I
    leetcode 563. Binary Tree Tilt
  • 原文地址:https://www.cnblogs.com/xiaohuiduan/p/9867666.html
Copyright © 2011-2022 走看看