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了。

     


     

     

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

  • 相关阅读:
    wapp HTTP Error 404. The requested resource is not found.
    JS 动态修改json字符串
    使用VS2017新建的Web项目报错:Package Microsoft.Composition 1.0.27 is not compatible with netcoreapp1.1
    java park unpark
    DOUHAO
    Thread dump
    线程状态
    https://stackoverflow.com/questions/20795295/why-jstack-out-says-thread-state-is-runnable-while-socketread
    rocketmq-flink
    the-implementation-of-epoll
  • 原文地址:https://www.cnblogs.com/xiaohuiduan/p/9867666.html
Copyright © 2011-2022 走看看