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

ssm框架 Mybatis 

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数据库表:

id name flower
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了。

 

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

mybatis mapper xml文件的导入方式和查询方式的更多相关文章

  1. MyBatis Mapper.xml文件中 $和#的区别

    MyBatis Mapper.xml文件中 $和#的区别   网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...

  2. mybatis mapper xml文件配置resultmap时,id行和result行有什么区别?

    mybatis mapper xml文件配置resultmap时,id行和result行有什么区别? <resultMap id = "CashInvoiceMap" typ ...

  3. MyBatis——Mapper XML 文件

    Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...

  4. 启动项目时,mapper.xml文件没有导入

    原因分析:绑定的statement没有发现,原因是只有mapper接口的java文件,没有xml文件 解决方法:需要在pom文件中进行配置 <!-- 如果不添加此节点mybatis的mapper ...

  5. 笔记:MyBatis Mapper XML文件详解 - 映射和参数

    MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...

  6. mybatis Mapper XML 文件

    MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...

  7. MyBatis Mapper XML 文件 的学习详解

    MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...

  8. 笔记:MyBatis Mapper XML文件详解 - Result Maps

    Result Maps(结果集) resultMap 元素是 MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许 ...

  9. 笔记:MyBatis Mapper XML文件详解 - Cache

    缓存(Cache) 从数据库中加载的数据缓存到内存中,是很多应用程序为了提高性能而采取的一贯做法.MyBatis对通过映射的SELECT语句加载的查询结果提供了内建的缓存支持.默认情况下,启用一级缓存 ...

随机推荐

  1. spring中aop事务

    一.事务 二.spring封装了事务管理代码 1.事务操作 2.事务操作对象 (1)因为在不同平台,操作事务的代码各不相同.spring提供了一个接口 (2) PlatformTransactionM ...

  2. Java输入输出流详解

    通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都统一抽象为数据流.Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为 ...

  3. Android逆向之smali

    Android逆向之smali 头信息 smail文件前三行 .class <访问权限> [关键修饰字] <类名>; .super <父类名>; .source & ...

  4. java基础-位运算符

    1.位运算符 << 左移 :            右边以0填充 >> 带符号右移:    负数前面补1,整数补0 >>>不带符号右移 & 按位与运算 ...

  5. 【接口时序】1、软件与Verilog基本格式规范说明

    一. 说明 以前总是没有记录的习惯,导致遇到问题时总得重新回忆与摸索,大大降低了学习效率,从今天开始决定改掉这个坏毛病,认真记录自己的Verilog学习之路,希望自己能一直坚持下去. 二. 软件资源与 ...

  6. Android开发 - 更"聪明"的申请权限方式

    在Android6.0以后,很多权限需要动态申请,只有在用户点同意后,我们才能使用对应API,因此,正确申请权限就显得很重要. 常用方式 通常我们使用这种方式来判断权限状态: private stat ...

  7. maya2015卸载/安装失败/如何彻底卸载清除干净maya2015注册表和文件的方法

    maya2015提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2015失败提示maya2015安装未完成,某些产品无法安装,也有时候想重新安装maya ...

  8. 如何设置 sass 全局变量,js如何使用 sass 变量

    关键词:sass全局变量 js引用sass变量 1 如何在样式中使用 scss 的声明的全局变量 假设我们有一个全局的 scss 变量文件/styles/_vars.sass,如下: $red: re ...

  9. Nginx 负载均衡与反向代理

    通过设置权重来轮询 weight server 192.168.1.62  weight=5 server 192.168.63 weight=1 ip_hash 第3方均衡策略 fair url_h ...

  10. Java匹马行天下之JavaSE核心技术——面向对象

    面向对象 注: 看此篇时强烈建议有一定的面向对象思想基础,有一定的基础后先翻到下面看第九条:      9.面向对象: 从未封装→封装→继承→多态→抽象类→接口的代码演变 按这个逻辑去看,,哪有不理解 ...